R-在同一张图表上创建条形图和折线图,如何添加第二个y轴

时间:2018-12-24 11:05:11

标签: r ggplot2

我正在尝试创建一个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)) 

enter image description here

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

1 个答案:

答案 0 :(得分:3)

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))

enter image description here

但是,如果您特别希望进行一对一转换,例如说Y1的值100应该对应于Y2的值1(200到2,依此类推),然后更改转换(乘法)因子到100(100/1):transf_fact <- 100/1,您会得到:

enter image description here

transf_fact <- max(df$y)/max(df$y2)的优点是在使用两个不同的比例尺时以最佳方式使用绘图区域-尝试使用transf_fact <- 1000/1之类的东西,我想您会明白的。