2017-03-21 24 views
3

geom_bar()時考慮由下面的代碼prvided的柱狀圖:錯誤X軸順序使用具有字符X對象

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軸的順序對應於初始數據順序嗎?

+1

ggplot按照其字母順序對數據進行排序。你可以通過運行'sort(x)'來查看輸出。要將字符數據設置爲您想要的順序,請將其轉換爲一個因子。在這種情況下,在創建繪圖之前,執行'data $ x = factor(data $ x,levels = x)'。這是可行的,因爲矢量'x'已經按照你想要的方式排列。 – eipi10

+0

[更改離散x比例的順序]的可能重複(http://stackoverflow.com/questions/3253641/change-the-order-of-a-discrete-x-scale) – lbusett

回答

2

您創建x變量爲factor並確保其中的級別正確排序。在這個例子中,你創建了一個變量x,它的順序是正確的。否則,您必須爲x <- factor(x, levels = properly_ordered_vector)中的levels參數指定一個正確排序的向量。

此外,請確保在爲具有因子變量的級別指定levels_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

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