【问题标题】:How do you specifically order ggplot2 x axis instead of alphabetical order? [duplicate]您如何专门订购 ggplot2 x 轴而不是字母顺序? [复制]
【发布时间】:2012-09-28 06:14:39
【问题描述】:

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

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

我试过这个命令

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

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

【问题讨论】:

    标签: r ggplot2 r-faq


    【解决方案1】:

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

    这当然和user Drew Steen's answer没有太大区别,但重要的区别是不改变原始数据框。

    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()
    

    【讨论】:

      【解决方案2】:

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

      #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"))
      

      但是,如果你有很多关卡,这很危险:如果你把其中任何一个弄错了,就会导致问题。

      【讨论】:

      • 不得不怀疑为什么这甚至是必要的。为什么轴首先由 ggplot 重新排序?如果有人不知道会发生这种情况,这似乎很危险。
      • 我刚刚遇到了这个问题,我自己创建了一个heatmap with qplot 并自动应用了变量名。应该举报吗?
      • @DirkCalloway,如果您考虑因子在 R 中的工作方式,这种行为是有意义的。因子是整数向量,每个整数都与字符“标签”相关联。当您通过读取文本文件中的一列字符值(例如.csv)来创建因子时,R 会按字母顺序而不是它们在文件中出现的顺序分配整数值。您可以争论这是否有意义,但ggplot2 然后会做合乎逻辑的事情,即按整数值的顺序显示因子水平。您的投诉是针对read.table,而不是ggplot2
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-20
      • 1970-01-01
      • 2010-12-22
      • 1970-01-01
      相关资源
      最近更新 更多