कैसे आर में घनत्व भूखंड ओवरले करने के लिए?


82

मैं आर के साथ एक ही डिवाइस पर 2 घनत्व प्लॉट को ओवरले करना चाहूंगा। मैं यह कैसे कर सकता हूं? मैंने वेब खोजा लेकिन मुझे कोई स्पष्ट समाधान नहीं मिला।

मेरा विचार एक पाठ फ़ाइल (कॉलम) से डेटा पढ़ना और फिर उपयोग करना होगा

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

या इस भावना में कुछ।


के लिए ggplot2परिवार, वहाँ अब एक पैकेज "है ggridges" कि यह कर सकते हैं।
लियांग झांग

जवाबों:


96

linesदूसरे के लिए उपयोग करें :

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

सुनिश्चित करें कि पहले भूखंड की सीमाएं उपयुक्त हैं, हालांकि।


9
+1 जब दो घनत्व अलग-अलग रेंज के होते हैं तो आपको कुछ और जटिल की आवश्यकता हो सकती है और दूसरा वक्र प्लॉट सीमा के भीतर फिट नहीं होता है। फिर आप साजिश रचने से पहले घनत्वों की गणना कर सकते हैं, और एक उपयुक्त ylimका उपयोग करके गणना कर सकते हैं कि range(dens1$y, dens2$y)कहां dens1और dens2दो घनत्व अनुमान वस्तुओं वाले ऑब्जेक्ट हैं। ylimकॉल में इसका उपयोग करें plot()
गेविन सिम्पसन 10

2
आप शायद दोनों लाइनों के बीच अंतर करना चाहते हैं। लाइन की चौड़ाई ( lwd), लाइन के प्रकार ( lty) या लाइन के रंग ( col) को यहां सेट करना चाहिए। उस बिंदु पर, आप legend()
nullglob

@ गेविन यदि ओपी एक फाइल से पढ़ रहा है, तो मैं एक विस्तृत फ़ंक्शन का निर्माण करूंगा जो डेटा में पढ़ा जाएगा (नीलम, लंगड़ी), सभी डेटा सेटों की सीमाएं ढूंढें, डिफ़ॉल्ट रेंज को सभी की अधिकतम सीमा पर सेट करें और फिर प्लॉट करें (लाइनें) ) घनत्व।
रोमन लुसट्रिक

50

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)

यहाँ छवि विवरण दर्ज करें


8
ओपी के डेटा.फ्रेम को पहले लंबे रूप से पिघला देने की आवश्यकता है:ggplot (melt (MyData), mapping = aes (fill = variable, x = value)) + geom_density (alpha = .5)
SX21 4'11

1
अच्छा प्लॉट। "Dat2" क्या है ...? क्या "पिघला" (कमांड नहीं मिला)?
एरिक एरोनिटी

@ ErikAronesty - आपको लगता है कि इस बिंदु पर मेरा जितना अच्छा है, मैंने दो साल पहले इसका उत्तर दिया था! मैं अनुमान लगाता हूं कि मेरे पास datमेरे वातावरण में नामित एक और वस्तु थी, इसलिए इसे नाम दिया dat2... मैं जो नकली डेटा प्रदान करता हूं वह विज्ञापन के रूप में काम करता है। melt()आदेश पैकेज से आता है reshape2। 2011 में वापस, reshape2लोड होने पर स्वचालित रूप से लोड किया ggplot2गया था, लेकिन अब ऐसा नहीं है इसलिए आपको library(reshape2)अलग से करने की आवश्यकता है ।
पीछा करें

23

आधार ग्राफ़िक्स संस्करण जोड़ना जो 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))

जो देता है:

यहाँ छवि विवरण दर्ज करें


मुझे यह उदाहरण पसंद है, लेकिन यदि आपके पास डेटा के कॉलम हैं जिनमें NA मान शामिल हैं तो यह काम नहीं करता है। मैं अनिश्चित हूं कि कोड को कैसे संशोधित किया जाए, लेकिन यह उपयोगी होगा
daisy

1
@ डेज़ी इस लाइन dens <- apply(myData, 2, density)को बदल देती है dens <- apply(myData, 2, density, na.rm=TRUE)और इसे काम करना चाहिए।
कारोलिस कोनसेविसियस

12

बस एक पूरा सेट प्रदान करने के लिए, यहाँ चेस के उत्तर का एक संस्करण उपयोग कर रहा है 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"))

जो इस तरह एक भूखंड का उत्पादन करता है: यहाँ छवि विवरण दर्ज करें


नई बनाने के बिना data.frame: densityplot(~rnorm(100)+rnorm(100, 10, 5), plot.points=FALSE, ref=TRUE, auto.key = list(space = "right"))। या ओपी डेटा के लिए densityplot(~Column1+Column2, data=myData)
मारेक

6

मैं इसे आधार में कैसे करता हूं (यह वास्तव में पहले उत्तर टिप्पणियों में उल्लेख किया गया है, लेकिन मैं यहां पूर्ण कोड दिखाऊंगा, जिसमें किंवदंती भी शामिल है क्योंकि मैं अभी तक टिप्पणी नहीं कर सकता ...)

सबसे पहले आपको घनत्व भूखंडों से y अक्ष के लिए अधिकतम मूल्यों पर जानकारी प्राप्त करने की आवश्यकता है। तो आपको वास्तव में पहले घनत्व को अलग से गणना करने की आवश्यकता है

dta_A <- density(VarA, na.rm = TRUE)
dta_B <- density(VarB, na.rm = TRUE)

फिर उन्हें पहले उत्तर के अनुसार प्लॉट करें और वाई अक्ष के लिए न्यूनतम और अधिकतम मान परिभाषित करें जो आपको अभी मिला है। (मैं शून्य मान को 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"))

3

मैंने उपरोक्त जाली उदाहरण लिया और एक निफ्टी फ़ंक्शन किया। पिघल / डाली के माध्यम से रिशेप के साथ ऐसा करने का एक बेहतर तरीका है। (यदि आपको कोई सुधार दिखाई दे तो टिप्पणी करें या संपादित करें।)

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))

2

आप ggjoyपैकेज का उपयोग कर सकते हैं । मान लीजिए कि हमारे तीन अलग-अलग betaवितरण हैं:

set.seed(5)
b1<-data.frame(Variant= "Variant 1", Values = rbeta(1000, 101, 1001))
b2<-data.frame(Variant= "Variant 2", Values = rbeta(1000, 111, 1011))
b3<-data.frame(Variant= "Variant 3", Values = rbeta(1000, 11, 101))


df<-rbind(b1,b2,b3)

आप तीन अलग-अलग वितरण प्राप्त कर सकते हैं:

library(tidyverse)
library(ggjoy)


ggplot(df, aes(x=Values, y=Variant))+
    geom_joy(scale = 2, alpha=0.5) +
    scale_y_discrete(expand=c(0.01, 0)) +
    scale_x_continuous(expand=c(0.01, 0)) +
    theme_joy()

यहाँ छवि विवरण दर्ज करें


2

जब भी बेमेल अक्ष सीमा के मुद्दे होते हैं, तो 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, ...)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.