【问题标题】:Re-ordering bars in R's barplot()在 R 的 barplot() 中重新排序条形图
【发布时间】:2016-09-25 15:27:28
【问题描述】:

我想要实现的与这里已经问过的完全一样(特别是使用 R 的基本图形,而不是像 ggplotlattice 这样的包):Ordering bars in barplot()

但是,那里提出的解决方案似乎对我不起作用。我需要的是以下内容。假设我有这个:

num <- c(1, 8, 4, 3, 6, 7, 5, 2, 11, 3)
cat <- c(letters[1:length(num)])
data <- data.frame(num, cat)

如果我使用barplot(data$num) 生成条形图,我会得到以下结果:

现在,我想根据data$cat 重新排列条形图。按照我上面提到的链接,我尝试了接受的答案,但得到了一个错误:

num2 <- factor(num, labels = as.character(cat))
Error in factor(num, labels = as.character(cat)) : invalid 'labels'; length 10 should be 1 or 9

然后我也尝试了另一个答案:

num <- as.factor(num)
barplot(table(num))

但这是我得到的:

所以,在我的这个特殊情况下,与那个问题略有不同,我应该如何订购条形图,以便条形由data$num 定义但根据data$cat 排序?

【问题讨论】:

    标签: r sorting bar-chart


    【解决方案1】:

    你可以使用 ggplot 来做到这一点

    library("ggplot2")
    num <- c(1, 8, 4, 3, 6, 7, 5, 2, 11, 3)
    cat <- c(letters[1:10])
    data <- data.frame(num, cat)    
    ggplot(data,aes(x= reorder(cat,-num),num))+geom_bar(stat ="identity")
    

    结果如下图

    使用基函数

    df <- data[order(data$num,decreasing = TRUE),]
     barplot(df$num,names.arg = df$cat)
    

    【讨论】:

    • 感谢您的回答,但在这种情况下,我的问题特别针对基本图形,即使用barplot
    • Arun、arrangedesc 不是基本函数。您可能想改用order
    • 啊,是的!我的错。我已经对答案进行了更改。
    • @Arun 同样,您的第二个示例不包括data$cat。但是我能够按照您所说的大致思路解决:这完全是通过执行order(data$cat) 来重新排序data,或者,如果不使用data.frame,则类似于`num
    • @ZheyuanLi 顺便说一句,为了清楚起见,我只是没有投票,因为我仍然不能。每当我得到所需的代表时,我就会回来=)
    【解决方案2】:

    我得到以下,

    num <- c(1, 8, 4, 3, 6, 7, 5, 2, 11, 3)
    cat <- c(letters[1:10])
    data <- data.frame(num, cat)
    barplot(data[order(data[,1],decreasing=TRUE),][,1],names.arg=data[order(data[,1],decreasing=TRUE),][,2])
    

    上面的代码使用了 order() 函数两次(见下面的 cmets)。为避免这样做,可以将有序 data.frame 的结果存储在新的 data.frame 中,这可用于生成条形图。

    num <- c(1, 8, 4, 3, 6, 7, 5, 2, 11, 3)
    cat <- c(letters[1:10])
    data <- data.frame(num, cat)
    data2  <- data[order(data[,1],decreasing=TRUE),]
    barplot(data2[,1],names.arg=data2[,2])
    

    【讨论】:

    • 我们同时发帖:这正是我最终所做的,但是由于使用了decreasingparameter,您的示例更加清晰准确
    • @Juddy 很高兴回答了这个问题。
    • @ZheyuanLi 另一种方法是将重新排序的数据分配给新的 data.frame 并在 barplot 中使用它,而不是计算两次。
    【解决方案3】:

    或者,如果您不想将数据放入新的数据框中,也可以使用以下方法。只是简单一点。

    barplot(sort(data$num, decreasing = TRUE))
    

    【讨论】:

    • 此方法也适用于 barplot() 的数据参数是表格时。
    猜你喜欢
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    相关资源
    最近更新 更多