[英]How to make grouped bins in histogram in R with a variable other than frequency on the y axis?
[英]Frequency Distribution Histogram with Bins with Two Variables on the Y-axis in R
我得到了这个数据框,它同时是一个频率分布,并被赋予了绘制整个人口年龄分布的直方图的任务,并将男性和女性的轮廓添加到图中。 我需要实现的是像这样的直方图,例如:男性和女性轮廓重叠的双变量频率条形图,但在 x 轴上有 AgeClasses。 这是我的代码:
AgeClasses <- c('0-9','10-19','20-29','30-39','40-49', '50-59', '60-69','70-79','80-89', '90-99')
Frequencies <- c(1000,900,800,700,600,500,400,300,200,100)
SexRatioFM <- c(0.4,0.42,0.44,0.48,0.52,0.54,0.55,0.58,0.6,0.65)
df$Females <- c(SexRatioFM*Frequencies)
df$Males <- c(Frequencies-Females)
library(ggplot2)
ggplot(df) +
geom_bar(mapping = aes(x = AgeClasses, y = Females), stat = "identity")
我非常感谢您帮助解决此任务。
这种类型的图是堆积条形图。 为了使用 ggplot2 最轻松地生成它,您需要将数据转换为长格式,以便一列包含男性和女性的所有计数,另一列包含一个带有标签“男性”和“女性”的因子变量。 您可以使用tidyr::pivot_longer
执行此操作:
library(ggplot2)
library(tidyr)
pivot_longer(df, cols = c(Females, Males)) %>%
ggplot() +
geom_col(mapping = aes(x = AgeClasses, y = value, fill = name)) +
labs(x = "Age", y = "Count", fill = "Gender")
试试下面的代码:
AgeClasses <- c('0-9','10-19','20-29','30-39','40-49', '50-59', '60-69','70-79','80-89', '90-99')
Frequencies <- c(1000,900,800,700,600,500,400,300,200,100)
SexRatioFM <- c(0.4,0.42,0.44,0.48,0.52,0.54,0.55,0.58,0.6,0.65)
Females <- SexRatioFM*Frequencies
Males <- Frequencies-Females
df <- data.frame(AgeClasses=AgeClasses, Females=Females, Males=Males)
df <- reshape2::melt(df, id.vars = 'AgeClasses')
library(ggplot2)
ggplot(df) +
geom_bar(mapping = aes(x = AgeClasses, y = value, fill=variable), stat = "identity")
Allan 是对的,但要在情节中制作一个,您需要将条形叠加而不是堆叠。 我是这样做的:
library(ggplot2)
library(dplyr)
AgeClasses <- c('0-9','10-19','20-29','30-39','40-49', '50-59', '60-69','70-79','80-89', '90-99')
Frequencies <- c(1000,900,800,700,600,500,400,300,200,100)
SexRatioFM <- c(0.4,0.42,0.44,0.48,0.52,0.54,0.55,0.58,0.6,0.65)
df <- tibble(
Females = c(SexRatioFM*Frequencies),
Males = c(Frequencies-Females),
AgeClasses = AgeClasses,
Frequencies=Frequencies,
SexRatioFM = SexRatioFM)
df %>% select(AgeClasses, Males, Females) %>%
tidyr::pivot_longer(cols=c(Males, Females), names_to = "gender", values_to="val") %>%
ggplot() +
geom_bar(mapping = aes(x = AgeClasses, y=val, fill=gender, alpha=gender), stat="identity", position="identity") +
scale_alpha_manual(values=c(.5, .4))
您需要修改创建示例数据框的方式。 这是一种方法:
df <- data.frame(
AgeClasses = c('0-9','10-19','20-29','30-39','40-49', '50-59', '60-69','70-79','80-89', '90-99'),
Frequencies = c(1000,900,800,700,600,500,400,300,200,100),
SexRatioFM = c(0.4,0.42,0.44,0.48,0.52,0.54,0.55,0.58,0.6,0.65))
df$Females = df$SexRatioFM*df$Frequencies
df$Males = df$Frequencies-df$Females
library(ggplot2)
ggplot(df) +
geom_bar(mapping = aes(x = AgeClasses, y = Females), fill="purple", stat = "identity", alpha=.8) +
geom_bar(mapping = aes(x = AgeClasses, y = Males), fill="navy blue", stat = "identity", alpha=.4)
你应该得到这样的东西:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.