我想知道是否有可能为标题访问ggplot2图中提供的数据的列。所以类似的事情:
ggplot(mpg %>% filter(manufacturer == 'audi'),
aes(x = hwy, y = displ, label = model)) +
geom_point() +
geom_text(data = . %>% filter(hwy > 28)) +
ggtitle(unique(.$manufacurer))我经常创建像上面的例子中的图,只绘制子集,并且喜欢自动标记子集。目前,.不会在ggtitle中得到认可,但在geom_text内部它正在发挥作用。
编辑:
由于我收到了来自@Brian的非常好的评论,并将其标记为“复制”,那么在{}函数中使用这个dplyr::group_by技巧是否有解决方案呢?不知何故这不起作用。我很想为每个组创建单独的情节,但不知怎么的,只有完整的数据框架才能进入ggplot调用。
mpg %>%
group_by(manufacturer) %>% {
ggplot(., aes(cyl, displ, color=manufacturer)) +
geom_point() +
ggtitle(unique(.$manufacturer))
}它说奥迪,但打印所有的制造商在单一的情节。
发布于 2018-04-03 14:49:42
我会尝试以下方法,因为不可能在aes()之外进行管道传输。
ggplot(mpg %>% filter(manufacturer == 'audi'),
aes(x = hwy, y = displ, label = model)) +
geom_point() +
geom_text(data = . %>% filter(hwy > 28)) +
facet_wrap(~manufacturer)+
theme(strip.background = element_blank(),
strip.text = element_text(hjust = 0, size = 14))

这个想法是使用一个带空条形背景的面。如果有更多的名称或变量,就必须使用例如mutate(gr = "title")创建一个额外的faceting变量
mpg %>%
mutate(title="This is my plot") %>%
ggplot(aes(x = hwy, y = displ, col=manufacturer)) +
geom_point() +
facet_wrap(~title)+
theme(strip.background = element_blank(),
strip.text = element_text(hjust = 0, size = 14))编辑
当您问到第二个问题时,这里有两个解决方案,用于为每个组创建单独的地块。
# first solution
p <- mpg %>%
group_by(manufacturer) %>%
do(plots= ggplot(., aes(cyl, displ)) +
geom_point() +
ggtitle(unique(.$manufacturer))
)
p %>% slice(1) %>% .$plots
# second solution
mpg %>%
nest(-manufacturer) %>%
mutate(plot = map2(data, manufacturer, ~ggplot(data=.x,aes(cyl, displ))+
geom_point() +
ggtitle(.y))) %>%
slice(1) %>% .$plot 或使用
map2(paste0(p$manufacturer, ".pdf"), p$plots, ggsave)发布于 2018-04-04 14:27:12
这里有两种使用split的方法。您可以使用split根据变量将数据分割成一个命名的数据列表。因此,调用split(mpg, .$manufacturer)会给出一个数据列表,其中每个数据都与制造商相关联,例如,split_df$audi是奥迪所做的所有观察的数据。
library(dplyr)
library(purrr)
library(ggplot2)
split_df <- split(mpg, .$manufacturer)首先,您可以这样做,只需对列表中的单个项调用ggplot即可。由于列表是命名的,names(split_df)[1]将给您命名"audi“。
ggplot(split_df[[1]], aes(x = hwy, y = displ, label = model)) +
geom_point() +
geom_text(data = . %>% filter(hwy > 28)) +
ggtitle(names(split_df)[1])

这有点麻烦,特别是如果你想要多家制造商的地块。当我这样做时,我使用了来自purrr的映射函数。真正酷的是imap,它同时映射列表及其名称。在这里,我通过对数据列表的映射来创建一个地块列表;每个地块都从列表项的名称中获得一个标题。
plots <- imap(split_df, function(df, manufacturer) {
ggplot(df, aes(x = hwy, y = displ, label = model)) +
geom_point() +
geom_text(data = . %>% filter(hwy > 28)) +
ggtitle(manufacturer)
})
plots$audi

然后我就可以从这个情节清单中找出一个特定的项目。如果您需要使用walk对其进行映射并保存每个绘图或绘图子集,或者需要使用grid函数将它们安排为输出,或者purrr非常适合的任何其他酷功能,这也非常方便。
发布于 2022-09-01 20:34:56
回答关于按变量分组以生成图解的后续操作。我不知道如何做到这一点,也不知道group_by(foo) %>% ggplot()调用的输出是什么(一个一个地生成图)。存起来?把它们堆成一大片吗?)
您可以尝试的一种方法是通过lapply()。在从调用中访问数据的解决方案的基础上:
library(dplyr)
library(ggplot2)
mfgs <- mpg %>% pull(manufacturer) %>% unique()
plot_list <- lapply(mfgs, function(mfg) {
mpg %>%
filter(manufacturer == mfg) %>% {
ggplot(., aes(cyl, displ, color=manufacturer)) +
geom_point() +
ggtitle(unique(.$manufacturer))
}
})从这里,您可以使用plot_list[[i]]访问给定的地块,或者(a)传递一个命名向量而不是定义的mfgs,或者将列表的名称设置为制造商提供的向量,这允许您按名称调用绘图:
names(plot_list) <- mfgs
plot_list[["nissan"]]希望这能有所帮助。
https://stackoverflow.com/questions/49631795
复制相似问题