在同一个条形图中按年份绘制多个变量

Posted

技术标签:

【中文标题】在同一个条形图中按年份绘制多个变量【英文标题】:Plot multiple variables by year in the same bar plot 【发布时间】:2021-07-31 23:51:09 【问题描述】:

我无法弄清楚如何在 ggplot 中创建特定风格的情节。

我在 tibble 中有如下所示的数据:

indicator   2015   2019

wdi_lfpr    55.6   58.2
wdi_lfprf   34.9   38.2
wdi_lfprm   77.0   78.4

每一年的数值都是百分比。我想绘制这些图,以便每个指标并排显示,并显示每年(2015 年、2019 年)的值。

我不知道如何在 ggplot 中解决这个问题。感谢您的帮助。

编辑:感谢评论者的建议,我已将我的数据重新调整为这种格式:

indicator   year    value
wdi_lfpr    2015    55.6 
wdi_lfprm   2015    34.9 
wdi_lfprf   2015    77.0
wdi_lfpr    2019    58.2
wdi_lfprm   2019    58.2
wdi_lfprf   2019    58.2

【问题讨论】:

首先,将您的数据设为tidy。 ggplot2(以及 tidyverse 的其余部分)旨在处理整洁的数据。您的数据不整洁,因为您的列名中有信息。 pivot_longer() 将成为你的朋友。 您需要重塑数据,以便在 y 中绘制的值在单列中,而不是在 2 列中。在此处查看相关示例:***.com/questions/42820677/… 【参考方案1】:

一种解决方案是:

library(ggplot2)
library(tidyverse)
library(dplyr)

df = data.frame(year = c(2015, 2019),
                wdi_lfpr = c(55.6, 58.2),
                wdi_lfprf = c(34.9, 38.2),
                wdi_lfprm = c(77.0, 78.4)) %>%
        pivot_longer(cols = 2:4, names_to = "indicator", values_to = "percent")


ggplot(df, aes(x = as.factor(year), y = percent, fill = indicator)) +
        geom_bar(stat = "identity", position = "dodge")

或者:

ggplot(df, aes(x = as.factor(indicator), y = percent, fill = as.factor(year))) +
        geom_bar(stat = "identity", position = "dodge")

【讨论】:

【参考方案2】:

感谢大家的帮助。在重塑数据后,我能够根据建议的输入达到这个解决方案:

ggplot(long_df, aes(x = as.factor(indicator), y = value, fill = as.factor(year))) +
        geom_bar(stat = "identity", position = "dodge")

这让我产生了这个数字,这是我的目标:

【讨论】:

【参考方案3】:

整理您的数据

正如其他人所提到的,您需要先将数据设为tidy,然后才能充分使用ggplot2

# Define the dataset
data <- tribble(
  ~indicator  , ~"2015", ~"2019",
  "wdi_lfpr"  , 55.6   , 58.2,
  "wdi_lfprf" , 34.9   , 38.2,
  "wdi_lfprm" , 77.0   , 78.4
)

# 'pivot' the data so that every column is a variable
tidy_data <- data %>% 
  tidyr::pivot_longer(c(`2015`, `2019`), names_to = "year", values_to = "value")

用颜色绘制

在您的示例图中存在一些问题。

轴没有正确标记 各组中的条之间没有什么可区分的 x 轴文本与数据中的任何列都不匹配

幸运的是,如果您谨慎选择 fill 美学,ggplot2 默认会处理大部分问题:

ggplot(tidy_data, aes(x = indicator, fill = year, y = value)) +
  geom_col(position = "dodge")

经典风格的情节

如果您更喜欢经典的 r-graphics 样式(类似于您的示例)并且您不想使用颜色,您可以使用类似 theme_classic() 的内容来实现:

ggplot(tidy_data, aes(x = indicator, group = year, y = value)) +
  geom_col(position = "dodge", colour = "white") +
  theme_classic()

【讨论】:

以上是关于在同一个条形图中按年份绘制多个变量的主要内容,如果未能解决你的问题,请参考以下文章

Matplotlib 在一张图中绘制多个条形图

绘制具有多个组的条形图

如何从两个或多个数据框中绘制分组条形图

spss如何删除堆积条形图中的某块数据

R语言 条形图

仅使用一个变量(无值或排名)对 ggplot2 条形图中的条形重新排序?