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轴变量的每个类别中都是恒定的,因此图表不是特别有意思。
这些问题对我有帮助,但解决方案仍然不正确。
我的数据框:
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轴变量的每个类别中都是恒定的,因此图表不是特别有意思。