r – cdplot()模拟ggplot2

我正在寻找像R的内置cdplot函数那样的条件密度图,但是使用ggplot2.

这是一个vanilla cdplot示例:

with(iris, cdplot(Sepal.Length, Species))

《r – cdplot()模拟ggplot2》

the ggplot2 book(第188页)中,它表示以下呼叫应该是等效的:

cdplot(x, y)
qplot(x, fill=y, geom="density", position="fill")

但是,看起来这种行为在对ggplot2的一些更新中破裂了(它还提供了一个警告,称’position`已被弃用):

with(iris, qplot(Sepal.Length, fill=Species, geom="density", position="fill"))

《r – cdplot()模拟ggplot2》

我找到了a blog entry of someone trying to do the same thing,但显然现在已经破了(同样的警告,`position`已被弃用):

cdens <- cdplot(iris$Sepal.Length, iris$Species, plot = F)
x <- seq(min(iris$Sepal.Length), max(iris$Sepal.Length), length.out = 100)
y <- c(cdens[[1]](x), cdens[[2]](x), rep(1, length(x)))
type <- ordered(rep(levels(iris$Species), each = length(x)),
                levels=rev(levels(iris$Species)))
x <- rep(x, 3)
qplot(x, y, geom="area", fill = type, position="identity",
      xlab="Sepal.Length", ylab="Species") + theme_bw()

《r – cdplot()模拟ggplot2》

有什么方法可以实现这一目标?这些例子中有什么?

(我想要一个ggplot解决方案,因为它有更好的轴标记和图例,特别是当自变量是一个日期时.)

更新:在下面的评论中,@ onbouncyball建议使用ggplot(iris,aes(x = Sepal.Length,fill = Species))geom_density(position =’fill’),但这样做有所不同:

with(data, cdplot(time, cat))
abline(v=as.POSIXct(c('2017-04-01', '2017-03-01')), col='red')

《r – cdplot()模拟ggplot2》

ggplot(data, aes(x=time, fill=cat)) + geom_density(position = 'fill')

《r – cdplot()模拟ggplot2》

cdplot结果是我想要的,我不确定ggplot示例在做什么. cdplot结果与2017年3月的因子比率相匹配:

> with(subset(data, time>'2017-03-01' & time <'2017-04-01'), table(cat))
cat
   <1s    <3s    <5s   <10s   <20s    <1m    <2m    <5m    <1h   <24h    >1d 
175484  31837  19078  16146  15013  20200   1142   1207    944     17      0 

最佳答案 不确定它是否比这更复杂,但你可以使用position_fill和geom_density.这里有两个版本,一个带有填充物的常用图例,另一个带有标签,每个物种的最大Sepal.Length.你可以用不同的方式设置标签,或者跳过它们 – 我只是想尝试镜像cdplot的设置.

library(tidyverse)

iris %>%
  ggplot(aes(x = Sepal.Length, fill = Species)) +
    geom_density(position = position_fill(), size = 0) +
    theme_bw() +
    scale_fill_brewer(palette = "Set2") +
    scale_x_continuous(expand = expand_scale(0)) +
    scale_y_continuous(expand = expand_scale(0))
lbls <- iris %>%
  group_by(Species) %>%
  summarise(max_sl = max(Sepal.Length))

iris %>%
  ggplot(aes(x = Sepal.Length, fill = Species)) +
  geom_density(position = position_fill(), size = 0) +
  geom_text(aes(x = max_sl, y = 1, label = Species), data = lbls, hjust = 1, vjust = 1, nudge_y = -0.02, nudge_x = -0.05, color = "white", fontface = "bold") +
  theme_bw() +
  scale_fill_brewer(palette = "Set2", guide = F) +
  scale_x_continuous(expand = expand_scale(0)) +
  scale_y_continuous(expand = expand_scale(0))
点赞