Как наложить графики плотности в R?

Я хотел бы наложить 2 графика плотности на одном устройстве с R. Как я могу это сделать? Я искал в Интернете, но я не нашел никакого очевидного решения (я довольно плохо знаком с R).

Моя идея состоит в том, чтобы прочитать данные из текстового файла (столбцы), а затем использовать

plot(density(MyData$Column1))
plot(density(MyData$Column2), add=T)

ну что-то в этом духе ...

Заранее спасибо

68 голосов | спросил pasta 4 PM00000010000002531 2011, 13:37:25

7 ответов


0

используйте lines для второго:

plot(density(MyData$Column1))
lines(density(MyData$Column2))

убедитесь, что пределы первого графика подходят.

ответил cbeleites 4 PM00000010000003531 2011, 13:44:35
0

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 4 PM00000030000004931 2011, 15:31:49
0

Просто чтобы предоставить полный набор, вот вариант ответа Чейза с использованием 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"))

который создает сюжет, подобный этому: введите описание изображения здесь

ответил joran 4 PM00000060000003431 2011, 18:46:34
0

Добавление базовой графической версии, которая учитывает ограничения по оси 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))

Что дает:

‹ "alt =" введите описание изображения здесь ">
ответил Karolis Koncevičius 20 MarpmSun, 20 Mar 2016 16:04:55 +03002016-03-20T16:04:55+03:0004 2016, 16:04:55
0

Я взял приведенный выше пример решетки и сделал изящную функцию. Вероятно, есть лучший способ сделать это с помощью изменения формы с помощью расплавления /отливки. (Прокомментируйте или отредактируйте, если увидите улучшение.)

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))
ответил Chris 15 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 15 Sep 2015 02:21:35 +0300 2015, 02:21:35
0

При возникновении проблем с несоответствующими пределами оси правильный инструмент в графике 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, ...).

ответил MichaelChirico 10 52017vEurope/Moscow11bEurope/MoscowFri, 10 Nov 2017 10:00:14 +0300 2017, 10:00:14
0

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

Сначала вам нужно получить информацию о максимальных значениях для оси 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"))
ответил R. Prost 13 WedEurope/Moscow2017-12-13T17:50:20+03:00Europe/Moscow12bEurope/MoscowWed, 13 Dec 2017 17:50:20 +0300 2017, 17:50:20

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132