【问题标题】:Plotting multiple graphs in R [closed]在R中绘制多个图[关闭]
【发布时间】:2018-10-20 04:19:10
【问题描述】:

所以我想同时为每个地方绘制多个图,y 轴上的访问次数和 x 轴上的天数,但我不确定是否有函数可以做到这一点?

所以我可以通过对地点 A 进行子集化来为地点 A 绘制图:

placeA <- subset(df$place=="A")

ggplot(data=placeA, aes(x=Day, y=Num_OfVisits, group=1)) +
  geom_line(color="#00AFBB", size=0.5) +
  theme(axis.text.x=element_text(angle=90,hjust=1, size=5))

但是现在我想为其他地方生成一个图,我希望我可以一次完成所有这些,因为我的数据集上有大约 1000 个地方,并且子集需要一些时间。任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 请不要发布代码/数据/错误的图像,只发布文本本身。几个原因是直接的:我无法将图像中的代码或数据复制到我的 R 控制台并尝试一下,并且我选择不手动转录它。一些原因不太明显但仍然很重要,包括:它会破坏屏幕阅读器hard;搜索引擎不阅读它们,因此搜索不会找到它;移动设备的屏幕尺寸可能是一个限制因素。参考:meta.stackoverflow.com/a/285557/3358272
  • 对不起。我正在尝试这样做,但格式不好,所以我决定上传一张照片。
  • dput(x) 效果很好。 dput(head(x,n=10)) 如果数据是“大”。

标签: r ggplot2


【解决方案1】:

您可以编写一个函数,将数据框和Place 作为输入,然后遍历Place 列中的所有值以创建相应的图。

library(tidyverse)

df <- data_frame(
  Place = c(rep(c("A", "B", "C"), each = 3)),
  Num_of_Visits = seq(1:9),
  Day = rep(c("Sunday", "Monday", "Tuesday"), 3)
)

df <- df %>% 
  mutate(Day = factor(Day, levels = c("Sunday", "Monday", "Tuesday")))

my_plot <- function(df, myvar) {      
  ggplot(data = df %>% filter(Place == myvar), 
         aes(x = Day, y = Num_of_Visits, group = 1)) +
    geom_line(color = "#00AFBB", size = 0.5) +
    theme(axis.text.x = element_text(angle = 90, vjust = 0.5))      
}

# test
my_plot(df, 'A')

循环通过Place var,创建绘图并将它们存储在使用purrr::map()的列表中

plot_list <- unique(df$Place) %>% 
  purrr::set_names() %>% 
  purrr::map( ~ my_plot(df, .x))
str(plot_list, max.level = 1)
#> List of 3
#>  $ A:List of 9
#>   ..- attr(*, "class")= chr [1:2] "gg" "ggplot"
#>  $ B:List of 9
#>   ..- attr(*, "class")= chr [1:2] "gg" "ggplot"
#>  $ C:List of 9
#>   ..- attr(*, "class")= chr [1:2] "gg" "ggplot"

使用purrr::walk()显示所有绘图

purrr::walk(plot_list, print)

使用purrr::iwalk()将所有绘图保存到PNG文件

purrr::iwalk(plot_list,
             ~ ggsave(plot = .x,
                      filename = paste0("Plot_", .y, ".png"),
                      type = 'cairo', width = 6, height = 6, dpi = 150)
)

如果需要,使用 cowplot::plot_grid() 将所有情节组合在一起

library(cowplot)
do.call(plot_grid, c(plot_list, 
                     align = "h",
                     axis = 'tb',
                     ncol = 3))

reprex package (v0.2.1.9000) 于 2018 年 10 月 19 日创建

【讨论】:

  • 谢谢!只有一个地方立即工作,但多个地方似乎让 R 停止响应,因为 R 花了 45 分钟才打开停止标志,当停止标志消失时,它没有说错误消息,但有也没有生成任何情节。
  • 这适用于 R 3.5.1 和最新的 tidyverse 包。你可能需要更新你的
  • 我有最新的 R 软件和 tidyverse 包。在“walk(plot_list,print)”之后出现此错误。我得到的错误是 geom_path: 每组只包含一个观察。需要调整群体审美吗? grid.Call.graphics 中的错误(C_setviewport,vp,TRUE):视口的位置和/或大小不限
  • 确保你有和我一样的变量名 (Num_of_visits)。如果您不提供数据样本,就很难提供帮助。您应该将dput(df) 的输出添加到您的问题中。在此处查看更多信息stackoverflow.com/questions/5963269/… & speakerdeck.com/jennybc/reprex-help-me-help-you?slide=5
  • @yiyle:在运行代码之前尝试重新启动 R/RStudio,以确保与其他包没有任何冲突
猜你喜欢
  • 2018-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-28
  • 2021-03-15
  • 2015-12-06
  • 1970-01-01
相关资源
最近更新 更多