gpt4 book ai didi

r - ggplot2 geom_violin 的非常奇怪的图表

转载 作者:行者123 更新时间:2023-12-01 10:51:29 24 4
gpt4 key购买 nike

我只能用相当大的数据集可靠地重建这个问题,所以我粘贴了整个代码 to a pastebin这是没有数据部分的代码:

    # read tmp from the pastebin  

library(ggplot2)
plt <- ggplot(tmp, aes(region, score))
plt1 <- plt + geom_violin(aes(region, score), scale='width', trim=F) + ylim(0, 1) + ggtitle('with ylim')
plt2 <- plt + geom_violin(aes(region, score), scale='width', trim=F) + ggtitle('without ylim')

为该图设置 y 限制会导致非常丑陋的“ fiddle ”:

enter image description here

enter image description here

这是什么,为什么会发生这种情况以及如何避免这种丑陋的问题?

顺便说一句,设置 trim=T 可以解决问题。

最佳答案

通过一些挖掘,我认为问题的技术根源在于:您的 y 变量几乎不在 [0, 1] 范围内,因此密度当然会落在范围之外那个。使用stat_density,这个多余的密度刚刚被切断,但是使用geom_violin/stat_ydensity,多余的部分被留下,并且允许比例扩展.但是,使用 ylimtrim=FALSE,[0, 1] 之外的这些 y 值将被保留并设置为 NA,它搞砸了 geom_polygon 中的绘图。您实际上可以通过 [0, 1] 中数据的较小示例看到这一点:

x <- runif(1e4, 0, 1)
ggplot(mapping=aes(1, x)) + geom_violin(trim=FALSE) + ylim(0, 1)

a broken violin plot

有几种方法可以解决这个问题。第一种是保留默认的 trim=TRUE:

ggplot(mapping=aes(1, x)) + geom_violin() + ylim(0, 1)

a violin plot with ylim and trim=TRUE

请注意,在这种情况下,ylim (scale_y_continuous) 实际上会删除 [0, 1] 之外的原始数据。在您的示例中,除此之外您没有任何要点,我在这里也没有。但这是需要注意的事情。顶部和底部也会有一些填充,可能会误导观众认为 [0, 1] 之外没有密度。

也许更好的解决方案是使用 coord_cartesian,它会简单地“放大”图形,而不会影响数据和结果密度:

ggplot(mapping=aes(1, x)) + geom_violin(trim=FALSE) + coord_cartesian(ylim=c(0, 1))

a violin plot with coord_cartesian

关于r - ggplot2 geom_violin 的非常奇怪的图表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19301874/

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