geom_density 提供的美学方面盲目?

geom_density blind in terms of the aesthetics supplied?

我不得不承认我已经有一段时间没有使用 ggplot 了,但这看起来有点傻。要么我在尝试制作密度图时遗漏了一些基本知识,要么 ggplot2 (v3.3.2)

中存在错误
test <- data.frame(Time=rnorm(100),Age=rnorm(100))
ggplot(test,aes(y=Time,x=Age)) + 
  geom_density(aes(y=Time,x=Age))

生产

ggplot(test,aes(y=Time,x=Age)) +

  • geom_density(aes(y=Time,x=Age)) Error: geom_density requires the following missing aesthetics: y

怎么会缺少'y'审美??

使用geom_density()有两种情况。这取决于您指定的统计层:

  1. 标准情况是 stat density,它使 geom_density() 函数根据给定 x 值的频率分布计算其 y 值。在这种情况下,你不能证明你的审美,因为那些是在幕后计算的。
  2. 然后是第二种情况,这是您的情况,您必须通过将统计信息更改为 identity 来明确指定:如果出于某种原因,您需要这样做已经预先计算出您想要直接输入密度函数的值。

如果您混合使用情况 1) 和 2),就会出现问题。但我同意,错误消息不是很清楚,可以提及以确保使用的 stat 是所需的。

library(ggplot2)
test <- data.frame(time = rnorm(100), age = rnorm(100))
#if you want to use precalculated y values you have to change the used stat to identity:
ggplot(test) + 
  geom_density(aes(x = age, y = time), 
               stat = "identity")


# compared to the case with the default value of stat: stat = "density"

ggplot(test) + 
  geom_density(aes(x = age))

reprex package (v0.3.0)

于 2020-08-04 创建

如果你想在图形中绘制两个变量,你需要先“融化”它。

test <- data.frame(Time=rnorm(100),Age=rnorm(100))
dt <- data.table(test)
dt_melt <- melt.data.table(dt)
ggplot(dt_melt,aes(x=value, fill=variable)) + geom_density(alpha=0.25)