gpplot2中的cdplot()模拟

时间:2017-10-12 15:58:14

标签: r ggplot2 distribution

我正在寻找像R的内置params函数这样的条件密度图,但是使用false

这是一个香草cdplot示例:

ggplot2

cdplot example

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

cdplot

但是,在with(iris, cdplot(Sepal.Length, Species)) 的某些更新中,这种行为似乎已经破裂(它还会发出警告cdplot(x, y) qplot(x, fill=y, geom="density", position="fill") ):

ggplot2

ggplot example

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

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

enter image description here

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

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

更新:在下面的评论中,@ bouncyball建议使用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() ,但这样做有所不同:

ggplot

enter image description here

ggplot(iris, aes(x = Sepal.Length, fill = Species))+ geom_density(position = 'fill')

enter image description here

with(data, cdplot(time, cat)) abline(v=as.POSIXct(c('2017-04-01', '2017-03-01')), col='red') 结果是我想要的,我不确定ggplot(data, aes(x=time, fill=cat)) + geom_density(position = 'fill') 示例正在做什么。 cdplot结果与例如2017年3月的因子比率匹配:

ggplot

2 个答案:

答案 0 :(得分:1)

不确定它是否比这更复杂,但您可以将position_fillgeom_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))

答案 1 :(得分:1)

将计算变量count用于堆积密度图,并根据cdplot重新排序物种水平。

library(ggplot2)
ggplot(iris, aes(Sepal.Length, ..count.., fill = forcats::fct_relevel(Species, 
  levels = c("virginica", "versicolor", "setosa")))) +
  geom_density(position = "fill") +
  labs(fill = "Species")

enter image description here