您如何具体按 ggplot2 x 轴而不是字母顺序排序?

How do you specifically order ggplot2 x axis instead of alphabetical order?

提问人:Lisa Ta 提问时间:10/8/2012 最后编辑:Gregor ThomasLisa Ta 更新时间:9/4/2023 访问量:371027

问:

我正在尝试使用该函数 这是我的代码如下:heatmapggplot2geom_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 是我的治疗条件顺序。然而,它效果不佳,并让我缺少加热箱。

GGPLOT2 R-常见问题

评论

0赞 zephryl 6/13/2023
投票重新打开,因为链接的 dup 是关于按频率重新排序,而这个问题是关于施加任意命令的,并且是这种情况的有用 dup 目标。

答:

166赞 Drew Steen 10/8/2012 #1

如果没有一个完整的、可重复的例子,回答你的具体问题有点困难。但是,这样的事情应该有效:

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

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

评论

40赞 Dirk Calloway 3/25/2014
不得不想知道为什么这甚至是必要的。为什么首先要用 ggplot 对轴重新排序?如果有人不知道这将会发生,这似乎很危险。
1赞 bright-star 3/25/2014
我自己刚刚遇到了这个问题,用 qplot 制作热图并自动应用变量名称。应该报告吗?
11赞 Drew Steen 3/25/2014
@DirkCalloway,如果考虑因子在 R 中的工作方式,则此行为是有意义的。因子是整数的向量,每个整数都与一个字符“label”相关联。当您通过读取文本文件中的一列字符值来创建因子时(例如),R 会按字母顺序而不是按它们在文件中出现的顺序分配整数值。您可以争论这是否有意义,但随后会做合乎逻辑的事情,即按整数值的顺序显示因子水平。您的投诉是针对 ,而不是 。.csvggplot2read.tableggplot2
98赞 tjebo 2/27/2018 #2

也可以直接在调用中简单地进行因式分解。我不确定为什么设置限制对你不起作用 - 我假设你得到 NA 是因为你的水平向量中可能有错别字。aes()

下面的答案当然与用户 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 with reprex v2.0.2

评论

0赞 Ceres 7/13/2022
我更喜欢使用 ''' level_order <- c('virginica', 'versicolor', 'setosa') ggplot(iris, aes(x =Species, y = Petal.Width)) + geom_col() + scale_x_discrete(limits = level_order) '''
1赞 tjebo 11/20/2022
@Ceres这当然也是一个不错的选择。感谢分享。由于问题已关闭,您将无法将您的建议添加为答案,因此我已将其添加到我的建议中。
1赞 Helgi 9/4/2023 #3

我只是遇到了同样的问题,数据按字母顺序重新排序。scale_x_discrete的解决方案对我完美有效:

scale_x_discrete(c('B', 'A', 'C'))
#where A, B and C are labels.

评论

2赞 William 11/9/2023
在绘图有 的情况下,除非您添加参数,否则将不起作用,如 中所示。facet_wrapscale_x_discrete(c('B', 'A', 'C'))limitscale_x_discrete(limit = c('B', 'A', 'C'))