【发布时间】:2020-11-14 17:04:24
【问题描述】:
我正在尝试实现如下图所示的复杂数据。但是使用 R 和 ggplot2。
根据观察:
- 每组数据可视化上方有“非洲”、“亚洲”、“欧洲”等6个不同的组;
- 1 组,包括每个大陆 3 个区域地块;
- x 轴只出现在大洋洲最后一行的一组中
- 上面的图例只出现一次。
- 图上方有两个图例 - 风险组和条件
- 如您所见,非洲的人口以百万计(一张图表)、风险群体和条件。
我正在尝试使用我的 2 个数据集实现相同的结果。例如,对于印度,我希望在一行中包含一个症状图表,第二个是合并症图表。英国和巴基斯坦也是如此。以下是创建的一些假数据集:
- https://github.com/gabrielburcea/stackoverflow_fake_data/blob/master/fake_symptoms.csv
- https://github.com/gabrielburcea/stackoverflow_fake_data/blob/master/fake_comorbidities%202.csv
我试图通过为每个国家/地区创建小型数据集,然后创建 2 个图,一个用于症状,另一个用于合并症,然后将它们加在一起。但这是一项繁重的工作,还会出现许多其他问题。 采用这种方法可能会出现问题。一个例子在这里:
india_count_symptoms <- count_symptoms %>%
dplyr::filter(Country == "India")
india_count_symptoms$symptoms <- as.factor(india_count_symptoms$symptoms)
india_count_symptoms$Count <- as.numeric(india_count_symptoms$Count)
library(viridis)
india_sympt_plot <- ggplot2::ggplot(india_count_symptoms, ggplot2::aes(x = age_band, y = Count, group = symptoms, fill = symptoms)) +
ggplot2::geom_area(position = "fill", color = "white") +
ggplot2::scale_x_discrete(limits = c("0-19", "20-39", "40-59","60+"), expand = c(0, 0)) +
ggplot2::scale_y_continuous(expand = expansion(mult = c(0, 0.1))) +
viridis::scale_fill_viridis(discrete = TRUE)
india_sympt_plot
这是我得到的:
如你所见:
一个。年龄范围没有很好地对齐
b.如果我采用这种方法,我最终会为每个国家/地区的每个地块提供传说
c。 y 轴没有给我计数,它一直到 1。并且直觉上不正确。
d。对合并症做同样的事情,然后得到与上述 3 点相同的问题。
因此,我想采用一种更简单的方法来获得与第一张图片相似的情节,并表达条件:从 1 到 5 分,但针对我的 3 个国家以及症状和合并症。但是,我的真实数据集更大,包含 5 个国家,但具有相同的绘图 - 症状和合并症。
在 RStudio 中,有没有更好的方法通过 ggplot2 实现这一点?
【问题讨论】:
-
一些cmets:(a)“年龄带没有很好地对齐”是什么意思?你的意思是你想让它们旋转,所以它们是垂直的?见this FAQ on rotating and spacing axis labels in ggplot。
-
(b) 重新传说:我建议使用构面 - 可能是
facet_grid。这将简化您的代码并自动组合图例。 -
如观察到的那样,0-19 和 63+ 从 x 轴的起点开始,在轴的终点结束。无论如何我都可以轮换它们,只是出现了其他问题,如上所述
-
(c)
position = 'fill'告诉 geom_area` 您希望 y 轴填充从 0 到 1 的空间。删除该设置,默认值将显示您的计数。 -
是的,当我删除 position = "fill" 时,我没有绘制任何区域,而是到处查看如何绘制这些区域。解决一件小事花了 4 个小时。
标签: r ggplot2 charts stacked-chart