105

我正在尝试heatmap使用ggplot2以下geom_tiles函数来使用我的代码:

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.csv 文件
我的 X 轴是治疗类型
我的 Y 轴是生物类型

我对命令和编程不太熟悉,而且我在这方面相对较新。我只想能够指定 x 轴上标签的顺序。在这种情况下,我试图指定“治疗”的顺序。默认情况下,它按字母顺序排列。如何以与原始 csv 文件相同的顺序覆盖此/保留数据?

我试过这个命令

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

其中 x、y 和 z 是我的治疗条件顺序。但是它不能很好地工作,并且让我缺少热箱。

4

2 回答 2

139

如果没有完整的、可重复的示例,要回答您的具体问题有点困难。然而,这样的事情应该有效:

#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文件中的顺序相同。

如果您喜欢不同的订单,您可以手动订购:

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

但是,如果您有很多级别,这是很危险的:如果您将其中任何一个弄错了,那将导致问题。

于 2012-10-08T13:53:27.693 回答
70

接受的答案提供了一个需要更改基础数据框的解决方案。这不是必需的。人们也可以直接在aes()调用中进行因式分解,或者为此创建一个向量。

这当然与用户 Drew Steen 的回答没有太大区别,但重要的区别是不更改原始数据框。

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

ggplot(iris, aes(x = factor(Species, level = level_order), y = Petal.Width)) + geom_col()

或者

level_order <- factor(iris$Species, level = c('virginica', 'versicolor', 'setosa'))

ggplot(iris, aes(x = level_order, y = Petal.Width)) + geom_col()


直接在aes()没有预先创建的向量的调用中:

ggplot(iris, aes(x = factor(Species, level = c('virginica', 'versicolor', 'setosa')), y = Petal.Width)) + geom_col()

这是第一个版本

于 2018-02-26T22:53:39.337 回答