【问题标题】:R - creating a bar and line on same chart, how to add a second y axisR - 在同一图表上创建条形和线,如何添加第二个 y 轴
【发布时间】:2019-05-23 13:37:43
【问题描述】:

我正在尝试创建一个显示条形图和折线图相互叠加的 ggplot2 图。在 excel 中,这将通过添加第二个轴来完成。

x 轴代表产品类型,条形图的 y 值应该代表收入,折线图我想代表利润率为百分比。折线图和条形图的值应该是相互独立的,即没有这种关系。

require(ggplot2)    
df <- data.frame(x = c(1:5), y = abs(rnorm(5)*100))
df$y2 <- abs(rnorm(5))

ggplot(df, mapping= aes(x=as.factor(`x`), y = `y`)) + 
  geom_col(aes(x=as.factor(`x`), y = `y`),fill = 'blue')+
  geom_line(mapping= aes(x=as.factor(`x`), y = `y`),group=1) +
  geom_label(aes(label= round(y2,2))) +
  scale_y_continuous() +
  theme_bw() + 
  theme(axis.text.x = element_text(angle = 20,hjust=1)) 

上面的图片几乎产生了我想要的。但是,缩放比例不正确 - 我需要按大小对 1.38 和 0.23 值进行排序,即点 0.23 应显示在 1.38 以下。我也不确定如何在右侧添加另一个轴。

【问题讨论】:

  • 这种带有两个轴刻度的图表通常被认为是不好的做法:请参阅 herehere
  • @VY - 我认为它们非常有用,尤其是它很容易阅读且不会误导。有没有办法做到这一点?

标签: r ggplot2


【解决方案1】:

ggplot2 的2.2.0 版本开始,可以添加secondary axis - 请参阅this 详细演示。此外,有些人已经用这种方法回答了问题:herehereherehere。关于添加第二个 OY 轴的有趣讨论here

主要思想是需要对第二个 OY 轴应用变换。在下面的示例中,变换因子是每个 OY 轴的最大值之间的比率。

# Prepare data
library(ggplot2)
set.seed(2018)
df <- data.frame(x = c(1:5), y = abs(rnorm(5)*100))
df$y2 <- abs(rnorm(5))

# The transformation factor
transf_fact <- max(df$y)/max(df$y2)

# Plot
ggplot(data = df,
       mapping = aes(x = as.factor(x),
                     y = y)) +
  geom_col(fill = 'blue') +
  # Apply the factor on values appearing on second OY axis
  geom_line(aes(y = transf_fact * y2), group = 1) +
  # Add second OY axis; note the transformation back (division)
  scale_y_continuous(sec.axis = sec_axis(trans = ~ . / transf_fact, 
                                         name = "Second axis")) +
  geom_label(aes(y = transf_fact * y2,
                 label = round(y2, 2))) +
  theme_bw() + 
  theme(axis.text.x = element_text(angle = 20, hjust = 1))

但是,如果您特别希望进行一对一转换,例如,假设 Y1 中的值 100 应该对应于 Y2 中的值 1(200 到 2 等等),然后更改转换(乘法)因子到 100 (100/1): transf_fact &lt;- 100/1 你得到这个:

transf_fact &lt;- max(df$y)/max(df$y2) 的优点是在使用两种不同比例时以最佳方式使用绘图区域 - 尝试类似 transf_fact &lt;- 1000/1 的方法,我想你会明白的。

【讨论】:

  • 您好,感谢您的回答。你能解释一下你所说的转换因子是什么意思吗?你是怎么想到使用那个特定的?
  • 只是一个常数,用于将一个比例的值相乘以转换为另一个比例。是sec_axis 要求的一对一转换(请参阅?sec_axis)。 Here 是另一个演示。您可以尝试该因子的其他值,而不仅仅是 max(y1)/max(y2) 比率(这个肯定适用于快速示例)。
  • 我更新了我的答案,添加了一个额外的示例,这可能阐明了转换/乘法因子的重要性。
  • 感谢 Valentin,这很有帮助!我很高兴能够做到这一点,因为我正在尝试在 R 中重新创建我们的一些 excel 功能,其中之一就是这样的图表
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-20
  • 1970-01-01
  • 2021-05-28
  • 2014-05-07
  • 1970-01-01
  • 2015-09-01
  • 1970-01-01
相关资源
最近更新 更多