R语言:设置date因子后ggplot柱状图未按日期排序的问题求助
解决柱状图按
date排序的问题 你遇到的核心问题是:虽然你调整了date的因子水平,但你的ggplot x轴用的是treatment.tx,而非date——所以修改date的顺序并不会直接改变x轴柱子的排列顺序。要让柱子按date排序,我们需要把treatment.tx的因子水平按照其对应的date顺序重新排列。
下面是具体的解决步骤:
步骤1:重新排序treatment.tx的因子水平
首先,我们基于date的顺序对treatment.tx进行排序,然后将treatment.tx转换为因子,把排序后的结果作为它的水平:
library(dplyr) # 先确保date的因子水平是你想要的顺序 bioassay$date <- factor(bioassay$date, levels = c("200507", "200527", "200702")) # 按照date的顺序对treatment.tx排序,并设置为因子 bioassay <- bioassay %>% arrange(date) %>% mutate(treatment.tx = factor(treatment.tx, levels = unique(treatment.tx)))
这里arrange(date)会先按date的顺序排列整个数据集,然后mutate把treatment.tx转成因子,水平就是排序后的唯一值——这样treatment.tx的顺序就和date的顺序完全对应上了。
步骤2:使用处理后的数据集绘图
现在用这个处理好的数据集运行你的ggplot代码,柱子就会按照date的顺序排列了:
library(ggplot2) ggplot(data = bioassay, aes(fill = combinedwith.tx, x = treatment.tx, y = mean_hatch)) + geom_bar(stat = 'identity', width = 0.5, alpha = 0.5) + geom_errorbar(aes(ymin = mean_hatch - stdev_hatch, ymax = mean_hatch + stdev_hatch), width = 0.2, size = 0.5) + theme_light() + labs(fill = "combined with") + theme(text = element_text(size = 15), axis.text.x = element_text(angle = 45, hjust = 1)) + scale_fill_manual(values = c("yellow2", "darkgreen", "red2", "blue", "grey0")) + scale_x_discrete(name = "combined with inhibitor") + scale_y_continuous(name = 'hatching (%)', limits = c(0, 66), breaks = c(0, 20, 40, 60)) # 移除了超出y轴范围的breaks,让刻度更合理
为什么之前的方法没用?
你的代码只修改了date的因子水平,但ggplot的x轴是treatment.tx——这个变量的默认顺序是它在数据集中首次出现的顺序,和date的顺序无关。只有当你把treatment.tx的因子水平设置为按date排序后的顺序,ggplot才会按照这个顺序绘制柱子。
内容的提问来源于stack exchange,提问作者Lieke
相关产品推荐
相关产品推荐

