首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修复R中ggplot2的geom_jitter()的不稳定y位置?

如何修复R中ggplot2的geom_jitter()的不稳定y位置?
EN

Stack Overflow用户
提问于 2021-03-13 07:13:11
回答 1查看 494关注 0票数 1

我正在使用boxplot做一个常见的R ggplot2图: boxplots补充了geom_jitter()所显示的各个样本的点,以显示每个组中的各个样本位置和数量。通常情况下,我没有注意到问题,但在最近的一些数据中,我注意到抖动的y位置存在很大的不准确性和变化。但是,框图相对于Y保持稳定,当geom_point()用于显示与正在绘制的抖动相同的点时,也是如此。当您有许多数据点时,错误可能不明显,但如果要求对一个组中的5-10个样本执行某些操作,如果您没有意识到问题,它可能会产生一个明显的错误,该错误会产生一个可能误导您的曲线图。

我最初认为这可能经常发生,但我没有注意到,所以我做了一些随机数并用geom_jitter()做了一个ggplot,但一开始这个问题就消失了。给出了一些实例数据和曲线图,以显示正常和有问题的情况。

数据生成和绘图效果与预期一致:

代码语言:javascript
复制
df <- data.frame("X" = rep("X", 5), "Y" = rnorm(5, 100, 30))

检查曲线图:

代码语言:javascript
复制
library(ggplot2)
ggplot(df, aes(X, Y)) + geom_boxplot() + geom_jitter(col = "red") + geom_point(col = "blue")

红色和蓝色的点几乎完全对齐,如果您重复代码5次,并且没有注意到抖动点y位置的变化(如预期的那样,仅沿X轴水平),则可以在RStudio预览中查看绘图。在像下面这样的有问题的情况下,您很快就会看到y轴点的变化,特别是因为它有时会移动y轴的范围。

随着随机数的变化越来越多,我发现红色和蓝色的点之间有明显的差异,每次绘制相同的数据时都会有所不同:

代码语言:javascript
复制
df <- data.frame("X" = rep("X", 5), "Y" = rnorm(5, 100, 400))

得到这个问题的实际数字是:

代码语言:javascript
复制
  X          Y
1 X  610.78026
2 X  -38.58905
3 X -196.00943
4 X   94.37797
5 X  415.58417

在我的结果中,最低点,-196,有时约为-170,有时约为-250。Y轴的范围每次都会移动。这与我在真实数据中遇到的问题类似。我发现,对于具有更多方差或点之间更大范围的数据的其他测试,无法解释抖动y位置的出现变异性。在某些方差较大的情况下,geom_jitter()会再次产生接近完美的y位置。因此,我想知道这是否与ggplot2使用的某些绘图区域的映射问题有关。我想通过使用ylim(-206, 621)强制ggplot保持相同的ylimit来测试它,但它无法停止上面有问题的情况下的区域。它给出了一个神秘而又一致的错误:“警告消息:删除了1行包含缺失值(Geom_point)的行。”(在相应的绘图中,它失去了610.7值的红色抖动点,尽管绘图预览窗口中有足够的像素空间用于蓝点和图形顶部之间的大约10个点。在另一次尝试中,2个抖动点丢失,因为底部有时会超过下限)。

一种绕过弯的解决方案是为X组创建随机点,所有点都保持相同的Y和组身份,但效率不高。当在X上使用非数字组时,我发现对于添加的任何标签,它的数字位置都是1。将以下内容添加到最后一个数据帧中会给出正确的外观+ geom_point(aes(x= rnorm(5, 1, .2), y = Y), col = "yellow") -但如果没有某种方法自动获得箱图组的正确X位置,那么如果有很多组,这将变得相当麻烦。

要解决这个问题,任何关于其原因的输入都将是一个很大的帮助。

EN

Stack Overflow用户

回答已采纳

发布于 2021-03-13 08:21:54

听起来您并不想要默认的geom_jitter行为,即在绘制之前将均匀分布的噪声量分别添加到x和y值,默认情况下为"40% of the resolution of the data: this means the jitter values will occupy 80% of the implied bins."

对于像您这样的连续变量,“分辨率”是"the smallest non-zero distance between adjacent values.

试试这个:

代码语言:javascript
复制
geom_jitter(col = "red", height = 0) + 

这将告诉ggplot,您不希望在绘制之前对y值应用任何噪声。

另一种方法是在绘图步骤之前自己添加噪声,使您能够特定地控制其分布和范围。

例如,不是让抖动填充一个统一的矩形:...

代码语言:javascript
复制
library(dplyr)
tibble(x = rep(1:2, each = 1000),
       y = rep(3:4, each = 1000)) -> point_data
  ggplot(point_data, aes(x,y)) + geom_jitter()

我们可以添加任何我们想要的噪声函数。在这里,没有特别的原因,我在真实数据周围制作了甜甜圈,并将其与默认抖动进行比较:

代码语言:javascript
复制
point_data %>%
  mutate(angle = runif(2000, 0, 2*pi),
         dist  = rnorm(2000, 0.3, 0.05),
         x2    = x + dist*cos(angle),
         y2    = y + dist*sin(angle)) %>%
  ggplot() + 
    geom_jitter(aes(x,y), color = "red", alpha = 0.2) +
    geom_point(aes(x2,y2))

票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66608421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档