在R中Y轴上具有两个变量的箱的频率分布直方图

在R中Y轴上具有两个变量的箱的频率分布直方图,r,histogram,frequency-distribution,R,Histogram,Frequency Distribution,我得到了这个数据框,它同时是一个频率分布,并且被赋予了绘制整个人口年龄分布直方图的任务,在图中添加了男性和女性概况。我需要实现的是这样一个柱状图,例如:男性和女性轮廓重叠,但x轴上的年龄类别。这是我的代码: 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,

我得到了这个数据框,它同时是一个频率分布,并且被赋予了绘制整个人口年龄分布直方图的任务,在图中添加了男性和女性概况。我需要实现的是这样一个柱状图,例如:男性和女性轮廓重叠,但x轴上的年龄类别。这是我的代码:

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")
AgeClasses这种类型的图是堆叠条形图。要使用ggplot2最轻松地生成它,您需要将数据转换为长格式,以便一列包含所有男性和女性的计数,另一列包含标签为“男性”和“女性”的因子变量。您可以使用
tidyr::pivot\u longer

库(ggplot2)
图书馆(tidyr)
枢轴长度(df,cols=c(雌性,雄性))%>%
ggplot()+
geom_col(映射=aes(x=AgeClasses,y=value,fill=name))+
实验室(x=“年龄”,y=“计数”,fill=“性别”)

请尝试以下代码:

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")


AgeClassesAllan是对的,但要在绘图中创建一个,需要将条形图重叠起来,而不是堆叠起来。我是这样做的:


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))

图书馆(GG2)
图书馆(dplyr)

AgeClasses您需要改进创建示例数据帧的方式。这里有一种方法:

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)
df