R语言面板数据多变量分面折线图绘制及报错修正
问题根因
原代码触发报错的核心有两点:
- 无参数的
gather()会对全表所有列做长宽转换,连本应作为面板维度的unit_id、time列都会被揉进key、value两列里,转换完成后的数据集根本不存在time字段,自然无法匹配aes(time)的x轴要求。 - 即使列名没丢,原代码也缺失两个关键映射:长表中存储数值结果的
value列没有被设为y轴,代表国家的unit_id没有被设为线条分组,最终生成的折线会把不同国家、不同变量的数据错误串接。
修正代码
兼容原代码使用gather的旧版tidyr写法:
library(tidyverse) exampl %>% # 仅转换除unit_id、time之外的所有数值变量,保留两个面板标识列 gather(var_name, var_value, -unit_id, -time) %>% ggplot(aes(x = time, y = var_value, color = unit_id, group = unit_id)) + # 按变量拆分独立子图,开启自由坐标轴适配不同变量的取值范围 facet_wrap(~ var_name, scales = "free") + geom_line(linewidth = 0.8) + # 叠加点位标记,让各年度观测值更易识别 geom_point(size = 1.5)
如果使用新版tidyr语法(gather已逐步被pivot_longer替代),等价实现为:
exampl %>% pivot_longer(-c(unit_id, time), names_to = "var_name", values_to = "var_value") %>% ggplot(aes(x = time, y = var_value, color = unit_id, group = unit_id)) + facet_wrap(~ var_name, scales = "free") + geom_line(linewidth = 0.8)
实现效果
每个子图对应一个数值变量,每个国家生成一条独立的时间趋势折线,不同国家通过颜色区分,子图y轴会自动适配对应变量的量纲差异,不会因为某类变量取值范围过窄被压成水平线。
内容的提问来源于stack exchange,提问作者wtfvba
相关产品推荐
相关产品推荐

