如何按变量分布比例重新排序ggplot2条形图
解决ggplot2条形图按ThemeFirst占比排序的问题
要实现条形图按ThemeFirst占比从左到右递增排列,核心是重新指定x轴Variety的因子顺序,具体修改步骤如下:
步骤1:生成Variety的排序规则
从处理好的dataframe_realization中筛选ThemeFirst的数据,按占比从小到大提取Variety的顺序:
# 提取ThemeFirst的占比数据,按Proportion从小到大排序得到Variety的顺序 variety_order <- dataframe_realization %>% filter(Variant == "ThemeFirst") %>% arrange(Proportion) %>% pull(Variety)
步骤2:将Variety转换为有序因子
把原数据中的Variety列转换为因子,用上面生成的variety_order作为水平顺序:
# 转换Variety为有序因子 dataframe_realization <- dataframe_realization %>% mutate(Variety = factor(Variety, levels = variety_order, ordered = TRUE))
步骤3:修改ggplot绘图代码
原绘图代码无需大幅改动,因为x轴的Variety已经是按要求排序的因子了,直接使用即可:
# 堆叠条形图(已自动按ThemeFirst占比排序x轴) realization_plot_absvals <- ggplot(data = dataframe_realization, aes(Variety, Proportion, group = Variant)) + geom_col(aes(fill = Variant)) + labs(title = "", y="Proportion of theme-recipient tokens", x="") + scale_y_continuous() + scale_fill_grey(start = 0.25, end = 0.75) + geom_text(aes(label = absvals), position = position_stack(vjust = 0.5), color=ifelse(dataframe_realization$Variant=="RecipientFirst", "white", "black")) + theme(text=element_text(size=15))
完整修改后的代码整合
把上述步骤整合到原代码中,替换掉原有的labels.order和df.new部分(这部分是处理Variant顺序的,和当前需求无关,可保留或按需调整):
t1 <- table(data$Variety, data$realization) dataframe_realization <- data.frame(Variety=names(prop.table(t1,1)[,1]), RecipientFirst=prop.table(t1,1)[,1], ThemeFirst=prop.table(t1,1)[,2], row.names=NULL) dataframe_realization <- melt(dataframe_realization, id="Variety", variable_name="Variant") # 添加绝对频数 dataframe_realization_absfreq <- data.frame(Variety=names(t1[,1]), RecipientFirst=as.numeric(t1[,1]), ThemeFirst=as.numeric(t1[,2])) dataframe_realization_absfreq <- melt(dataframe_realization_absfreq, id="Variety", variable_name = "Variant") dataframe_realization$absvals <- dataframe_realization_absfreq$value dataframe_realization$Proportion <- dataframe_realization$value dataframe_realization$variable <- dataframe_realization$Variant # -------------------新增排序逻辑------------------- # 生成ThemeFirst占比从小到大的Variety顺序 variety_order <- dataframe_realization %>% filter(Variant == "ThemeFirst") %>% arrange(Proportion) %>% pull(Variety) # 转换为有序因子 dataframe_realization <- dataframe_realization %>% mutate(Variety = factor(Variety, levels = variety_order, ordered = TRUE)) # ------------------------------------------------- # 绘制堆叠条形图 realization_plot_absvals <- ggplot(data = dataframe_realization, aes(Variety, Proportion, group = Variant)) + geom_col(aes(fill = Variant)) + labs(title = "", y="Proportion of theme-recipient tokens", x="") + scale_y_continuous() + scale_fill_grey(start = 0.25, end = 0.75) + geom_text(aes(label = absvals), position = position_stack(vjust = 0.5), color=ifelse(dataframe_realization$Variant=="RecipientFirst", "white", "black")) + theme(text=element_text(size=15)) ggsave("~/VADIS_VarietyProportion_absvals.png", realization_plot_absvals, width=13, height=6, units="in", dpi = 1000)
这样修改后,条形图的x轴就会按ThemeFirst的占比从左到右递增排列,最左侧是占比最低的19thCentury,最右侧是占比最高的CTM_Other。
内容的提问来源于stack exchange,提问作者nick.yili9393
相关产品推荐
相关产品推荐

