我正在ggplot2绘制log2转换后的数据,但也想将未转换的等效值显示为辅助轴。由于数据已经过log2转换,因此我应该能够通过将2提高到该幂(~2^.)来逆转转换。在3.0.0版中,这很好用,但是升级到3.1.0之后,此代码不会产生任何错误,但会使辅助轴变得毫无意义:
df = data.frame(x = rnorm(100),
y = rnorm(100))
ggplot(df, aes(x,y)) +
geom_point() +
scale_y_continuous(sec.axis = sec_axis(trans=(~2^.)))
Run Code Online (Sandbox Code Playgroud)
辅助轴与其他公式(~.,,~. + 10和~ . * 10所有按预期工作)正常工作,仅~2^.给我带来任何问题。
我非常确定这与升级到版本3.1有关,因为根据发行说明,有一个更改专门sec_axis与日志转换后的数据一起使用,但是我无法弄清楚更改的内容以及其行为方式现在是。是否有人对此有所了解,或者除了降级到3.0之外,还有其他解决方法的想法?
> sessionInfo()
R version 3.5.1 (2018-07-02)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS High Sierra 10.13.6
Matrix products: default
BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/3.5/Resources/lib/libRlapack.dylib
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] ggplot2_3.1.0
loaded via a namespace (and not attached):
[1] Rcpp_0.12.19 withr_2.1.2 assertthat_0.2.0 crayon_1.3.4 dplyr_0.7.7 R6_2.3.0 grid_3.5.1
[8] plyr_1.8.4 gtable_0.2.0 magrittr_1.5 scales_1.0.0 pillar_1.3.0 rlang_0.3.0.1 lazyeval_0.2.1
[15] rstudioapi_0.7 bindrcpp_0.2.2 labeling_0.3 tools_3.5.1 glue_1.3.0 purrr_0.2.5 munsell_0.5.0
[22] yaml_2.2.0 compiler_3.5.1 pkgconfig_2.0.2 colorspace_1.3-2 tidyselect_0.2.5 bindr_0.1.1 tibble_1.4.2
Run Code Online (Sandbox Code Playgroud)
如评论中所述,当前是ggplot2版本3.1.0 的错误。
目前,针对您的情况的一种简单的解决方法是仅预定义所需的中断位置,在不发生转换的空间中它们会发生在这些位置,然后执行所需的转换。使用breaks参数必须正确定位。
试试这个代码:
library("ggplot2")
set.seed(7)
# Create some log (base 2) transformed data
df = data.frame(x = log2(runif(100, min = 0, max = 10)),
y = log2(runif(100, min = 0, max = 10)))
# A vector of your desired break positions in untransformed space
sec_breaks <- c(0.4,0.5,1,2,4,8,10)
# Transform break positions
scaled_breaks <- log2(sec_breaks)
ggplot(df, aes(x,y)) +
geom_point() +
scale_y_continuous(sec.axis = sec_axis(trans = (~.),
breaks = scaled_breaks,
labels = sprintf("%.1f", sec_breaks)))
Run Code Online (Sandbox Code Playgroud)
给出了这个图: