Как я могу получить график плотности с функцией многоугольника? У меня есть несколько групп, чтобы построить - PullRequest
0 голосов
/ 05 сентября 2018

Итак, я использовал базовые данные в R, «радужная оболочка» данных

И то, что я сделал до сих пор, это создание вектора, который имеет значения x с значениями Sepal.Length и y с выводом функции плотности. И тогда я нанес их на карту, но это не показывает в 3 разных группах (по видам), как я намеревался.

Моя интуиция в том, что с моей группировкой что-то не так ... Не могли бы вы мне помочь?

<>

x<-iris$Sepal.Length
y<-iris$Species
z<-split(x,y)
x_min <- min(x)
x_max <- max(x)
a <- sapply(z, function(x) density(x,from=x_min,to=x_max))
a
for(i in 1:length(a)){
    polygon(a$x[i],a$y[i])
}

output

А вот вывод, как он должен выглядеть

expected answer

Большое спасибо

1 Ответ

0 голосов
/ 05 сентября 2018

ggplot значительно упрощает групповые операции, подобные этой, потому что вам просто нужно сопоставить переменную группировки с эстетикой, используемой для дифференциации групп (здесь fill), и она позаботится о цветах и ​​легендах для вас. (Вы можете настроить дальше, конечно.)

library(ggplot2)

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

Если вы хотите сделать это при базовом графике, обычно проще всего сначала установить пустое окно, а затем выполнить итерации по группам. Поскольку вы хотите установить цвета, а также группы, Map является более подходящим, чем lapply. Легенды требуют дополнительного вызова.

plot(x = c(4, 8.5), y = c(0, 1.5), type = "n", 
     xlab = "Sepal Length", ylab = "Density", 
     main = "Density plot of multiple groups"); 

d <- lapply(split(iris$Sepal.Length, iris$Species), density)
Map(function(dens, col) polygon(dens, col = col), 
    dens = d, col = c('pink', 'lightgreen', 'lightblue')); 

legend("topright", levels(iris$Species), fill = c('pink', 'lightgreen', 'lightblue'))

...