2013-10-30 155 views
2

我有一個數據框,其中一個變量(我們稱之爲Q1)有幾個級別:「沒有用」,「30分鐘」,「1小時」,「2小時」,「 3個多小時「。barplot排序條()

如何繪製一個barplot(),其中的條形按照因子級別的順序排列?我嘗試使用sort(),但這並沒有辦法。

編輯:按照要求,一些樣本數據:

Q1 
1 hour 
1 hour 
30 min 
2 hours 
3+ hours 
3+ hours 
3+ hours 
3+ hours 
2 hours 
1 hour 
2 hours 
1 hour 
30 min 

我已經試過:

barplot(table(sort(Q1)), main = "Q1 Answer Distribution", ylim = c(0, 250), cex.axis=0.9) 

,但它並沒有給我什麼,我需要。

+0

請提供可重複的例子(生成一些數據)。你到目前爲止嘗試過什麼(提供一些代碼)? – agstudy

回答

3

正如亨裏克說,你需要得到你的數據放入一個因素(至少這是實現這一點最簡單的方法)。請看下面的例子有一些假數據...

#generate 1000 random uniform integers between 1 and 5 
data <- floor(runif(1000, 1,6)) 

#make data a factor with given labels 
fdata <- factor(data, 
       labels = c("No use", 
          "30 min", 
          "1 hour", 
          "2 hours", 
          "3+ hours")) 

這可以在基礎R進行與圖(不指定當Y是barplot不需要)

#in base R, just use plot - when y is missing, barplot is produced 
plot(fdata) 

您也可以在繪製GGPLOT2

#in ggplot2 
require(ggplot2) 

#make a dataframe 
df <- data.frame(id = seq(1:length(fdata)), 
       fdata = fdata) 

#plot via geom_bar 
ggplot(df, aes(fdata)) + geom_bar() 

從原來的例子出發,除了指定的水平,你將需要設置ordered=TRUE,如下圖所示。否則,「無用」仍會顯示在列表的末尾。

#get data into a factor (provided data plus "No use") 
q1 <- c("No use" 
     ,"1 hour" 
     ,"1 hour" 
     ,"30 min" 
     ,"2 hours" 
     ,"3+ hours" 
     ,"3+ hours" 
     ,"3+ hours" 
     ,"3+ hours" 
     ,"2 hours" 
     ,"1 hour" 
     ,"2 hours" 
     ,"1 hour" 
     ,"30 min") 

q1f = factor(q1, 
      levels = c("No use", 
          "30 min", 
          "1 hour", 
          "2 hours", 
          "3+ hours"), 
      ordered=TRUE) 

那麼你可以申請上面顯示的情節邏輯...

3

一種可能性是創建一個factor版Q1的,你期望的順序指定levels

df$Q1_fac <- factor(df$Q1, levels = c("30 min", "1 hour", "2 hours", "3+ hours")) 

tt <- table(df$Q1_fac) 
tt 
# Q1_fac 
# 30 min 1 hour 2 hours 3+ hours 
#  2  4  3  4  

barplot(tt) 

enter image description here