gpt4 book ai didi

r - 使用 ggplot2 对数正态刻度进行漂亮的刻度(动态而非手动)

转载 作者:行者123 更新时间:2023-12-02 07:16:48 26 4
gpt4 key购买 nike

我正在尝试使用 ggplot2 创建具有对数正态 y 刻度的性能图表。不幸的是,我无法为基本绘图函数生成漂亮的刻度。

这是我的例子:

library(ggplot2)
library(scales)

# fix RNG
set.seed(seed = 1)

# simulate returns
y=rnorm(999, 0.02, 0.2)

# M$Y are the cummulative returns (like an index)
M = data.frame(X = 1:1000, Y=100)

for (i in 2:1000)
M[i, "Y"] = M[i-1, "Y"] * (1 + y[i-1])

ggplot(M, aes(x = X, y = Y)) + geom_line() + scale_y_continuous(trans = log_trans())

产生丑陋的蜱虫:

enter image description here

我也尝试过:

enter image description here

ggplot(M, aes(x = X, y = Y)) + geom_line() + 
scale_y_continuous(trans = log_trans(), breaks = pretty_breaks())

如何获得与默认绘图函数相同的中断/刻度:

plot(M, type = "l", log = "y")

enter image description here

结果应该如下所示,但不是硬键入中断,而是动态的。我尝试了像axisTicks()这样的函数,但没有成功:

ggplot(M, aes(x = X,y = Y)) + geom_line() + 
scale_y_continuous(trans = log_trans(), breaks = c(1, 10, 100, 10000))

enter image description here

谢谢!

编辑:插入图片

最佳答案

可以使用自定义中断函数来重现基本图形行为:

base_breaks <- function(n = 10){
function(x) {
axisTicks(log10(range(x, na.rm = TRUE)), log = TRUE, n = n)
}
}

将此应用于示例数据会得到与使用 trans_breaks('log10', function(x) 10^x) 相同的结果:

ggplot(M, aes(x = X, y = Y)) + geom_line() +
scale_y_continuous(trans = log_trans(), breaks = base_breaks()) +
theme(panel.grid.minor = element_blank())

breaks at powers of ten

但是,我们可以对 y 值在 50 到 600 之间的数据子集使用相同的函数:

M2 <- subset(M, Y > 50 & Y < 600)
ggplot(M2, aes(x = X, y = Y)) + geom_line() +
scale_y_continuous(trans = log_trans(), breaks = base_breaks()) +
theme(panel.grid.minor = element_blank())

由于 10 的幂在这里不再适用,base_breaks 会产生替代的漂亮中断:

pretty breaks

请注意,我已经关闭了次要网格线:在某些情况下,将网格线设置在 y 轴上主要网格线之间的中间是有意义的,但并非总是如此。

编辑

假设我们修改M,使最小值为0.1:

M <- M - min(M) + 0.1

base_breaks() 函数仍然选择漂亮的中断,但标签采用科学记数法,这可能不会被视为“漂亮”:

ggplot(M, aes(x = X, y = Y)) + geom_line() +
scale_y_continuous(trans = log_trans(), breaks = base_breaks()) +
theme(panel.grid.minor = element_blank())

enter image description here

我们可以通过将文本格式设置函数传递给 scale_y_continuouslabels 参数来控制文本格式设置。在这种情况下,基础包中的 prettyNum 很好地完成了这项工作:

ggplot(M, aes(x = X, y = Y)) + geom_line() +
scale_y_continuous(trans = log_trans(), breaks = base_breaks(),
labels = prettyNum) +
theme(panel.grid.minor = element_blank())

enter image description here

关于r - 使用 ggplot2 对数正态刻度进行漂亮的刻度(动态而非手动),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14255533/

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