当ggplot2中辅助Y轴值为负时,如何将条形图方向反转为向上?

问题描述 投票:0回答:1

我正在尝试使用 ggplot2 创建双轴图,其中主 y 轴显示代表“对数赔率”的折线图,其值范围为 0 到 -8,辅助 y 轴显示“加权”的条形图数数'。条形图需要显示零线上方的计数,但由于主 y 轴上的负值,条形图向下绘制。

这是我面临的挑战:

代表“对数赔率”指标的折线图正确地向下减少,从 0 到 -8。但是,我希望条形图在此刻度上从相当于零的位置(折线图上的 -8 标记)开始,并随着计数的增加而向上延伸。即使条形与主轴上的负刻度对齐,也需要表示正值。

到目前为止,我尝试使用变换因子来对齐两个尺度。我尝试根据主轴的范围标准化辅助轴,然后应用额外的变换因子以使条形从零开始并向上增长。但是,条形图继续显示为从绘图区域顶部下降,而不是从折线图的基线上升。

这是我们在代码中尝试过的:

library(ggplot2)

# Sample data
set.seed(123)
bucket_label <- seq(0, 2.5, by=0.5)
log_odds <- seq(-1, -8, length.out=length(bucket_label))
Count <- sample(100:1000, length(bucket_label), replace = TRUE)
BucketedData_nonmat <- data.frame(bucket_label, log_odds)
Count.1 <- data.frame(bucket_label, Count)

# Current plot code
fit_range <- range(BucketedData_nonmat$log_odds, na.rm = TRUE)
freq_range <- range(Count.1$Count, na.rm = TRUE)
transformation_factor <- (freq_range[2] / fit_range[2]) /8

ggplot() +
  geom_bar(data = Count.1, aes(x = bucket_label, y = Count / transformation_factor), stat = "identity", fill = "grey", color = "grey", alpha = 0.2) +
  geom_line(data = BucketedData_nonmat, aes(x = bucket_label, y = log_odds), size = 1) +
  scale_y_continuous(
    name = "Log Odds",
    sec.axis = sec_axis(~ . * transformation_factor, name = "Weighted Count")
  )


我最终想要的是条形图朝上,并且在视觉上从折线图的末端开始向上移动,两个图表都从相同的基线开始,即使其中一个实际上是负数。

有人遇到过类似的挑战或对如何在 ggplot2 中达到预期结果有建议吗?

这是当前代码产生的结果:

r ggplot2
1个回答
0
投票
ggplot() +
  geom_bar(data = Count.1,    # kept for verification of alignment
           aes(x = bucket_label, y = Count / transformation_factor), 
           stat = "identity", fill = "grey", color = "grey80", alpha = 0.1) +
  geom_tile(data = Count.1, 
           aes(x = bucket_label, width = 0.9*0.5,
               y = -4 + (Count / transformation_factor) / 2,
               height = 8 + (Count / transformation_factor)),
           stat = "identity", fill = "grey", color = "grey", alpha = 0.3) +
  geom_line(data = BucketedData_nonmat, aes(x = bucket_label, y = log_odds), size = 1) +
  scale_y_continuous(
    name = "Log Odds",
    sec.axis = sec_axis(~ (. + 8) * -transformation_factor, name = "Weighted Count")
  )

© www.soinside.com 2019 - 2024. All rights reserved.