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"))
你会得到:
我需要使用 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"))
你会得到: