阻止geom_density_ridges显示不存在的尾部值

Stop geom_density_ridges from showing non-existent tail values

提问人:John J. 提问时间:4/19/2018 最后编辑:Marcus CampbellJohn J. 更新时间:7/19/2020 访问量:7725

问:

当我使用 时,该图通常最终会显示数据中不存在的值的长尾。geom_density_ridges()

下面是一个示例:

library(tidyverse)
library(ggridges)

data("lincoln_weather")

# Remove all negative values for "Minimum Temperature"
d <- lincoln_weather[lincoln_weather$`Min Temperature [F]`>=0,]

ggplot(d, aes(`Min Temperature [F]`, Month)) +
  geom_density_ridges(rel_min_height=.01)

geom_ridgline如您所见,1 月、2 月和 12 月都显示负温度,但数据中根本没有负值。

当然,我可以向 x 轴添加限制,但这并不能解决问题,因为它只是截断了现有的错误密度。

ggplot(d, aes(`Min Temperature [F]`, Month)) +
  geom_density_ridges(rel_min_height=.01) +
  xlim(0,80)

geom_ridgeline with axis limits现在,该图使 1 月和 2 月的值看起来为零(没有)。这也使 12 月看起来经常发生 0 度,而实际上只有 1 天。

我该如何解决这个问题?

r ggplot2 ggridges 山脊线图

评论

1赞 MrFlick 4/19/2018
也许你不想要密度估计?你到底在期待什么?大多数密度估计器都假定您的数据在所有实数上都是连续的。他们不期望有界的范围。为此,您需要某种不同的估算器。因为现在没有什么可以“修复”的,所以统计方法正在按照设计的方式工作。
0赞 John J. 4/19/2018
哦,这是有道理的。我想直方图对于有界范围更有意义。之所以出现这个问题,是因为我处理的数据不能有负数,但确实有许多零和接近零的数字。我想密度图不是可视化的正确工具。
2赞 Claus Wilke 4/25/2018
@MrFlick 实际上,在数据范围的末端削减密度估计并不罕见。小提琴情节通常这样做。也可以这样做,请参阅此处。stat_density()

答:

9赞 John J. 4/19/2018 #1

好吧,事实证明我应该更仔细地阅读文档。关键部分是:

“ggridges 套件提供两个主要几何形状,geom_ridgeline和 geom_density_ridges。前者直接采用高度值进行绘制 山脊线,后者首先估计数据密度,然后 用山脊线画那些。

有多种方法可以处理此问题。这是其中之一:

ggplot(d, aes(`Min Temperature [F]`, Month, height=..density..)) +
  geom_density_ridges(stat = "binline", binwidth=1,
                      draw_baseline = F)

enter image description here

14赞 Claus Wilke 4/25/2018 #2

一种选择是使用代替 .有些事情是做不到的,比如画垂直线或叠加点,但另一方面,它可以做一些不行的事情,比如将分布修剪到数据范围。stat_density()stat_density_ridges()stat_density()stat_density_ridges()

# Remove all negative values for "Minimum Temperature"
d <- lincoln_weather[lincoln_weather$`Min Temperature [F]`>=0,]

ggplot(d, aes(`Min Temperature [F]`, Month, group = Month, height = ..density..)) +
  geom_density_ridges(stat = "density", trim = TRUE)

enter image description here

作为替代方案,您可以绘制一个点地毯,也许这也符合您的目的或更好:

ggplot(d, aes(`Min Temperature [F]`, Month)) +
  geom_density_ridges(rel_min_height = 0.01, jittered_points = TRUE,
                      position = position_points_jitter(width = 0.5, height = 0),
                      point_shape = "|", point_size = 2,
                      alpha = 0.7)

enter image description here

注意:这两种方法目前不能结合使用,这需要对统计代码进行一些修改。

评论

0赞 yuk 5/30/2022
您可以将这两种方法结合起来,添加具有新美学的新点图层:... + geom_points(aes(`Min Temperature [F]`, Month), inherit.aes = F, ...)