【问题标题】:how to plot multiple area plots with ggplot2?如何用 ggplot2 绘制多个区域图?
【发布时间】:2020-11-14 17:04:24
【问题描述】:

我正在尝试实现如下图所示的复杂数据。但是使用 R 和 ggplot2。

根据观察:

  1. 每组数据可视化上方有“非洲”、“亚洲”、“欧洲”等6个不同的组;
  2. 1 组,包括每个大陆 3 个区域地块;
  3. x 轴只出现在大洋洲最后一行的一组中
  4. 上面的图例只出现一次。
  5. 图上方有两个图例 - 风险组和条件
  6. 如您所见,非洲的人口以百万计(一张图表)、风险群体和条件。

我正在尝试使用我的 2 个数据集实现相同的结果。例如,对于印度,我希望在一行中包含一个症状图表,第二个是合并症图表。英国和巴基斯坦也是如此。以下是创建的一些假数据集:

  1. https://github.com/gabrielburcea/stackoverflow_fake_data/blob/master/fake_symptoms.csv
  2. 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


【解决方案1】:

这是一个好的开始——我不清楚你的一些目标,但这个答案应该能让你克服眼前的障碍。

## read in your data
count_symptoms = readr::read_csv("https://github.com/gabrielburcea/stackoverflow_fake_data/raw/master/fake_symptoms.csv")

## as mentioned in comments, removing `position = 'fill'` lets your chart show counts.
## (I'm skipping the unnecessary data conversions)
## And I'm removing the `ggplot2::` to make the code more readable...
## No other changes are made

india_count_symptoms <- count_symptoms %>%
  dplyr::filter(Country == "India")

india_sympt_plot <- ggplot(india_count_symptoms, aes(x = age_band, y = Count, group = symptoms, fill = symptoms)) +
  geom_area(color = "white") + 
  scale_x_discrete(limits = c("0-19", "20-39", "40-59","60+"), expand = c(0, 0)) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.1))) + 
  viridis::scale_fill_viridis(discrete = TRUE)

现在,我们不再为每个国家制作单独的图,而是使用构面:

## same plot code as above, but we give it the whole data set
## and add the `facet_grid` on
ggplot(count_symptoms, aes(x = age_band, y = Count, group = symptoms, fill = symptoms)) +
  geom_area(color = "white") + 
  scale_x_discrete(limits = c("0-19", "20-39", "40-59","60+"), expand = c(0, 0)) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.1))) +  
  viridis::scale_fill_viridis(discrete = TRUE) + 
  facet_grid(Country ~ .)

请注意,我们只有一个图例。你可以re-position it easily as shown here。可能我要做的下一个更改是在您的scale_y_continuous 中添加参数labels = scales::comma_format。我不知道你的 x 轴标签有什么问题。

对于完整的图,我建议为每一列绘制一个facet_grid,然后使用patchwork 包将它们组合成一个图像。看看在此基础上您能走多远,如果您仍然遇到问题,请提出一个专注于下一步的新问题。

【讨论】:

  • 你好 Gregor,非常感谢你的帮助。但是,我在帖子中添加了一些信息,因为我错过了一些东西。是的,你所做的工作会很好,但我想要在一行中为印度提供 2 个图表,一个用于症状,另一个用于合并症。其他国家也一样。
  • 对,我在回答中说 “我建议为每一列绘制一个 facet_grid 图,然后使用 patchwork 包将它们组合成一个图像。看看你能走多远以此为基础,如果您仍然遇到问题,请提出一个关注下一步的新问题。”.
  • 您将无法在同一个多面图中使用不同的filly 比例尺。所以每列图表都需要单独开发,然后粘在一起我推荐patchwork 包将它们粘在一起。我认为这个答案应该能让你走得更远,你可以分别开发它们。如果您遇到新问题,请提出一个新问题,说明您所处的位置以及当前的问题是什么。
  • 采纳了您的建议。非常好。将发布与此方面相关的另一个问题
猜你喜欢
  • 2023-03-22
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多