你如何特别订购 ggplot2 x 轴而不是字母顺序?

我正在尝试使用 ggplot2使用 geom_tiles函数制作一个 heatmap 以下是我的代码:

p<-ggplot(data,aes(Treatment,organisms))+geom_tile(aes(fill=S))+
scale_fill_gradient(low = "black",high = "red") +
scale_x_discrete(expand = c(0, 0)) +
scale_y_discrete(expand = c(0, 0)) +
theme(legend.position = "right",
axis.ticks = element_blank(),
axis.text.x = element_text(size = base_size, angle = 90, hjust = 0, colour = "black"),
axis.text.y = element_text(size = base_size, hjust = 1, colour = "black")).

Data 是我的 data.csv 文件
我的 X 轴是治疗的类型
my Y axis is types of organisms

我不太熟悉命令和编程,而且在这方面我也是新手。我只希望能够指定 x 轴上标签的顺序。在这种情况下,我试图说明“治疗”的顺序。默认情况下,它按字母顺序排序。我如何覆盖这个/保持数据在同样的顺序,在我的原来的 csv 文件?

我试过这个命令

scale_x_discrete(limits=c("Y","X","Z"))

其中 x,y 和 z 是我的治疗条件顺序。然而,它不是很好的工作,并给我失踪的热箱。

312632 次浏览

如果没有一个完整的、可重复的例子,回答你的具体问题就有点困难。然而,这种方法应该奏效:

#Turn your 'treatment' column into a character vector
data$Treatment <- as.character(data$Treatment)
#Then turn it back into a factor with the levels in the correct order
data$Treatment <- factor(data$Treatment, levels=unique(data$Treatment))

在本例中,因子的顺序与 data.csv文件中的顺序相同。

If you prefer a different order, you can order them by hand:

data$Treatment <- factor(data$Treatment, levels=c("Y", "X", "Z"))

然而,如果你有很多级别,这是危险的: 如果你得到其中任何一个错误,这将导致问题。

也可以直接在 aes()调用中进行因式分解。我不知道为什么设置的限制不适合你-我假设你得到 NA 的,因为你可能有打字错误在你的水平向量。

下面的内容当然和 用户 Drew Steen 的回答没有太大的不同,但是与原始数据帧没有改变的重要区别。

library(ggplot2)
## this vector might be useful for other plots/analyses
level_order <- c('virginica', 'versicolor', 'setosa')


p <- ggplot(iris)
p + geom_bar(aes(x = factor(Species, level = level_order)))


## or directly in the aes() call without a pre-created vector:
p + geom_bar(aes(x = factor(Species, level = c('virginica', 'versicolor', 'setosa'))))
## plot identical to the above - not shown

## or use your vector as limits in scale_x_discrete
p + geom_bar(aes(x = Species)) +
scale_x_discrete(limits = level_order)

创建于2022-11-20与 reprex v2.0.2