R中多列堆积条形图

Stacked bar chart with multiple columns in R

这些问题对我有帮助,但解决方案仍然不正确。

我的数据框:

DevType <- c('Designer', 'Developer, Back', 'Developer, front', 'Engineer')
Salary <- c(120, 340, 72, 400)
Master <- c('1', '2', '3', '4')
Bachelor <- c('6', '1', '3', '1')
University <- c('6', '2', '0', '2')
data1 <- data.frame(DevType, Salary, Master, Bachelor, University)

由于这些问题,我创建了一个这样的列表:

data1 <- gather(data1, key, value, -DevType, -Salary)
DevType Salary key value
Designer 120 Master 1
Developer 340 Master 3
Engineer 72 Master 4
Student 400 Master 2
Designer 120 Bachelor 6
Developer 340 Bachelor 8
Engineer 72 Bachelor 2
Student 400 Bachelor 1
Designer 120 University 2
Developer 340 University 3
Engineer 72 University 4
Student 400 University 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)
library(dplyr)

DevType <- c('Designer', 'Developer, Back', 'Developer, front', 'Engineer')
Salary <- c(120, 340, 72, 400)
Master <- c('1', '2', '3', '4')
Bachelor <- c('6', '1', '3', '1')
University <- c('6', '2', '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', 'Developer, Back', 'Developer, front', 'Engineer')
Salary <- c(120, 340, 72, 400)
Master <- c('1', '2', '3', '4')
Bachelor <- c('6', '1', '3', '1')
University <- c('6', '2', '0', '2')
data1 <- data.frame(DevType, Salary, Master, Bachelor, University)

data1 <- gather(data1, key, value, -DevType, -Salary)

# use grouped bar chart instead
ggplot(data1, aes(x = DevType, y = Salary, fill = key)) +
     geom_bar(position = "dodge", stat = "identity")

...输出:

注意:如原文post所述,关键变量的工资水平在x轴变量的每个类别中都是恒定的,因此图表不是特别有意思。