【问题标题】:Ordering bars in barplot()barplot() 中的条形排序
【发布时间】:2013-10-30 11:57:05
【问题描述】:

我有一个数据框,其中一个变量(我们称之为 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)

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

【问题讨论】:

  • 请提供一个可重现的例子(生成一些数据)。到目前为止你尝试过什么(提供一些代码)?

标签: r graph


【解决方案1】:

一种可能性是创建 Q1 的 factor 版本,您可以在其中按所需顺序指定 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)

【讨论】:

    【解决方案2】:

    正如 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 的基础 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)
    

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

    【讨论】:

      猜你喜欢
      • 2017-11-11
      • 2016-09-25
      • 2018-08-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多