从一个TIBLE创建单独的绘图,并将每个绘图分别保存在R中

从一个TIBLE创建单独的绘图,并将每个绘图分别保存在R中,r,loops,ggplot2,purrr,R,Loops,Ggplot2,Purrr,我是R的新手,事实上这是我在SO上的第一篇帖子。抱歉,如果我的描述和布局不理想-欢迎所有反馈 我的问题是,我想从数据的tibble中创建单独的图,其中每个图针对不同的国家,但具有相同的变量。然后我想将每个绘图单独保存为png 我最熟悉的是tidyverse和ggplot来整理数据,然后将其可视化。我创建了一个TIBLE,它有4个变量的32454个观测值。数据包括200个不同的国家。我希望为每个国家、每个变量(Gov_bal、Priv_bal、Ext_bal)创建单独的geom_bar图。我希望对

我是R的新手,事实上这是我在SO上的第一篇帖子。抱歉,如果我的描述和布局不理想-欢迎所有反馈

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

我最熟悉的是
tidyverse
ggplot
来整理数据,然后将其可视化。我创建了一个TIBLE,它有4个变量的32454个观测值。数据包括200个不同的国家。我希望为每个国家、每个变量(Gov_bal、Priv_bal、Ext_bal)创建单独的
geom_bar
图。我希望
对每年每个变量的值进行堆叠
,然后通过
填充
来识别它们

我看了这里这里,这里,但我没有能够实现我想要的

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

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")
我还知道,我可以使用
facet\u wrap
按“国家”显示所有绘图,但我想单独保存每个绘图

library(tidyverse)

sect_balances %>%
  group_split(Country) %>%
  map(~ggplot(.x) + aes(x = Year, y = Value, fill = Sector) +
      geom_bar(position = "stack", stat = "identity") +
      labs(x = "Year",
           y = "Per cent of GDP",
           title = first(.x$Country)) +
      theme_classic()) -> list_plot
我的问题是,我希望创建一个循环或其他解决方案,在不同的国家循环,并创建单独的
geom_bar
图。因此,对于我上面的数据示例,我需要一个代码,该代码创建三个独立的
geom_bar
绘图(例如,“澳大利亚”、“美国”、“英国”各一个),然后分别保存每个绘图。显然,对于我的实际数据,我需要一个代码,可以为200个不同的国家做到这一点

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

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() 
}
for(我在国内){

country\u id这里有一种方法,我们制作一个
ggplot
对象,然后使用
ggforce::facet\u wrap\u paginate
在各个国家循环打印结果

library(tidyr)
library(dplyr)
library(ggplot2)
library(ggforce)

p = sect_balances %>%  
  ggplot(aes(x = Year, y = Value, fill = Sector)) +
  geom_bar(position = "stack", stat = "identity") +
  labs(x = "Year",
       y = "Per cent of GDP")

uni_country = sort(unique(sect_balances$Country))

for (i in seq_along(uni_country)) {
  print(p + 
    facet_wrap_paginate(facets = ~Country, 1, 1, page = i) + 
    ggsave(paste0("my_plot_", uni_country[i], ".png")))
}

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


plot\u country如果要单独绘制每个国家,而不是使用
for
循环,可以将数据拆分为数据帧列表,并单独绘制每个国家

library(tidyverse)

sect_balances %>%
  group_split(Country) %>%
  map(~ggplot(.x) + aes(x = Year, y = Value, fill = Sector) +
      geom_bar(position = "stack", stat = "identity") +
      labs(x = "Year",
           y = "Per cent of GDP",
           title = first(.x$Country)) +
      theme_classic()) -> list_plot
list\u plot
具有绘图列表,您可以通过
list\u plot[[1]]
list\u plot[[2]]
等方式单独访问其中的每一个

如果要将它们保存为设备上的单独绘图,可以在代码中添加额外的
ggsave
命令,如下所示:

sect_balances %>%
  group_split(Country) %>%
  map(~{ggplot(.x) + aes(x = Year, y = Value, fill = Sector) +
        geom_bar(position = "stack", stat = "identity") +
        labs(x = "Year",
             y = "Per cent of GDP",
             title = first(.x$Country)) +
        theme_classic() -> plot
      ggsave(paste0(first(.x$Country), '_plot.png'), plot)
      })

感谢@Vincent的快速响应。您的代码运行得非常好-谢谢。但是,当我将其应用到实际数据集中时,我得到了错误“error in unique(Country):object'Country'not found”。我想知道这是否是因为在我的数据集中“Country”变量已被解析为字符?有什么想法吗?在这里,它起作用是因为您将
Country
定义为它自己的向量。我猜您必须使用
unique(sect_$Country)修改代码
从数据集的实际列中检索国家缩写。我编辑了示例以反映这一点。哇,你完全正确@RonakShah。我需要休息一下;)感谢@Cole的快速响应。你的代码工作正常(也就是说,我没有收到任何错误,但是我看不到它创建的绘图。而且它也没有将它们保存在任何地方。
facet\u wrap\u paginate
看起来像是一个有趣的工具。你能用它单独保存绘图吗?我验证并使用了
ggsave()
有效。注意,因为刻面按字母顺序排列,所以我对
uni_country
进行了排序,以便您可以在保存的文件中包含国家名称。编辑:我还看到您没有看到任何绘图。它似乎在某个点起作用,但我不再确定。我会在找到修复后编辑帖子。谢谢,我会再看一看您的解决方案,但@Vincent对我有效。谢谢您抽出时间来帮助我