ggalluvial绘图问题:如何让Stratum顺序遵循ARM数据集的原始输入顺序
解决ARM架构关系冲积图的顺序问题
我完全理解你作为R新手的困惑——默认的字母排序确实会把冲积图搞得一团糟,而且factor这类概念刚开始接触确实头大。别担心,咱们一步一步来解决这个问题:
核心问题根源
R在处理字符串类型的列时,会自动把它们转换成因子(factor),而默认的因子顺序是字母排序,这就是你的图里线条乱交叉的原因。咱们要做的就是手动指定每个列的因子顺序,让它严格遵循你原始数据里的出现顺序。
步骤1:把数据列转换成有序因子
先运行这段代码,把你的四个关键列(Profil、Familie、Architektur、Prozessor)转换成按原始顺序排列的因子:
# 按数据中首次出现的顺序设置因子水平 ARM$Profil <- factor(ARM$Profil, levels = unique(ARM$Profil)) ARM$Familie <- factor(ARM$Familie, levels = unique(ARM$Familie)) ARM$Architektur <- factor(ARM$Architektur, levels = unique(ARM$Architektur)) ARM$Prozessor <- factor(ARM$Prozessor, levels = unique(ARM$Prozessor))
解释一下:unique(ARM$Profil)会提取出Profil列里所有不重复的值,而且是按照它们在数据里第一次出现的顺序提取的——这正好是你想要的原始顺序。把这个设置为因子的levels,R就不会再用字母排序了。
步骤2:运行修改后的绘图代码
现在用你原来的绘图代码就行(如果没装依赖包先装一下):
# 先安装需要的包(第一次运行时执行) install.packages(c("ggplot2", "alluvial", "ggfittext")) library(ggplot2) library(alluvial) library(ggfittext) ggplot(data = ARM, aes(axis1 = Profil, axis2 = Familie, axis3 = Architektur, axis4 = Prozessor)) + geom_alluvium(aes(fill = Architektur)) + stat_stratum() + ggfittext::geom_fit_text(stat = "stratum", min.size = 0, aes(label = after_stat(stratum))) + scale_x_discrete(limits = c("Profil", "Familie", "Architektur", "Prozessor"), expand = c(.2, .05)) + theme_void()
现在生成的图里,每个轴的分层都会严格按照你原始数据的顺序排列,线条交叉的情况会大大减少,视觉效果会清晰很多。
额外小提示
如果之后你更新了数据,只要原始顺序没变,这段代码依然有效——unique()会自动跟着新数据的首次出现顺序更新因子水平。
内容的提问来源于stack exchange,提问作者Chilippso
相关产品推荐
相关产品推荐

