используя 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:

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

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

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) 

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

  • duplicate 'row.names' не допускается ошибка
  • Разбор JSON с R
  • Примените функцию к каждой строке матрицы или к кадру данных
  • Как изменить порядок размеров массива
  • Импортировать данные в R с неизвестным количеством столбцов?
  • Обобщите условия в dplyr
  • Удалить строки, существующие в другом кадре данных?
  • передавая несколько аргументов FUN of lapply (и другие * применяются)
  • Как я могу справиться с NA в остатках в регрессии в R?
  • как читать данные в формате utf-8 в R?
  • Выполнение dplyr mutate на подмножестве столбцов
  • Interesting Posts

    Вызов функции c из Java

    Возможно ли безопасное автозапуск USB с помощью планировщика заданий в Windows 7?

    Использование используемой записи в c #

    Есть ли способ открыть закладку на боковой панели в Firefox, не нажимая на закладку в панели закладок?

    Как остановить открытие каждого файла пакета как процесс с именем cmd.exe, как показано в диспетчере задач

    Как поменять значения двух строк в MySQL без нарушения уникального ограничения?

    Когда следует использовать Async Controllers в ASP.NET MVC?

    Использование GPU с c #

    Как найти и удалить несколько записей реестра Windows?

    Как эмулировать задания cron на Windows Server?

    allowDefinition = ‘MachineToApplication’ при публикации из VS2010 (но только после предыдущей сборки)

    Ошибка компиляции gcc на Raspberry Pi (Raspbian): make: *** error

    Работа с ошибкой «java.lang.OutOfMemoryError: PermGen space»

    Можно ли выполнять бинарную сериализацию .NET в случае, если у вас нет исходного кода classа?

    Как игнорировать все орфографические ошибки в документе Word 2013?

    Давайте будем гением компьютера.