我正在尝试创建一个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以下。我也不确定如何在右侧添加另一个轴。
随着2.2.0版本开始ggplot2
,就可以增加一个辅助轴-看到这个详细的演示。另外,一些已经用这种方法回答了问题:这里,这里,这里或这里。关于在此处添加第二个OY轴的有趣讨论。
主要思想是需要为第二个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 <- 100/1
您得到了:
的优点transf_fact <- max(df$y)/max(df$y2)
是,当使用两个不同的比例尺时以最佳方式使用绘图区域-尝试类似的方法transf_fact <- 1000/1
,我想您会明白的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句