访问ggtitle中的绘图数据

时间:2018-04-03 13:49:13

标签: r ggplot2 ggtitle

我想知道是否可以以某种方式访问​​标题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!");

它说奥迪会在单一地块中打印所有制造商。

2 个答案:

答案 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))

enter image description here

这个想法是使用带有空条背景的构面。如果有更多的名称或变量,则必须使用例如创建额外的分面变量。 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非常棒的其他任何酷炫的东西。