Как наложить графики плотности в R?
Я хотел бы наложить 2 графика плотности на одном устройстве с R. Как я могу это сделать? Я искал в интернете, но я не нашел никакого очевидного решения (я довольно новичок в R).
моя идея состояла бы в том, чтобы читать данные из текстового файла (столбцов), а затем использовать
plot(density(MyData$Column1))
plot(density(MyData$Column2), add=T)
Ну что-то в этом духе...
спасибо заранее
7 ответов:
использовать
lines
второй:plot(density(MyData$Column1)) lines(density(MyData$Column2))
убедитесь, что границы первого участка подходят, хотя.
ggplot2 это еще один графический пакет, который обрабатывает такие вещи, как проблема диапазона, о которой упоминает Гэвин, довольно гладко. Он также обрабатывает автоматическое создание соответствующих легенд и просто, как правило, имеет более полированное ощущение, на мой взгляд, из коробки с меньшим количеством ручных манипуляций.
library(ggplot2) #Sample data dat <- data.frame(dens = c(rnorm(100), rnorm(100, 10, 5)) , lines = rep(c("a", "b"), each = 100)) #Plot. ggplot(dat, aes(x = dens, fill = lines)) + geom_density(alpha = 0.5)
просто чтобы обеспечить полный набор, вот версия ответа Чейза с помощью
lattice
:dat <- data.frame(dens = c(rnorm(100), rnorm(100, 10, 5)) , lines = rep(c("a", "b"), each = 100)) densityplot(~dens,data=dat,groups = lines, plot.points = FALSE, ref = TRUE, auto.key = list(space = "right"))
который создает такой сюжет:
добавление базовой графической версии, которая заботится о пределах оси y, добавляет цвета и работает для любого количества столбцов:
Если у нас есть набор данных:
myData <- data.frame(std.nromal=rnorm(1000, m=0, sd=1), wide.normal=rnorm(1000, m=0, sd=2), exponent=rexp(1000, rate=1), uniform=runif(1000, min=-3, max=3) )
затем построить плотность:
dens <- apply(myData, 2, density) plot(NA, xlim=range(sapply(dens, "[", "x")), ylim=range(sapply(dens, "[", "y"))) mapply(lines, dens, col=1:length(dens)) legend("topright", legend=names(dens), fill=1:length(dens))
что дает:
Я взял приведенный выше пример решетки и сделал отличную функцию. Вероятно, есть лучший способ сделать это с помощью reshape через melt/cast. (Комментарий или редактирование, если вы видите улучшение.)
multi.density.plot=function(data,main=paste(names(data),collapse = ' vs '),...){ ##combines multiple density plots together when given a list df=data.frame(); for(n in names(data)){ idf=data.frame(x=data[[n]],label=rep(n,length(data[[n]]))) df=rbind(df,idf) } densityplot(~x,data=df,groups = label,plot.points = F, ref = T, auto.key = list(space = "right"),main=main,...) }
пример использования:
multi.density.plot(list(BN1=bn1$V1,BN2=bn2$V1),main='BN1 vs BN2') multi.density.plot(list(BN1=bn1$V1,BN2=bn2$V1))
всякий раз, когда есть проблемы несоответствующих пределов оси, правильный инструмент в
base
графика-это использоватьmatplot
. Ключ в том, чтобы использоватьfrom
иto
аргументыdensity.default
. Это немного hackish, но довольно просто свернуть себя:set.seed(102349) x1 = rnorm(1000, mean = 5, sd = 3) x2 = rnorm(5000, mean = 2, sd = 8) xrng = range(x1, x2) #force the x values at which density is # evaluated to be the same between 'density' # calls by specifying 'from' and 'to' # (and possibly 'n', if you'd like) kde1 = density(x1, from = xrng[1L], to = xrng[2L]) kde2 = density(x2, from = xrng[1L], to = xrng[2L]) matplot(kde1$x, cbind(kde1$y, kde2$y))
добавить колокола и свистки по желанию (
matplot
принимает все стандартныеplot
/par
аргументы, например,lty
,type
,col
,lwd
, ...).
вот как я это делаю в базе (это на самом деле упоминается в первых комментариях ответа, но я покажу полный код здесь, включая легенду, поскольку я пока не могу комментировать...)
сначала вам нужно получить информацию о максимальных значениях для оси y из графиков плотности. Поэтому вам нужно сначала вычислить плотности отдельно
dta_A <- density(VarA, na.rm = TRUE) dta_B <- density(VarB, na.rm = TRUE)
затем постройте их в соответствии с первым ответом и определите минимальные и максимальные значения для оси y, которую вы только что получили. (Я установил минимальное значение до 0)
plot(dta_A, col = "blue", main = "2 densities on one plot"), ylim = c(0, max(dta_A$y,dta_B$y))) lines(dta_B, col = "red")
затем добавьте легенду в верхний правый угол
legend("topright", c("VarA","VarB"), lty = c(1,1), col = c("blue","red"))