首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有一种更优雅的方式来用数据的均值来给ggplot条着色呢?

有没有一种更优雅的方式来用数据的均值来给ggplot条着色呢?
EN

Stack Overflow用户
提问于 2020-03-08 15:40:33
回答 3查看 87关注 0票数 2

必须有一种不那么笨拙的方法来汇总条形图中的平均值。我预计fill会返回所有计数的均值。请查看MWE,包括周围的工作。

代码语言:javascript
复制
# Some data
Machine <- c( "A", "B", "B", "B", "B", "C","D", "E", "F", "G", "H", "I", "J", "K", "G","H", "G")
Efficiency <- c(93.3, 95.0, 95.0, 99.1, 84.1, 95.8, 91.2, 82.9, 73.1, 93.7, 86.6, 68.1, 78.5, 68.5, 86.6, 90.0, 97.3)
gt <- data.frame(Machine, Efficiency)

ggplot(gt, aes(x=Machine, fill = Efficiency)) + geom_bar()
# This is not what I expected so...

library(dplyr)
gt2 <- gt %>% group_by(Machine) %>% mutate(mean(Efficiency))
names(gt2) <- c("Machine", "Efficiency", "Mean_Efficiency")

ggplot(gt2, aes(x=Machine, fill = Mean_Efficiency)) +
    geom_bar(stat = "count") 
# This is what I want (and mistakenly expected)

有没有一种更优雅的方法来根据平均效率给条形着色?

EN

回答 3

Stack Overflow用户

发布于 2020-03-08 17:21:00

第一次尝试没有给出预期结果的原因是,ggplot2不知道它是您想用来填充的Efficiency的平均值。

因此,最好的解决方案是预先计算平均值。然而,您的图依赖于两个摘要:一个是您预计算的平均值,另一个是您让ggplot2 (或者更具体地说,由geom_bar()使用的stat_count() )为您做的计数。如果发现摘要的这种混合方法有点令人困惑,则倾向于按如下方式预先计算这两个摘要:

代码语言:javascript
复制
gt2 <- gt %>%
        group_by(Machine) %>%
        summarize(count = n(),
                  mean_efficiency = mean(Efficiency)) 

然后,您可以使用geom_col()而不是geom_bar(),因为前者采用显式y-aesthetic而不是绘制计数:

代码语言:javascript
复制
ggplot(gt2, aes(x = Machine, y = count, fill = mean_efficiency)) +
  geom_col()

请注意,此解决方案并不比您的解决方案更正确。你喜欢哪一个就看你的了。

票数 3
EN

Stack Overflow用户

发布于 2020-03-08 17:40:03

如果从aes内部调用ave,则不需要进行预计算。

代码语言:javascript
复制
ggplot(gt, aes(x=Machine, fill = ave(Efficiency,Machine))) + geom_bar()

也就是说,直接将fill美学设置为机器效率的平均值。对我来说,这是一种更自然、更易读的方法,但正如其他人所说,这是一个品味问题。

如果要设置图例标题,请使用(例如) +labs(fill="Mean efficiency")

票数 2
EN

Stack Overflow用户

发布于 2020-03-08 16:40:19

你在绘制之前计算均值的方法是完全正确的。fill不会为你做这件事。但是,您的代码可以更简洁,而不必总是设置名称。(;

代码语言:javascript
复制
library(ggplot2)
library(dplyr)

# Some data
gt <- data.frame(
  Machine = c( "A", "B", "B", "B", "B", "C","D", "E", "F", "G", "H", "I", "J", "K", "G","H", "G"),
  Efficiency = c(93.3, 95.0, 95.0, 99.1, 84.1, 95.8, 91.2, 82.9, 73.1, 93.7, 86.6, 68.1, 78.5, 68.5, 86.6, 90.0, 97.3)
)
# aggregate(Efficiency~Machine, data=gt, FUN = mean)
gt <- gt %>% 
  group_by(Machine) %>% 
  mutate(Mean_Efficiency = mean(Efficiency)) %>% 
  ungroup() 

ggplot(gt, aes(x = Machine, fill = Mean_Efficiency)) + 
  geom_bar()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60585439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档