问题描述
Stacked bar chart across multiple columns
我的数据框:
DevType <- c('Designer','Developer,Back',front','Engineer')
Salary <- c(120,340,72,400)
Master <- c('1','2','3','4')
Bachelor <- c('6','1','1')
University <- c('6','0','2')
data1 <- data.frame(DevType,Salary,Master,Bachelor,University)
由于问题,我创建了一个这样的列表:
data1 <- gather(data1,key,value,-DevType,-Salary)
开发类型 | 工资 | 键 | 价值 |
---|---|---|---|
设计师 | 120 | 大师 | 1 |
开发人员 | 340 | 大师 | 3 |
工程师 | 72 | 大师 | 4 |
学生 | 400 | 大师 | 2 |
设计师 | 120 | 本科 | 6 |
开发人员 | 340 | 本科 | 8 |
工程师 | 72 | 本科 | 2 |
学生 | 400 | 本科 | 1 |
设计师 | 120 | 大学 | 2 |
开发人员 | 340 | 大学 | 3 |
工程师 | 72 | 大学 | 4 |
学生 | 400 | 大学 | 2 |
现在我想要一个堆叠的条形图。 x 轴:DevType y 轴:工资 DevTypes 的条形按值细分。 作为传奇,我需要钥匙。
我从问题中得到了这个:
ggplot(data1,aes(x = DevType,y = Salary))+
geom_col(aes(fill = key))
我的问题之间的区别是,我的 y 轴不是值。 问题是正确的高度只有一个键,而且键的长度都一样。
感谢您的指点。
解决方法
更新
考虑到评论中的反复,似乎图表上的条形应该与平均工资相加,而我们希望看到的是不同教育水平的人对平均工资的相对贡献。
例如,Developer,front
的平均工资是 72,平均贡献了两个人,一个是学士学位,一个是硕士学位。因此,栏的高度应为 72,每个人应占总数的 36。
因此,我们根据对平均值的加权贡献来创建调整后的工资。
library(ggplot2)
library(tidyr)
DevType <- c('Designer','Developer,Back',front','Engineer')
Salary <- c(120,340,72,400)
Master <- c('1','2','3','4')
Bachelor <- c('6','1','1')
University <- c('6','0','2')
data1 <- data.frame(DevType,Salary,Master,Bachelor,University)
# gather data for subsequent processing
data1 <- data1 %>%
gather(.,key,value,-DevType,-Salary) %>%
type.convert(.,as.is = TRUE)
data1 <- data1 %>%
group_by(DevType) %>%
# calculate denominators for salaries
summarise(.,salaryCount = sum(value)) %>%
# merge salary counts
left_join(.,data1) %>%
# use number of participants as denominator so sums add up to average
# salary
mutate(adjSalary = if_else(value > 0,Salary * value / salaryCount,0))
# original chart - where y axis is adjusted so total matches average salary
# across participants who contributed to the average
ggplot(data1,aes(x = DevType,y = adjSalary))+
geom_col(aes(fill = key))
...以及输出,其中条形总和为原始工资水平。
原答案
当您想要比较分组变量的不同类别的不同贡献与其在 y 轴变量上的值之和时,堆积条形图很有用。然而,从数据看来,提问者试图按教育水平比较不同角色的工资水平。
在这种情况下,分组条形图比堆叠条形图更有用,因为分组图直观地比较了 x 轴变量类别中第三个分组变量的类别。
library(ggplot2)
library(tidyr)
DevType <- c('Designer',University)
data1 <- gather(data1,-Salary)
# use grouped bar chart instead
ggplot(data1,y = Salary,fill = key)) +
geom_bar(position = "dodge",stat = "identity")
...和输出:
注意:如原帖所述,每个关键变量的工资水平在 x 轴变量的每个类别中都是恒定的,因此图表不是特别有趣。