停止 geom_density_ridges 显示不存在的尾部值
Stop geom_density_ridges from showing non-existent tail values
当我使用 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)
可以看到,1月、2月、12月都是负温度,但数据中根本没有负值。
当然,我可以给 x 轴添加限制,但这并不能解决问题,因为它只是截断了现有的错误密度。
ggplot(d, aes(`Min Temperature [F]`, Month)) +
geom_density_ridges(rel_min_height=.01) +
xlim(0,80)
现在该图使 1 月和 2 月看起来像是零值(有 none)。这也让人觉得 0 度在 12 月经常发生,而实际上只有 1 个这样的日子。
我该如何解决这个问题?
嗯,原来我应该更仔细地阅读 the documentation。关键部分是:
"The ggridges package provides two main geoms, geom_ridgeline and
geom_density_ridges. The former takes height values directly to draw
ridgelines, and the latter first estimates data densities and then
draws those using ridgelines."
有多种方法可以处理这个问题。这是一个:
ggplot(d, aes(`Min Temperature [F]`, Month, height=..density..)) +
geom_density_ridges(stat = "binline", binwidth=1,
draw_baseline = F)
一种选择是使用 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)
注意:这两种方法目前无法结合使用,需要对统计代码进行一些修改。
当我使用 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)
当然,我可以给 x 轴添加限制,但这并不能解决问题,因为它只是截断了现有的错误密度。
ggplot(d, aes(`Min Temperature [F]`, Month)) +
geom_density_ridges(rel_min_height=.01) +
xlim(0,80)
我该如何解决这个问题?
嗯,原来我应该更仔细地阅读 the documentation。关键部分是:
"The ggridges package provides two main geoms, geom_ridgeline and geom_density_ridges. The former takes height values directly to draw ridgelines, and the latter first estimates data densities and then draws those using ridgelines."
有多种方法可以处理这个问题。这是一个:
ggplot(d, aes(`Min Temperature [F]`, Month, height=..density..)) +
geom_density_ridges(stat = "binline", binwidth=1,
draw_baseline = F)
一种选择是使用 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)
注意:这两种方法目前无法结合使用,需要对统计代码进行一些修改。