3

我有一个数据框,其中一个变量(我们称之为 Q1)有几个级别:“无用”、“30 分钟”、“1 小时”、“2 小时”、“3+ 小时”。

如何绘制 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)

但它并没有给我我需要的东西。

4

2 回答 2

6

一种可能性是创建一个factorQ1 版本,您可以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)

在此处输入图像描述

于 2013-10-30T13:12:36.760 回答
4

正如 Henrik 所说,您需要将数据纳入一个因素(至少这是实现这一目标的最简单方法)。考虑以下带有一些虚假数据的示例...

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

这可以在带有 plot 的 base r 中完成(未指定 y 时不需要条形图)

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

然后你可以应用上面显示的情节逻辑......

于 2013-10-30T13:17:59.830 回答