如何用ggplot2绘制多个面积图?
how to plot multiple area plots with ggplot2?
我正在尝试实现如下图所示的复杂数据。但是使用 R 和 ggplot2.
据观察:
- 每组数据可视化上方有“非洲”、“亚洲”、“欧洲”等6个不同的组;
- 每个大陆 1 组包含 3 个区域图;
- x 轴只出现在一组,大洋洲的最后一行
- 图例只出现一次,在上面。
- 情节上方有两个图例-风险人群和条件
- 如您所见,非洲有百万人口(一张图表)、风险群体和条件。
我正在尝试使用我的 2 个数据集获得相同的结果。以印度为例,我想要一条线,一张症状图表,第二条线是合并症图表。英国和巴基斯坦也一样。以下是创建的一些假数据集:
- https://github.com/gabrielburcea/Whosebug_fake_data/blob/master/fake_symptoms.csv
- 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
包将它们组合成一个图像。看看你能基于此得到多少,如果你仍然有问题,请提出一个新的问题,重点放在下一步。
我正在尝试实现如下图所示的复杂数据。但是使用 R 和 ggplot2.
据观察:
- 每组数据可视化上方有“非洲”、“亚洲”、“欧洲”等6个不同的组;
- 每个大陆 1 组包含 3 个区域图;
- x 轴只出现在一组,大洋洲的最后一行
- 图例只出现一次,在上面。
- 情节上方有两个图例-风险人群和条件
- 如您所见,非洲有百万人口(一张图表)、风险群体和条件。
我正在尝试使用我的 2 个数据集获得相同的结果。以印度为例,我想要一条线,一张症状图表,第二条线是合并症图表。英国和巴基斯坦也一样。以下是创建的一些假数据集:
- https://github.com/gabrielburcea/Whosebug_fake_data/blob/master/fake_symptoms.csv
- 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
包将它们组合成一个图像。看看你能基于此得到多少,如果你仍然有问题,请提出一个新的问题,重点放在下一步。