我想知道是否可以以某种方式访问标题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))
}
调用。
MessageBox.Show("Attach process to debugger and click ok!");
它说奥迪会在单一地块中打印所有制造商。
答案 0 :(得分:1)
我会尝试以下操作,因为无法在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")
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)
答案 1 :(得分:0)
以下是使用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
非常棒的其他任何酷炫的东西。