gpt4 book ai didi

r - ggplot2 3.1.0 中的自定义 y 轴刻度和辅助 y 轴标签

转载 作者:行者123 更新时间:2023-12-04 00:59:44 25 4
gpt4 key购买 nike

编辑 2

ggplot2-package 的当前开发版本确实解决了我在下面的问题中提到的错误。使用安装开发版本

devtools::install_github("tidyverse/ggplot2")

编辑

这似乎是 sec_axis 的错误行为在 ggplot2 3.1.0 是一个错误。开发人员已经认识到这一点,他们正在修复(参见 GitHub 上的 thread)。

目标

我有一个图形,其中 y 轴的范围从 0 到 1。我想添加一个范围从 0 到 0.5 的次要 y 轴(正好是主要 y 轴值的一半)。到目前为止没有问题。

使问题复杂化的是我对 y 轴进行了自定义变换,其中 y 轴的一部分以线性方式显示,其余部分以对数方式显示(请参见下面的代码示例)。引用 this postthis one .

问题

这使用 ggplot2 3.0.0 版效果很好,但使用最新版本 (3.1.0) 不再有效。请参阅下面的示例。我不知道如何在最新版本中修复它。

来自 changelog :

sec_axis() and dup_axis() now return appropriate breaks for the secondary axis when applied to log transformed scales



这种新功能似乎在混合变换 y 轴的情况下会中断。

可重现的示例

以下是使用 ggplot2 最新版本 (3.1.0) 的示例:
library(ggplot2)
library(scales)

#-------------------------------------------------------------------------------------------------------
# Custom y-axis
#-------------------------------------------------------------------------------------------------------

magnify_trans_log <- function(interval_low = 0.05, interval_high = 1, reducer = 0.05, reducer2 = 8) {

trans <- Vectorize(function(x, i_low = interval_low, i_high = interval_high, r = reducer, r2 = reducer2) {
if(is.na(x) || (x >= i_low & x <= i_high)) {
x
} else if(x < i_low & !is.na(x)) {
(log10(x / r)/r2 + i_low)
} else {
log10((x - i_high) / r + i_high)/r2
}
})

inv <- Vectorize(function(x, i_low = interval_low, i_high = interval_high, r = reducer, r2 = reducer2) {
if(is.na(x) || (x >= i_low & x <= i_high)) {
x
} else if(x < i_low & !is.na(x)) {
10^(-(i_low - x)*r2)*r
} else {
i_high + 10^(x*r2)*r - i_high*r
}
})

trans_new(name = 'customlog', transform = trans, inverse = inv, domain = c(1e-16, Inf))
}

#-------------------------------------------------------------------------------------------------------
# Create data
#-------------------------------------------------------------------------------------------------------

x <- seq(-1, 1, length.out = 1000)
y <- c(x[x<0] + 1, -x[x>0] + 1)

dat <- data.frame(
x = x
, y = y
)

#-------------------------------------------------------------------------------------------------------
# Plot using ggplot2
#-------------------------------------------------------------------------------------------------------

theme_set(theme_bw())
ggplot(dat, aes(x = x, y = y)) +
geom_line(size = 1) +
scale_y_continuous(
, trans = magnify_trans_log(interval_low = 0.5, interval_high = 1, reducer = 0.5, reducer2 = 8)
, breaks = c(0.001, 0.01, 0.1, 0.5, 0.6, 0.7, 0.8, 0.9, 1)
, sec.axis = sec_axis(
trans = ~.*(1/2)
, breaks = c(0.001, 0.01, 0.1, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5)
)
) + theme(
axis.text.y=element_text(colour = "black", size=15)
)

这会产生以下图:

ggplot_new

次 y 轴的标记对于轴的对数部分(低于 0.5)是正确的,但对于轴的线性部分是错误的。

如果我安装 ggplot2 3.0.0 使用
require(devtools)
install_version("ggplot2", version = "3.0.0", repos = "http://cran.us.r-project.org")

并运行与上面相同的代码,我得到下图,这就是我想要的:

ggplot_old

问题
  • 有没有办法在最新版本的 ggplot2 (3.1.0) 中解决这个问题?理想情况下,我想避免使用旧版本的 ggplot2(即 3.0.0)。
  • 是否有替代 sec_axis在这种情况下会起作用吗?
  • 最佳答案

    这是一个适用于 ggplot2 的解决方案版本 3.1.0 使用 sec_axis() ,并且只需要创建一个图。我们仍然使用 sec_axis()和以前一样,但不是将次轴的变换缩放 1/2,而是相反地缩放次轴上的中断。

    在这种特殊情况下,我们的工作相当简单,因为我们只需将所需的断点位置乘以 2。然后,将得到的断点正确定位到图形的对数和线性部分。之后,我们所要做的就是用他们想要的值重新标记中断。这回避了ggplot2的问题当我们自己进行缩放时,当它必须缩放混合变换时,会对中断位置感到困惑。粗鲁,但有效。

    不幸的是,目前似乎没有任何其他替代 sec_axis() 的方法。 (除了 dup_axis() 在这里没什么帮助)。但是,我很乐意在这一点上得到纠正!祝你好运,我希望这个解决方案对你有帮助!

    这是代码:

    # Vector of desired breakpoints for secondary axis
    sec_breaks <- c(0.001, 0.01, 0.1, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5)
    # Vector of scaled breakpoints that we will actually add to the plot
    scaled_breaks <- 2 * sec_breaks

    ggplot(data = dat, aes(x = x, y = y)) +
    geom_line(size = 1) +
    scale_y_continuous(trans = magnify_trans_log(interval_low = 0.5,
    interval_high = 1,
    reducer = 0.5,
    reducer2 = 8),
    breaks = c(0.001, 0.01, 0.1, 0.5, 0.6, 0.7, 0.8, 0.9, 1),
    sec.axis = sec_axis(trans = ~.,
    breaks = scaled_breaks,
    labels = sprintf("%.3f", sec_breaks))) +
    theme_bw() +
    theme(axis.text.y=element_text(colour = "black", size=15))

    结果图:

    enter image description here

    关于r - ggplot2 3.1.0 中的自定义 y 轴刻度和辅助 y 轴标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53080266/

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