You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用ggplot的facet_wrap将州分组的县时序图合并为单图?

按州分组绘制县数值时间变化图的分面问题解决

我正在绘制不同县的数值随时间变化的图表,希望按州(st字段)对县进行分组。尝试用facet_wrap(~st)实现分组,但结果被拆分成多个独立图像。想知道能不能通过设置facet_wrap的参数,把这些分面保留在同一图像里,实现类似目标图的分组效果。

原代码

ggplot(lg1, aes(x=decade,y=fips,fill=cat_total)) +
  geom_raster() + scale_fill_gradient(low="white", high="red", guide="colorbar") +
  facet_wrap(~st)

数据样本

structure(list(decade = structure(c(8L, 13L, 1L, 1L, 8L, 4L, 
6L, 7L, 6L, 8L, 8L, 9L, 13L, 1L, 6L, 10L, 4L, 7L, 7L, 10L, 2L, 
11L, 13L, 9L, 13L, 5L, 2L, 1L, 6L, 1L, 5L, 2L, 10L, 11L, 12L, 
2L, 4L, 9L, 12L, 5L, 7L, 8L, 6L, 10L, 5L, 2L, 12L, 13L, 13L, 
4L, 9L, 12L, 7L, 4L, 4L, 4L, 8L, 12L, 2L, 3L, 11L, 3L, 11L, 13L, 
10L, 12L, 8L, 13L, 9L, 13L, 3L, 11L, 13L, 8L, 4L, 5L, 11L, 10L, 
12L, 1L, 10L, 5L, 5L, 2L, 7L, 10L, 2L, 7L, 10L, 7L, 12L, 2L, 
10L, 3L, 9L, 2L, 11L, 4L, 9L, 6L), levels = c("1900s", "1910s", 
"1920s", "1930s", "1940s", "1950s", "1960s", "1970s", "1980s", 
"1990s", "2000s", "2010s", "2020s"), class = "factor"), fips = c("54091", 
"47161", "55073", "22053", "21035", "55007", "42071", "17005", 
"29039", "37145", "21001", "22127", "39001", "48173", "29107", 
"55005", "05047", "55003", "37197", "19125", "51117", "39097", 
"05115", "54041", "42091", "47181", "55045", "26081", "21197", 
"23005", "18173", "10001", "26067", "48111", "37073", "18117", 
"48341", "28077", "39145", "24023", "40015", "45053", "20205", 
"29179", "36025", "19113", "29223", "36047", "17013", "17101", 
"18135", "48173", "20121", "13101", "01117", "01007", "42005", 
"54059", "29119", "01007", "29227", "40057", "48257", "13201", 
"13229", "21031", "24017", "22113", "23001", "47103", "29001", 
"25021", "21179", "39075", "48227", "19057", "13089", "48235", 
"01019", "39043", "20021", "01037", "42077", "24029", "13233", 
"21157", "51047", "25025", "54061", "29181", "17145", "51073", 
"39127", "13301", "13195", "20135", "13081", "21169", "18163", 
"42061"), cat_total = c(51, 9, 17, 35, 48, 7, 46, 31, 27, 60, 
53, 30, 10, 22, 21, 11, 35, 10, 56, 12, 33, 47, 6, 35, 10, 44, 
17, 26, 54, 25, 38, 27, 22, 23, 60, 29, 16, 36, 50, 38, 19, 83, 
24, 26, 33, 13, 41, 9, 7, 35, 31, 20, 18, 61, 52, 51, 46, 56, 
22, 28, 26, 10, 42, 11, 49, 50, 53, 7, 25, 10, 13, 41, 11, 36, 
23, 15, 63, 15, 58, 34, 21, 52, 38, 27, 61, 30, 31, 43, 35, 34, 
40, 31, 33, 33, 48, 11, 64, 43, 34, 43), st = c("54", "47", "55", 
"22", "21", "55", "42", "17", "29", "37", "21", "22", "39", "48", 
"29", "55", "05", "55", "37", "19", "51", "39", "05", "54", "42", 
"47", "55", "26", "21", "23", "18", "10", "26", "48", "37", "18", 
"48", "28", "39", "24", "40", "45", "20", "29", "36", "19", "29", 
"36", "17", "17", "18", "48", "20", "13", "01", "01", "42", "54", 
"29", "01", "29", "40", "48", "13", "13", "21", "24", "22", "23", 
"47", "29", "25", "21", "39", "48", "19", "13", "48", "01", "39", 
"20", "01", "42", "24", "13", "21", "51", "25", "54", "29", "17", 
"51", "39", "13", "13", "20", "13", "21", "18", "42"), fips_total = c(497, 
505, 148, 439, 491, 118, 487, 367, 305, 604, 534, 440, 494, 233, 
254, 126, 373, 121, 607, 187, 593, 444, 392, 512, 489, 542, 198, 
263, 531, 350, 468, 515, 274, 148, 594, 456, 172, 518, 505, 491, 
275, 695, 279, 379, 410, 192, 409, 465, 331, 434, 409, 233, 260, 
695, 598, 591, 453, 555, 333, 591, 195, 245, 344, 675, 698, 510, 
533, 451, 343, 576, 237, 413, 506, 436, 230, 233, 648, 250, 615, 
388, 308, 622, 474, 510, 623, 481, 537, 410, 485, 413, 407, 560, 
465, 674, 655, 170, 683, 530, 463, 468)), class = "data.frame", row.names = c(NA, 
-100L))

解决方法

facet_wrap默认会根据分面数量自动排列,但出现分面拆分通常是因为绘图设备尺寸不足,或未手动指定排列规则。可以通过以下参数调整:

  • nrow/ncol:强制指定分面的行数或列数,确保所有州的分面都能容纳在同一张图中。比如根据你的州数量设置nrow = 6或ncol = 5。
  • scales:如果不同州的县(fips)范围差异较大,设置scales = "free_y"让每个分面的y轴独立缩放,避免出现大量空白区域。
  • 导出尺寸优化:如果绘图窗口太小,导出时可以用ggsave设置足够大的宽高,保证分面显示完整。

修改后的代码示例

ggplot(lg1, aes(x=decade,y=fips,fill=cat_total)) +
  geom_raster() + 
  scale_fill_gradient(low="white", high="red", guide="colorbar") +
  facet_wrap(~st, nrow = 6, scales = "free_y")  # 手动指定行数,y轴自由缩放

导出高清完整图像

ggsave("state_county_facets.png", width = 16, height = 12, dpi = 300)

这样就能把所有州的分面统一显示在同一张图像里,实现按州分组的效果。

内容的提问来源于stack exchange,提问作者tchoup

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 21:50:37