如何用ggplot2绘制多个面积图?

how to plot multiple area plots with ggplot2?

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

据观察:

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

我正在尝试使用我的 2 个数据集获得相同的结果。以印度为例,我想要一条线,一张症状图表,第二条线是合并症图表。英国和巴基斯坦也一样。以下是创建的一些假数据集:

  1. https://github.com/gabrielburcea/Whosebug_fake_data/blob/master/fake_symptoms.csv
  2. https://github.com/gabrielburcea/Whosebug_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 是否有更好的方法来实现这一点?

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

## read in your data
count_symptoms = readr::read_csv("https://github.com/gabrielburcea/Whosebug_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 包将它们组合成一个图像。看看你能基于此得到多少,如果你仍然有问题,请提出一个新的问题,重点放在下一步。