只有顶部/底部结果的堆积条形图

时间:2018-03-20 03:31:09

标签: r ggplot2

我有一个Excel文件,我正在尝试创建一个条形图,该类别对类别进行分组并显示该类别的平均评级。因为有很多类别,我还想在结果水平条形图中只显示前10或后10。

 category rating
 A        10
 A        8
 A        9
 B        1
 B        4
 B        9
 C        6
 C        7
 D        9

像这样的东西(代表条而不是数字):

A 9
D 9
...
C 6.5
B 4.66

我知道这看起来非常简单,但在这里尝试各种答案之后我似乎无法获得任何工作。到目前为止,使用ggplot2似乎是最有希望的。我得到的最接近的是显示每个类别的评分数量......

编辑:没有保存我之前做的工作,因为它不是我想要的结果,但它是这样的(没有使用ggplot)

dat[,c(1,12)]
category = dat[,1] //selecting column from sheet
rating = dat[,12] //selecting column from sheet
rating<-as.numeric(unlist(dat[,12]))
dat<-table(dat$rating,dat$category)
barplot(dat, main="Overall Ratings",
        xlab="Ratings", col=c("skyblue","red"), horiz=TRUE,
        legend = rownames(dat))

2 个答案:

答案 0 :(得分:2)

这是使用dplyrtidyr的链式解决方案。首先,我们需要加载数据。

library(dplyr)
library(tidyr)
library(ggplot2)
df <- read.table(text="category,rating
 A,10
 A,8
 A,9
 B,1
 B,4
 B,9
 C,6
 C,7
 D,9
", sep=",", header=TRUE)

现在解决方案。在按category对数据进行分组后,我们会计算每个类别的平均评分。

means.df <- 
df %>%
    group_by(category) %>%
    summarise(mean = mean(rating))

top_n从数据集中选择n行的顶部(正数)或底部(负数)。我们使用平均值将其应用于数据集。在您的实际数据中,将顶部调整为2到10,将底部10个类别调整为-10。

means.df %>%
    top_n(2, mean) %>%
    ggplot(aes(x = category, y = mean)) +
    geom_bar(stat = 'identity')

以下代码将顶部/底部cutoff_number类别绘制成一个图表。根据需要调整变量cutoff_number

cutoff_number <- 2
means.df %>%
    arrange(-mean) %>%
    mutate(
        topbottom = ifelse(row_number() <=  cutoff_number, "top", NA),
        topbottom = ifelse(row_number() > nrow(.) - cutoff_number, "bottom", topbottom)
    ) %>%
    ggplot(aes(x = category, y = mean)) +
    geom_bar(stat = 'identity') +
    facet_wrap(~topbottom, scales = 'free_x')

答案 1 :(得分:0)

此解决方案使用data.table汇总数据,然后将结果传递给ggplot:

library(data.table);library(ggplot2)
category=c("A","A","A","B","B","B","C","C","D")
rating=c(10,9,8,1,4,9,6,7,9)
dt=as.data.table(cbind(category,rating))
ggplot(dt[,mean(as.numeric(rating)),by=category],aes(category,V1))+geom_col()+ylab("Mean")