我是 R 新手,事实上这是我关于 R 的第一篇文章。如果我的描述和布局不理想,我们深表歉意 - 欢迎所有反馈。
我的问题是,我想从数据的tibble
创建单独的图,其中每个图针对不同的国家,但具有相同的变量。然后我想将每个图单独保存为 png。
我最熟悉的是 tidyverse
和 ggplot
来整理数据,然后将其可视化。我创建了一个 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 个不同国家/地区执行此操作的代码。
我已经尝试过这段代码,但说实话,我对函数 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()
}
我不记得在哪里找到了我调整的这段代码,但不幸的是它不能解决我的问题。
非常感谢
最佳答案
无需求助于 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
编程”小插图中进行了描述:
关于r - 从一个小标题创建单独的图并将每个图单独保存在 R 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65030723/