如何在ggplot2中绘制条形图中的2列?

问题描述 投票:0回答:1

我想根据高血压、意识、治疗和控制将我的数据集绘制成 4 个不同的图表:

hypertension_table_combined_sex

我正在尝试在堆叠条形图上绘制图表,年龄类别位于我的 x 轴上。 我想复制下图:

Desired graph

我正在寻找在 1 x 轴类别“18-34、35-39...”下绘制 Hypertension_Male 和 Hypertension_Female 图表的解决方案

任何帮助都会非常有帮助!谢谢!

我尝试创建一个堆积条形图,但它总是变成错误,我每个图表只能使用 1 个数据列。

r statistics rstudio data-analysis
1个回答
0
投票

您问题中所需的图是dodged条形图,而不是stacked条形图。

目前您的数据格式不适合绘图。理想情况下,所有数字都应位于一列中,然后您可以有一列用于性别,一列用于绘图显示的变量。这称为旋转为长格式。

完成后,我们可以将填充美学设置为性别,并在

position = 'dodge'
中指定
geom_col
。要获得所有四个图,我们可以根据另一个变量进行分面。

library(tidyverse)

df %>%
  pivot_longer(-1, names_sep = '_', names_to = c('plot', 'gender')) %>%
  ggplot(aes(age_category, value, fill = gender)) +
  geom_col(position = 'dodge') +
  facet_wrap(~plot) +
  scale_fill_manual(values = c('#e87a30', '#4868b0')) +
  theme_minimal() +
  theme(legend.position = 'top',
        panel.grid = element_blank(),
        strip.text = element_text(size = 14, face = 2)) +
  labs(x = NULL, y = NULL, fill = NULL)


使用的数据 - 通过 OCR 从相关图片中获取

df <- structure(list(age_category = c("18-34", "35-39", "40-44", "45-49", 
"50-54", "55-59", "60-64", "=65"), Hypertension_Male = c(4.681518, 
10.197145, 9.954751, 12.210309, 18.281037, 17.910448, 21.917808, 
28.461649), Hypertension_Female = c(7.570484, 15.567641, 20.633484, 
24.517906, 21.964529, 27.951153, 26.849315, 27.484472), Awareness_Male = c(7.524809, 
10.026385, 10.35503, 10.75, 19.661017, 17.456621, 17.696629, 
22.638869), Awareness_Female = c(22.01705, 26.12137, 34.91124, 
37.5, 30.84746, 37.86962, 34.83146, 28.19444), Treatment_Male = c(5.539773, 
8.443272, 9.171598, 10.25, 15.932203, 15.976331, 16.011236, 20.555556
), Treatment_Female = c(17.75568, 23.48285, 30.47337, 34, 28.13559, 
34.31953, 32.30337, 24.72222), Control_Male = c(14.63141, 12.396694, 
9.701493, 7.990605, 11.538462, 6.470588, 11.627907, 12.576687
), Control_Female = c(42.682693, 28.09917, 29.10448, 22.59887, 
23.07692, 25.86253, 20.34884, 13.49693)), class = "data.frame", row.names = c(NA, 
-8L))
© www.soinside.com 2019 - 2024. All rights reserved.