首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ggtitle中访问地块的数据

在ggtitle中访问地块的数据
EN

Stack Overflow用户
提问于 2018-04-03 13:49:12
回答 3查看 2K关注 0票数 9

我想知道是否有可能为标题访问ggplot2图中提供的数据的列。所以类似的事情:

代码语言:javascript
复制
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调用。

代码语言:javascript
复制
mpg %>%
  group_by(manufacturer) %>% {
    ggplot(., aes(cyl, displ, color=manufacturer)) +
      geom_point() + 
      ggtitle(unique(.$manufacturer))
  }

它说奥迪,但打印所有的制造商在单一的情节。

EN

回答 3

Stack Overflow用户

发布于 2018-04-03 14:49:42

我会尝试以下方法,因为不可能在aes()之外进行管道传输。

代码语言:javascript
复制
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变量

代码语言:javascript
复制
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))

编辑

当您问到第二个问题时,这里有两个解决方案,用于为每个组创建单独的地块。

代码语言:javascript
复制
# 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 

或使用

代码语言:javascript
复制
map2(paste0(p$manufacturer, ".pdf"), p$plots, ggsave)
票数 3
EN

Stack Overflow用户

发布于 2018-04-04 14:27:12

这里有两种使用split的方法。您可以使用split根据变量将数据分割成一个命名的数据列表。因此,调用split(mpg, .$manufacturer)会给出一个数据列表,其中每个数据都与制造商相关联,例如,split_df$audi是奥迪所做的所有观察的数据。

代码语言:javascript
复制
library(dplyr)
library(purrr)
library(ggplot2)

split_df <- split(mpg, .$manufacturer)

首先,您可以这样做,只需对列表中的单个项调用ggplot即可。由于列表是命名的,names(split_df)[1]将给您命名"audi“。

代码语言:javascript
复制
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,它同时映射列表及其名称。在这里,我通过对数据列表的映射来创建一个地块列表;每个地块都从列表项的名称中获得一个标题。

代码语言:javascript
复制
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非常适合的任何其他酷功能,这也非常方便。

票数 1
EN

Stack Overflow用户

发布于 2022-09-01 20:34:56

回答关于按变量分组以生成图解的后续操作。我不知道如何做到这一点,也不知道group_by(foo) %>% ggplot()调用的输出是什么(一个一个地生成图)。存起来?把它们堆成一大片吗?)

您可以尝试的一种方法是通过lapply()。在从调用中访问数据的解决方案的基础上:

代码语言:javascript
复制
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,或者将列表的名称设置为制造商提供的向量,这允许您按名称调用绘图:

代码语言:javascript
复制
names(plot_list) <- mfgs
plot_list[["nissan"]]

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49631795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档