r - 从一个小标题创建单独的图并将每个图单独保存在 R 中

标签 r loops ggplot2 purrr

我是 R 新手,事实上这是我关于 R 的第一篇文章。如果我的描述和布局不理想,我们深表歉意 - 欢迎所有反馈。

我的问题是,我想从数据的tibble创建单独的图,其中每个图针对不同的国家,但具有相同的变量。然后我想将每个图单独保存为 png。

我最熟悉的是 tidyverseggplot 来整理数据,然后将其可视化。我创建了一个 tibble,其中包含 4 个变量的 32,454 个观察值。该数据包含 200 个不同国家。我希望为每个国家/地区的每个变量(Gov_bal、Priv_bal、Ext_bal)创建单独的 geom_bar 图。我希望堆叠每年每个变量的值,然后通过fill来识别它们。

我看过这里https://stats.stackexchange.com/questions/19213/generate-separate-plots-for-each-group-of-records-in-dataset;在这里Save multiple ggplots using a for loop在这里Plot one histogram(separate) for each variable in the column但我一直没能实现我想要的。

这是我的数据示例。我确信有更好的方法可以复制它,但这就是它的要点。

Country <- c("Aus", "Aus", "Aus", "Aus", "USA", "USA", "USA", "USA", "UK", "UK", "UK", "UK")
Year <- c("1990", "1991", "1992", "1993", "1990", "1991", "1992", "1993", "1990", "1991", "1992", "1993")
Gov_bal <- c(5, 6, 5, 8, 8, 9, 5, 4, 6, 7, 4, 8)
Priv_bal <- c(3, 5, 4, 2, 6, 8, 5, 3, 2, 3, 6, 5)
Ext_bal <- c(2, -1, -2, 4, 5, 1, 3, 7, 4, 2, 3, 1)

sect_balances <- data.frame(Country, Year, Gov_bal, Priv_bal, Ext_bal)

sect_balances <- sect_balances %>% pivot_longer(Gov_bal:Ext_bal, names_to = "Sector", values_to = "Value")

我想要的每个国家的情节如下所示。 (我已使用 filter(Country == "Aus") 为本示例选择一个国家/地区,但我想要一个可以自动为我执行此操作的函数/解决方案。)

sect_balances %>% filter(Country == "Aus") %>% 
  ggplot(aes(x = Year, y = Value, fill = Sector)) +
  geom_bar(position = "stack", stat = "identity") +
    labs(x = "Year",
         y = "Per cent of GDP",
         title = "Australia") +
  theme_classic()

我还知道我可以使用 facet_wrap 按“国家/地区”显示所有绘图,但我想单独保存每个绘图。

我的问题是我希望创建一个循环或其他一些解决方案来循环不同的国家/地区并创建单独的geom_bar图。因此,对于上面的数据示例,我需要一个代码来创建三个单独的 geom_bar 图(例如,“澳大利亚”、“美国”、“英国”各一个),然后单独保存每个图。显然,对于我的实际数据,我想要一个可以为 200 个不同国家/地区执行此操作的代码。

我已经尝试过这段代码,但说实话,我对函数 loopmap 不太了解。我需要多读一些书,但任何帮助都会很棒。

for (i in Country) {
  country_id <- subset(sect_balances, Country == i) 
  p <- ggplot(country_id, aes(x = Year, y = Value)) + geom_bar(position = "stack",
                                                               stat = "identity") 
  png(paste("plot_", i, ".png", sep = ""), width = 600, height = 500, res = 120) 
  print(p) 
  dev.off() 
}

我不记得在哪里找到了我调整的这段代码,但不幸的是它不能解决我的问题。

非常感谢

最佳答案

无需求助于 ggforce 等其他软件包,您可以编写一个函数来绘制并保存单个国家/地区的图表,如下所示:

plot_country <- function(x = "Aus") {
  tmp <- sect_balances %>%
         filter(Country == x)
  p <- ggplot(tmp, aes(x = Year, y = Value, fill = Sector)) +
       geom_bar(position = "stack", stat = "identity") +
       labs(x = "Year", y = "Per cent of GDP", title = x) +
       theme_classic()
  ggsave(p, file=paste0(x, ".png"))
}

然后循环国家/地区名称:

for (k in unique(sect_balances$Country)) {
  plot_country(k)
}

拥抱运算符在“使用dplyr编程”小插图中进行了描述:

https://dplyr.tidyverse.org/articles/programming.html

关于r - 从一个小标题创建单独的图并将每个图单独保存在 R 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65030723/

相关文章:

r - 预测事件何时发生

r - 如何访问和编辑Rprofile?

具有字符变量的 R 比例函数

loops - SAS中嵌套道循环的解释

linux - bash 脚本运行各种 openssl 密码来解密文件

r - 向分组箱线图添加线条

r - 使用 dplyr 窗口函数计算百分位数

java - boolean While 循环设置为 true,设置为 false 时不会停止

r - 如何在没有坐标极的情况下制作堆积圆图

r - 为 stat_density2d 图手动设置 scale_alpha