10

当我使用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_ridgeline 如您所见,1 月、2 月和 12 月均显示负温度,但数据中根本没有负值。

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

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

具有轴限制的 geom_ridgeline 现在,该图使一月和二月的值看起来为零(没有)。这也使它看起来像 0 度经常发生在 12 月,而实际上只有 1 天这样的日子。

我怎样才能解决这个问题?

4

2 回答 2

10

一种选择是使用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)

在此处输入图像描述

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

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)

在此处输入图像描述

注意:这两种方法目前无法组合,这需要对统计代码进行一些修改。

于 2018-04-24T22:14:12.330 回答
5

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

“ggridges包提供了两个主要的geoms,geom_ridgeline和geom_density_ridges。前者直接取高度值绘制山脊线,后者先估计数据密度,再用山脊线绘制。”

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

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

在此处输入图像描述

于 2018-04-18T18:52:40.353 回答