提问人:Lisa Ta 提问时间:10/8/2012 最后编辑:Gregor ThomasLisa Ta 更新时间:9/4/2023 访问量:371027
您如何具体按 ggplot2 x 轴而不是字母顺序排序?
How do you specifically order ggplot2 x axis instead of alphabetical order?
问:
我正在尝试使用该函数
这是我的代码如下: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 是我的治疗条件顺序。然而,它效果不佳,并让我缺少加热箱。
答:
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 会按字母顺序而不是按它们在文件中出现的顺序分配整数值。您可以争论这是否有意义,但随后会做合乎逻辑的事情,即按整数值的顺序显示因子水平。您的投诉是针对 ,而不是 。.csv
ggplot2
read.table
ggplot2
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_wrap
scale_x_discrete(c('B', 'A', 'C'))
limit
scale_x_discrete(limit = c('B', 'A', 'C'))
上一个:从数据框中提取特定列
下一个:为 ggplot2 线图添加图例
评论