ggplot:更改左右轴范围

ggplot: change left and right axis ranges

我需要使用 ggplot 绘制两个散点图。一种是所有值都为正值,范围在 (0,0.02) 之间,另一种是所有值都是负值,范围在 (0,-1500) 之间。我曾尝试使用 sec_axis 来传达不同的尺度,但我已经能够生成以下内容。

这是使用

制作的
library(tidyverse)
library(ggplot2)
scl = with(use_deciles, max(abs(coef_navy))/max(abs(coef_maroon)))

ggplot(use_deciles) + 
  geom_point(aes(x = decile_navy, y = coef_navy, color = 'navy')) + 
  geom_point(aes(x = decile_maroon, y = coef_maroon*scl, color = 'maroon')) +    
  labs(x = "Group", y = "") +
  scale_color_manual(values = c('maroon', 'navy')) + 
  scale_y_continuous(sec.axis = sec_axis(~. /scl, name = "2nd axis"))

如您所见,scl 提供了左右轴之间的最佳重新缩放,但这是我的问题:

如何调整y轴的范围,使0在左轴的顶部,在右轴的底部?

鉴于我只能将 sec_axis 定义为左轴的线性变换,我不确定此选项是否真的可以移动标签。如果我需要手动重新标记 y 轴,那可能没问题,但我想首先了解如何在此处叠加散点图。

提前致谢。

如果我正确理解您的问题,我认为不更改值是不可能的。我不认为你可以在不影响右轴的情况下改变左轴的限制,我不相信你可以独立地改变每个轴的标签。

一个潜在的替代方法是使用 facet_wrap() 函数将它们绘制在彼此之上,例如

library(tidyverse)

# Create example data
use_deciles <- data.frame(count = 1:10,
                          coef_maroon = c(0.005, 0.01, 0.015, 0.02, 0.03, 0.07, 0.09, 0.12, 0.15, 0.2),
                          coef_navy= c(0, -200, -400, -600, -800, -700, -900, -900, -1100, -1200))

# Original method
scl = with(use_deciles, max(abs(coef_navy))/max(abs(coef_maroon)))

ggplot(use_deciles) + 
  geom_point(aes(x = count, y = coef_navy, color = 'navy')) + 
  geom_point(aes(x = count, y = coef_maroon*scl, color = 'maroon')) +    
  labs(x = "Group", y = "") +
  scale_color_manual(values = c('maroon', 'navy')) + 
  scale_y_continuous(sec.axis = sec_axis(~. /scl, name = "2nd axis"))

# Facet_wrap method (on top of each other)
use_deciles %>% 
  pivot_longer(-count) %>%
  ggplot(aes(x = count, y = value, colour = name)) +
  geom_point() +
  scale_color_manual(values = c('maroon', 'navy')) +
  facet_wrap(~name, scales = "free_y", ncol = 1)

reprex package (v2.0.1)

创建于 2021-08-31

用@jared_mamrot数据试试这样的东西:

ggplot(use_deciles) + 
  geom_point(aes(x = count, y = coef_navy, color = 'navy')) + 
  geom_point(aes(x = count, y = coef_maroon*scl-1200, color = 'maroon')) +    
  labs(x = "Group", y = "") +
  scale_color_manual(values = c('maroon', 'navy')) + 
  scale_y_continuous(sec.axis = sec_axis(~(.+1200)/scl, name = "2nd axis"))

你会得到: