geom_de density слепой с точки зрения поставляемой эстетики? - PullRequest
1 голос
/ 04 августа 2020

Я должен признать, что прошло много времени с тех пор, как я использовал 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 = время, x = возраст)) +

  • geom_de density (aes (y = Time, x = Age)) Ошибка: geom_de density требует следующей недостающей эстетики: y

как могло отсутствовать 'y' aestheti c ??

Ответы [ 2 ]

2 голосов
/ 04 августа 2020

Возможны два случая использования geom_density(). Это зависит от того, какой уровень статистики вы указываете:

  1. Стандартный случай - это stat density , которая заставляет функцию geom_de density () вычислять свои значения y на основе частотного распределения с учетом значений x. В этом случае вы НЕ ДОЛЖНЫ доказывать ay aestheti c, потому что они вычисляются за кулисами.
  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))

Created on 2020-08-04 by the пакет REPEX (v0.3.0)

0 голосов
/ 04 августа 2020

Если вы хотите изобразить две переменные на графике c, вам нужно сначала «растопить» их.

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)
...