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

如何按变量分布比例重新排序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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 20:11:09