繁体   English   中英

如何在 R 中使用折线图实现堆积条形图

[英]How to implement stacked bar graph with a line chart in R

我有一个包含 y 变量为Year和 x 变量为(A, B, C(%))的数据集。 我在这里附上了数据集。

dput(result)
structure(list(Year = 2008:2021, A = c(4L, 22L, 31L, 48L, 54L, 
61L, 49L, 56L, 59L, 85L, 72L, 58L, 92L, 89L), B = c(1L, 2L, 6L, 
7L, 14L, 21L, 15L, 27L, 27L, 46L, 41L, 26L, 51L, 62L), C... = c(25, 
9.09, 19.35, 14.58, 25.93, 34.43, 30.61, 48.21, 45.76, 54.12, 
56.94, 44.83, 55.43, 69.66)), class = "data.frame", row.names = c(NA, 
-14L))

在此处输入图像描述

变量 A 和 B 将绘制为堆积条形图,C 将绘制为同一图中的折线图。 我已经使用 excel 生成了如下图:

在此处输入图像描述

如何在 R 中创建相同的图?

您首先需要重新塑造更长的形状,例如使用 tidyr 中的tidyr pivot_longer() ,然后您可以使用ggplot2在两个单独的图层中绘制条形图和线条。 geom_bar(aes())中的fill =参数可让您根据分类变量对每个柱进行分层 - namepivot_longer()自动创建。

library(ggplot2)
library(tidyr)

dat |> 
  pivot_longer(A:B) |> 
  ggplot(aes(x = Year)) +
  geom_bar(stat = "identity", aes(y = value, fill = name)) +
  geom_line(aes(y = `C(%)`), size = 2)

reprex 包(v2.0.1) 创建于 2022-06-09

您要求叠加条,在这种情况下无需旋转,您可以添加单独的图层。 但是我认为这可能会混淆或误导许多人 - 通常在堆叠的情节中,条形图是堆叠的,而不是重叠的,因此请谨慎使用!

library(ggplot2)
library(tidyr)

dat |> 
  ggplot(aes(x = Year)) +
  geom_bar(stat = "identity", aes(y = A), fill = "lightgreen") +
  geom_bar(stat = "identity", aes(y = B), fill = "red", alpha = 0.5) +
  geom_line(aes(y = `C(%)`), size = 2) +
  labs(y = "", caption = "NB: bars are overlaid, not stacked!")

reprex 包(v2.0.1) 创建于 2022-06-09

我提出这个:

library(data.table)
library(ggplot2)
library(ggthemes) 

dt <- fread("dataset.csv")
dt.long <- melt(dt, id.vars = c("Year"))
dt.AB <- dt.long[variable %in% c("A", "B"), ]
dt.C <- copy(dt.long[variable == "C(%)", .(Year, variable, value = value * 3/2)])

ggplot(dt.AB, aes(x = Year, y = value, fill = variable), ) +
  geom_bar(stat = "identity") +
  geom_line(data=dt.C, colour='red', aes(x = Year, y = value)) +
  scale_x_continuous(breaks = pretty(dt.AB$Year, 
                                     n = length(unique(dt.AB$Year)))) +
  scale_y_continuous(
    name = "A&B",
    breaks = seq (0, 150, 10),
    sec.axis = sec_axis(~.*2/3, name="C(%)", breaks = seq (0, 100, 10))
  ) + theme_hc() + 
  scale_fill_manual(values=c("grey70", "grey50", "grey30")) +
  theme( 
    axis.line.y = element_line(colour = 'black', size=0.5, 
                               linetype='solid'))

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM