gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:14:44 24 4
gpt4 key购买 nike

我正在尝试创建一个 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 以下。我也不确定如何在右侧添加另一个轴。

最佳答案

ggplot2 的 2.2.0 版开始, 可以添加 secondary axis - 参见 this详细的演示。此外,一些人已经用这种方法回答了问题:here , here , herehere .关于添加第二个 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 的方法我想你会明白的。

关于R - 在同一图表上创建条形图和线条,如何添加第二个 y 轴,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53912599/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com