r - 如何显示比例 (0-1) 条形图以及具有不同轴的线数据?

标签 r ggplot2

我有三批数据要一起绘制:两个 geom_line() 在一个堆叠的 geom_bar() 之上。所有这些都在一个时间序列上,每年都有一个条形图和两条线值。 数据看起来像这样:

df <- data.frame(year = rep(1:5, each = 3),
                 cat = c("small", "med", "large"),
                 count = rep(sample(1:10, 5)),
                 line1 = rep(sample(30000:40000, 5), each = 3),
                 line2 = rep(sample(200:300, 5), each = 3))

将所有三个绘制在一起很容易,但我不想显示条形的 y 轴标签。相反,我希望左轴显示一条线,右轴显示另一条线。我希望情节看起来像这样:

like this

但要让左轴显示 line1 值(即 30000:40000 值)。我将如何着手包括两个线轴,但仍显示横跨绘图整个高度的条形?

library(ggplot2)
ggplot(data = df, aes(x=year)) +
  geom_bar(aes(y = count, x = year, fill = cat), position = "fill", stat="identity") +
  geom_line(aes(y = line1/max(line1))) +
  geom_line(aes(y = line2/max(line2)), color = "red") +
  scale_y_continuous(sec.axis = sec_axis(~.*max(df$line2), name = "line2 (red)"))

在两轴线图后简单地添加 geom_bar() 会导致条形图不显示,因为线条数据的比例远远超出比例 (0-1) 条形图数据的比例:

ggplot(data = df, aes(x=year)) +
  geom_line(aes(y = line1)) +
  geom_line(aes(y = line2*100), color = "red") +
  scale_y_continuous(sec.axis = sec_axis(~./100, name = "line2 (red)")) +
  geom_bar(aes(y = count, x = year, fill = cat), position = "fill", stat="identity")

我想要这些轴,但仍然显示条形图:

最佳答案

可以通过在线 dplyr 计算来完成:

library(dplyr); library(ggplot2)
ggplot(data = df, aes(x=year)) +
  geom_col(data = df %>% group_by(year) %>%
             mutate(share = count / sum(count) * max(df$line1)),
           aes(y = share, x = year, fill = cat)) +
  geom_line(aes(y = line1)) +
  geom_line(aes(y = line2*100), color = "red") +
  scale_y_continuous(sec.axis = sec_axis(~./100, name = "line2 (red)"))

enter image description here

关于r - 如何显示比例 (0-1) 条形图以及具有不同轴的线数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74725175/

相关文章:

r - 使用 geom_text 组织 geom_point 上的文本

r - 如何将数据帧(或向量)转换为矩阵以将 R 基线包用于除提供的示例数据之外的数据?

r - 在 ggplot2 中自定义条形图

r - 用线条覆盖堆叠的 ggplot2 条形图的每个条形图

r - 当只有预测网格的分辨率发生变化时,为什么预测多项式会发生巨大变化?

r - 如何在 R 中向 PCA 图中添加多个置信椭圆?

r - 将函数(分位数)应用于矩阵行并使用结​​果修改行

r - 使用 ggplot 包 R 更改图中 yaxis 面的标签

R + ggplot2 => 在分面饼图上添加标签

r - ggrepel : Repelling text in only one direction, 并返回排斥文本的值