используя stat_function и facet_wrap вместе в ggplot2 в R

Я пытаюсь построить данные типа решетки с помощью ggplot2, а затем наложить нормальное распределение по данным выборки, чтобы проиллюстрировать, насколько далеко лежат нормальные базовые данные. Я хотел бы иметь нормальный уровень сверху, чтобы иметь такое же значение и stdev, что и панель.

вот пример:

library(ggplot2) #make some example data dd<-data.frame(matrix(rnorm(144, mean=2, sd=2),72,2),c(rep("A",24),rep("B",24),rep("C",24))) colnames(dd) <- c("x_value", "Predicted_value", "State_CD") #This works pg <- ggplot(dd) + geom_density(aes(x=Predicted_value)) + facet_wrap(~State_CD) print(pg) 

Все это отлично работает и создает приятный трехкомпонентный график данных. Как добавить нормальный уровень вверх? Кажется, я бы использовал stat_function, но это не удалось:

 #this fails pg <- ggplot(dd) + geom_density(aes(x=Predicted_value)) + stat_function(fun=dnorm) + facet_wrap(~State_CD) print(pg) 

Похоже, что stat_function не сочетается с функцией facet_wrap. Как мне заставить этих двух играть хорошо?

————РЕДАКТИРОВАТЬ———

Я попытался объединить идеи из двух ответов ниже, и я до сих пор не присутствовал:

используя комбинацию обоих ответов, я могу взломать это:

 library(ggplot) library(plyr) #make some example data dd<-data.frame(matrix(rnorm(108, mean=2, sd=2),36,2),c(rep("A",24),rep("B",24),rep("C",24))) colnames(dd) <- c("x_value", "Predicted_value", "State_CD") DevMeanSt <- ddply(dd, c("State_CD"), function(df)mean(df$Predicted_value)) colnames(DevMeanSt) <- c("State_CD", "mean") DevSdSt <- ddply(dd, c("State_CD"), function(df)sd(df$Predicted_value) ) colnames(DevSdSt) <- c("State_CD", "sd") DevStatsSt <- merge(DevMeanSt, DevSdSt) pg <- ggplot(dd, aes(x=Predicted_value)) pg <- pg + geom_density() pg <- pg + stat_function(fun=dnorm, colour='red', args=list(mean=DevStatsSt$mean, sd=DevStatsSt$sd)) pg <- pg + facet_wrap(~State_CD) print(pg) 

который действительно близок … кроме того, что что-то не так с обычным построением dist:

введите описание изображения здесь

что я делаю неправильно здесь?

4 Solutions collect form web for “используя stat_function и facet_wrap вместе в ggplot2 в R”

stat_function предназначена для наложения одной и той же функции на каждой панели. (Нет очевидного способа сопоставить параметры функции с различными панелями).

Как предполагает Ян, наилучшим способом является генерация нормальных кривых самостоятельно и построение их как отдельного набора данных (именно там вы ошибались раньше – слияние просто не имеет смысла для этого примера, и если вы внимательно посмотрите, вот почему вы получаете странный пильный рисунок).

Вот как я решил решить проблему:

 dd < - data.frame( predicted = rnorm(72, mean = 2, sd = 2), state = rep(c("A", "B", "C"), each = 24) ) grid <- with(dd, seq(min(predicted), max(predicted), length = 100)) normaldens <- ddply(dd, "state", function(df) { data.frame( predicted = grid, density = dnorm(grid, mean(df$predicted), sd(df$predicted)) ) }) ggplot(dd, aes(predicted)) + geom_density() + geom_line(aes(y = density), data = normaldens, colour = "red") + facet_wrap(~ state) 

введите описание изображения здесь

Я думаю, вам нужно предоставить дополнительную информацию. Это похоже на работу:

  pg < - ggplot(dd, aes(Predicted_value)) ## need aesthetics in the ggplot pg <- pg + geom_density() ## gotta provide the arguments of the dnorm pg <- pg + stat_function(fun=dnorm, colour='red', args=list(mean=mean(dd$Predicted_value), sd=sd(dd$Predicted_value))) ## wrap it! pg <- pg + facet_wrap(~State_CD) pg 

Мы предоставляем одинаковые значения среднего и sd для каждой панели. Получение специфических средств панели и стандартных отклонений остается в качестве упражнения для читателя *;)

'*' Другими словами, не уверен, как это можно сделать ...

Я считаю, что лучше всего провести линию вручную с помощью geom_line.

 dd< -data.frame(matrix(rnorm(144, mean=2, sd=2),72,2),c(rep("A",24),rep("B",24),rep("C",24))) colnames(dd) <- c("x_value", "Predicted_value", "State_CD") dd$Predicted_value<-dd$Predicted_value*as.numeric(dd$State_CD) #make different by state ##Calculate means and standard deviations by level means<-as.numeric(by(dd[,2],dd$State_CD,mean)) sds<-as.numeric(by(dd[,2],dd$State_CD,sd)) ##Create evenly spaced evaluation points +/- 3 standard deviations away from the mean dd$vals<-0 for(i in 1:length(levels(dd$State_CD))){ dd$vals[dd$State_CD==levels(dd$State_CD)[i]]<-seq(from=means[i]-3*sds[i], to=means[i]+3*sds[i], length.out=sum(dd$State_CD==levels(dd$State_CD)[i])) } ##Create normal density points dd$norm<-with(dd,dnorm(vals,means[as.numeric(State_CD)], sds[as.numeric(State_CD)])) pg <- ggplot(dd, aes(Predicted_value)) pg <- pg + geom_density() pg <- pg + geom_line(aes(x=vals,y=norm),colour="red") #Add in normal distribution pg <- pg + facet_wrap(~State_CD,scales="free") pg 

Если вы не хотите генерировать нормальный линейный график распределения «вручную», все равно используйте stat_function и показывайте графики бок о бок – тогда вы можете рассмотреть возможность использования функции «multipot», опубликованной в «Cookbook for R», как альтернатива facet_wrap. Здесь вы можете скопировать код мультимножества в свой проект.

После копирования кода выполните следующие действия:

 # Some fake data (copied from hadley's answer) dd < - data.frame( predicted = rnorm(72, mean = 2, sd = 2), state = rep(c("A", "B", "C"), each = 24) ) # Split the data by state, apply a function on each member that converts it into a # plot object, and return the result as a vector. plots <- lapply(split(dd,dd$state),FUN=function(state_slice){ # The code here is the plot code generation. You can do anything you would # normally do for a single plot, such as calling stat_function, and you do this # one slice at a time. ggplot(state_slice, aes(predicted)) + geom_density() + stat_function(fun=dnorm, args=list(mean=mean(state_slice$predicted), sd=sd(state_slice$predicted)), color="red") }) # Finally, present the plots on 3 columns. multiplot(plotlist = plots, cols=3) 

введите описание изображения здесь

  • Извлеките регулярное выражение
  • Комбинировать базовую графику и графику ggplot в окне фигуры R
  • Формула с динамическим числом переменных
  • Быстрое чтение очень больших таблиц в качестве данных
  • Измените порядок дискретной шкалы x
  • Фильтрация нескольких значений в столбце строки в dplyr
  • удалять идентификаторы, которые встречаются x раз R
  • Объединение функций paste () и expression () в метках графика
  • Порядок приоритета оператора при использовании «:» (двоеточие)
  • Сделать фон графика разными цветами в разных регионах
  • Создайте список простых чисел до определенного числа
  • Давайте будем гением компьютера.