如何在ggplot2的geom_line图中按Reg变量聚类同区域国家?
解决方案:按地理区域聚类国家显示
要实现同区域的国家显示在一起,核心是调整Country变量的排序,让它按照Reg分组来排列,这样ggplot绘制y轴时就会自动把同区域的国家放在一起啦。
下面是具体的实现步骤和代码:
步骤1:重新排序国家变量
我们可以把Country转换成有序因子,排序依据是Reg的分组。这里用dplyr和forcats包来处理会很方便:
# 先加载需要的包 library(dplyr) library(forcats) library(ggplot2) # 对数据集进行处理:按区域排序后,把Country转成对应顺序的因子 dur_ordered <- dur %>% arrange(Reg) %>% # 先按Reg字段排序,让同区域国家集中 mutate(Country = fct_inorder(Country)) # 将Country转换为按当前顺序排列的因子
这样处理后,Country因子的水平顺序就会跟随Reg的分组逻辑,同区域的国家会连在一起排列。
步骤2:修改ggplot代码绘图
用处理好的dur_ordered数据集绘图,y轴直接用重新排序后的Country即可:
ggplot(data = dur_ordered) + geom_line(mapping = aes(x = Year, y = Country, color = elec.sys.fam), size = 1.1) + # 这里注意color参数直接用列名即可,无需加dur$ guides(colour = guide_legend(override.aes = list(size = 3))) + # 可选:调整y轴文字大小,避免国家名称挤在一起 theme(axis.text.y = element_text(size = 9))
另外提个小细节:你的原始代码里color=dur$elec.sys.fam的写法不太规范,直接用列名elec.sys.fam就好,ggplot会自动从data参数指定的数据框里读取对应列。
如果你的Reg区域有自定义的排序需求(比如按大洲优先级排序),还可以先给Reg指定有序因子,这样国家的聚类顺序会更贴合你的预期:
# 示例:手动指定Reg的顺序为"非洲", "亚洲", "欧洲", "美洲"(根据你的实际区域名称调整) dur_ordered <- dur %>% mutate(Reg = factor(Reg, levels = c("非洲", "亚洲", "欧洲", "美洲"))) %>% arrange(Reg) %>% mutate(Country = fct_inorder(Country))
这样处理后,区域会按照你指定的顺序排列,对应的国家也会跟着聚类显示。
内容的提问来源于stack exchange,提问作者Nathgun
相关产品推荐
相关产品推荐

