gpt4 book ai didi

r - 如何处理对数图中的零

转载 作者:行者123 更新时间:2023-12-01 22:18:48 25 4
gpt4 key购买 nike

问题

我想使用 ggplot2 将数据绘制在 y 轴上具有对数刻度的折线图中。不幸的是,我的一些值(value)观一路下降到零。数据表示依赖于某些参数的特征的相对出现。当在样本中没有观察到该特征时,值为零,这意味着它很少出现,或者实际上从未出现。这些零值会导致对数图中出现问题。

以下代码说明了简化数据集上的问题。实际上,数据集包含更多点,因此曲线看起来更平滑,参数 p 的值也更多。

library(ggplot2)

dat <- data.frame(x=rep(c(0, 1, 2, 3), 2),
y=c(1e0, 1e-1, 1e-4, 0,
1e-1, 1e-3, 0, 0),
p=c(rep('a', 4), rep('b', 4)))
qplot(data=dat, x=x, y=y, colour=p, log="y", geom=c("line", "point"))

根据上面的数据,我们期望有两条线,第一条线在对数图上应有三个有限点,第二条线在对数图上应只有两个有限点。

Misleading plot

但是,正如您所看到的,这会产生一个非常具有误导性的情节。看起来蓝线和红线都收敛到 1e-4 和 1e-3 之间的值。原因是 log(0) 给出 -Inf,ggplot 只是将其放在下轴上。

我的问题

在 R 中使用 ggplot2 处理这个问题的最佳方法是什么?我所说的“最好”是指效率和 R 语言理念(我对 R 还很陌生)。

该图应表明这些曲线分别在 x=2(红色)或 x=1(蓝色)后下降到“非常小”。理想情况下,从最后一个有限点向下有一条垂直线。我的意思如下所示。

我的尝试

在这里我将描述我的想法。然而,鉴于我对 R 相当陌生,我怀疑可能有更好的方法。

library(ggplot2)
library(scales)

dat <- data.frame(x=rep(c(0, 1, 2, 3), 2),
y=c(1e0, 1e-1, 1e-4, 0,
1e-1, 1e-3, 0, 0),
p=c(rep('a', 4), rep('b', 4)))

与上面相同的数据。

现在,我将遍历每个唯一参数p,找到最后一个有限点的 x 坐标,并将其分配给 y 为零的所有点的 x 坐标。即实现垂直线。

for (p in unique(dat$p)) {
dat$x[dat$p == p & dat$y == 0] <- dat$x[head(which(dat$p == p & dat$y == 0), 1) - 1]
}

此时,情节如下所示。

Vertical lines and points

垂直线在那里。不过,也有要点。这些具有误导性,因为它们表明那里有一个实际的数据点,但事实并非如此。

为了删除点,我复制了 y 数据(似乎很浪费),我们将其称为 yp,并用 NA 替换零。然后我使用新的 yp 作为 geom_point 的 y 美学。

dat$yp <- dat$y
dat$yp[dat$y == 0] <- NA

ggplot(dat, aes(x=x, y=y, colour=p)) +
geom_line() +
geom_point(aes(y=dat$yp)) +
scale_y_continuous(trans=log10_trans(),
breaks = trans_breaks("log10", function(x) 10^x),
labels = trans_format("log10", math_format(10^.x)))

我使用了ggplot而不是qplot,这样我就可以为geom_linegeom_point赋予不同的美感>.

最后,剧情是这样的。

Final Plot

执行此操作的正确方法是什么?

最佳答案

对我来说,我使用

+ scale_y_continuous(trans=scales::pseudo_log_trans(base = 10))

关于r - 如何处理对数图中的零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40219639/

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