使用带有字符X对象的geom_bar()时,X轴顺序错误

时间:2017-03-21 06:00:07

标签: r ggplot2

考虑以下代码提供的条形图:

y<-rnorm(10)
x<-c('0~0.1','0.1~0.2','0.2~0.3','0.3~0.4','0.4~0.5','0.5~0.6','0.6~0.7','0.7~0.8','0.8~0.9','0.9~1')
data<-data.frame(x,y)
library('ggplot2')
ggplot(data=data,aes(x=x,y=y))+geom_bar(stat="identity",fill='light blue')

结果是这样的: enter image description here

奇怪的是0~0.1位于X轴的末端,即使0~0.1位于data的第一行。

然而,当我将'0~0.1'更改为'0.0~0.1'时,我得到了正确的情节。

为什么会这样?是否有任何其他方法来预测x轴的顺序对应于初始数据顺序?

2 个答案:

答案 0 :(得分:2)

您将x变量创建为factor,并确保其中的级别正确排序。在此示例中,您创建了一个变量x,其级别的顺序正确。如果没有,则必须将正确排序的向量分配给levels中的x <- factor( x, levels = properly_ordered_vector )参数。

此外,确保在为因子变量分配级别时,proper_ordered_vector中没有重复值。一旦你这样设置,ggplot将根据级别的顺序处理xaxis标签的顺序。

set.seed(1L)
y<-rnorm(10)
x<- c('0~0.1','0.1~0.2','0.2~0.3','0.3~0.4','0.4~0.5','0.5~0.6','0.6~0.7','0.7~0.8','0.8~0.9','0.9~1')
x <- factor( x, levels = x )
data<-data.frame(x,y)
library('ggplot2')
ggplot(data=data,aes(x=x,y=y))+geom_bar(stat="identity",fill='light blue')

enter image description here

答案 1 :(得分:0)

两者都不适合我。对我来说是最好的解决方案,类似Aaron所述。 x变量应该是“因子”(无论这意味着什么......),因此将其视为离散的,然后将x数据视为级别。不知道为什么要指定两次,但它有效。 例如:

mbar <- data.frame(klasse=c("<39", "40-60", "60-80", "80-100", ">100"), len=c(375, 57, 7, 0, 0))
p <- ggplot(data=mbar, aes(x=factor(klasse, levels=klasse), y=len)) + geom_bar(stat="identity")
p