用 R 中的表格列制作堆积条形图

问题描述

我正在尝试创建一个显示身体成分的堆叠条形图。我有一个看起来像这样的表/数据集(我不知道正确的术语):

structure(list(data.Date = structure(1:7,.Label = c("2021-03-06","2021-03-07","2021-03-08","2021-03-09","2021-03-10","2021-03-11","2021-03-12"),class = "factor"),total_bf = c(19.6612,18.2182,19.6803,21.7047,18.126,19.7,19.1424),total_muscle = c(41.5948,43.043,42.1578,42.1866,43.4017,42.2,42.2728),other = c(37.544,38.8388,38.0619,38.0087,39.1723,38.1,38.2848)),class = "data.frame",row.names = c(NA,-7L))

每一列都是以公斤为单位的重量。它们加起来就是受试者的总体重。我想要的是一个堆叠条形图,其中每个条形代表一个日期,每个条形由 total_bf、total_muscle 和其他分割。我见过的所有指南和问答似乎都不适用于我的情况。也许这是因为我是新手,但我尝试过的一切都没有奏效。

我正在努力实现的一个例子:

enter image description here

唯一的区别是,在我的图表中,蓝色表示体脂 (total_bf),绿色表示其他,红色表示肌肉 (total_muscle)。

解决方法

您可以使用 tidyr::pivot_longer() 函数将数据从宽格式转换为长格式:

library(ggplot2)

df <- structure(list(
  data.Date = structure(
    1:7,.Label = c("2021-03-06","2021-03-07","2021-03-08","2021-03-09","2021-03-10","2021-03-11","2021-03-12"),class = "factor"),total_bf = c(19.6612,18.2182,19.6803,21.7047,18.126,19.7,19.1424),total_muscle = c(41.5948,43.043,42.1578,42.1866,43.4017,42.2,42.2728),other = c(37.544,38.8388,38.0619,38.0087,39.1723,38.1,38.2848)
),class = "data.frame",row.names = c(NA,-7L))

long <- tidyr::pivot_longer(df,-data.Date)

然后使用 ggplot2,默认值已经制作了堆积条形图,因此您只需要指定 xyfill 美学。

ggplot(long,aes(data.Date,value,fill = name)) +
  geom_col()

由于您的日期被编码为一个因子,如果您想将其编码为一个真实的日期,您可以按如下方式进行转换:

long$date <- as.Date(strptime(as.character(long$data.Date),format = "%Y-%m-%d"))

ggplot(long,aes(date,fill = name)) +
  geom_col()

reprex package (v0.3.0) 于 2021 年 3 月 12 日创建