Ответ 1
используйте lines
для второго:
plot(density(MyData$Column1))
lines(density(MyData$Column2))
убедитесь, что границы первого графика подходят, однако.
Я хотел бы наложить 2 диаграммы плотности на одном устройстве с R. Как я могу это сделать? Я искал в Интернете, но я не нашел явного решения (я довольно новичок в R).
Моей идеей было бы прочитать данные из текстового файла (столбцы), а затем использовать
plot(density(MyData$Column1))
plot(density(MyData$Column2), add=T)
хорошо что-то в этом духе...
Заранее спасибо
используйте 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)
Чтобы предоставить полный набор, здесь версия ответа Chase с помощью 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))
Что дает:
Я взял приведенный выше пример решетки и сделал отличную функцию. Вероятно, есть лучший способ сделать это с изменением формы с помощью расплава/литья. (Комментарий или изменение, если вы видите улучшение.)
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
. Это немного хакерский, но довольно простой, чтобы катиться:
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)
Затем постройте их в соответствии с первым ответом и определите значения min и max для оси y, которую вы только что получили. (Я устанавливаю значение min равным 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"))