R में ggplot2 के साथ ओवरस्टॉलिंग हिस्टोग्राम


124

मैं आर के लिए नया हूं और एक ही ग्राफ पर 3 हिस्टोग्राम की साजिश रच रहा हूं। सब कुछ ठीक काम किया, लेकिन मेरी समस्या यह है कि आप नहीं देखते हैं कि 2 हिस्टोग्राम ओवरलैप कहां हैं - वे कटे हुए दिखते हैं।

जब मैं घनत्व प्लॉट बनाता हूं, तो यह सही दिखता है: प्रत्येक वक्र एक काले फ्रेम लाइन से घिरा हुआ है, और रंग अलग दिखते हैं जहां वक्र ओवरलैप होते हैं।

क्या कोई मुझे बता सकता है कि क्या पहली तस्वीर में हिस्टोग्राम के साथ कुछ समान हासिल किया जा सकता है? यह वह कोड है जिसका मैं उपयोग कर रहा हूं:

lowf0 <-read.csv (....)
mediumf0 <-read.csv (....)
highf0 <-read.csv(....)
lowf0$utt<-'low f0'
mediumf0$utt<-'medium f0'
highf0$utt<-'high f0'
histogram<-rbind(lowf0,mediumf0,highf0)
ggplot(histogram, aes(f0, fill = utt)) + geom_histogram(alpha = 0.2)

3
हिस्टोग्राम के हाइपरलिंक और घनत्व का प्लॉट टूट गया है
डेगन ---

जवाबों:


115

आपका वर्तमान कोड:

ggplot(histogram, aes(f0, fill = utt)) + geom_histogram(alpha = 0.2)

सभी मानों का उपयोग करके एक हिस्टोग्राम का ggplotनिर्माण करने के लिए कह रहा है और फिर चर के अनुसार इस एकल हिस्टोग्राम की सलाखों को रंग दें ।f0utt

इसके बजाय आप क्या चाहते हैं, तीन अलग-अलग हिस्टोग्राम बनाना है, अल्फा सम्मिश्रण के साथ ताकि वे एक दूसरे के माध्यम से दिखाई दें। तो आप शायद तीन अलग-अलग कॉल का उपयोग करना चाहते हैं geom_histogram, जहां हर एक को अपना डेटा फ्रेम मिल जाता है और भरना होता है:

ggplot(histogram, aes(f0)) + 
    geom_histogram(data = lowf0, fill = "red", alpha = 0.2) + 
    geom_histogram(data = mediumf0, fill = "blue", alpha = 0.2) +
    geom_histogram(data = highf0, fill = "green", alpha = 0.2) +

यहाँ कुछ आउटपुट के साथ एक ठोस उदाहरण दिया गया है:

dat <- data.frame(xx = c(runif(100,20,50),runif(100,40,80),runif(100,0,30)),yy = rep(letters[1:3],each = 100))

ggplot(dat,aes(x=xx)) + 
    geom_histogram(data=subset(dat,yy == 'a'),fill = "red", alpha = 0.2) +
    geom_histogram(data=subset(dat,yy == 'b'),fill = "blue", alpha = 0.2) +
    geom_histogram(data=subset(dat,yy == 'c'),fill = "green", alpha = 0.2)

जो कुछ इस तरह का उत्पादन करता है:

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

टाइपो को ठीक करने के लिए संपादित; आप रंग भरना चाहते थे, रंग नहीं।


7
यह काम नहीं करता है जब सबसेट का आकार अलग होता है। किसी भी विचार यह कैसे पता? (जैसे "बी", 50 "बी" पर 100 अंकों के साथ डेटा का उपयोग करें)।
जॉर्ज लेइताओ

3
इस दृष्टिकोण का एक नकारात्मक पहलू यह है कि मुझे एक किंवदंती प्रदर्शित करने के लिए इसे प्राप्त करने में कठिनाई हुई (हालांकि यह मेरे ज्ञान की कमी के कारण हो सकता है)। नीचे दिए गए अन्य उत्तर @kohske द्वारा डिफ़ॉल्ट रूप से एक किंवदंती प्रदर्शित की जाएगी, जिसे तब संशोधित किया जा सकता है (हिस्टोग्राम पर प्रदर्शित विशिष्ट रंगों के साथ), जैसे scale_fill_manual()
माइकल ओह्लोग्रेज सेप

1
वास्तव में, हम इसमें किंवदंती कैसे जोड़ सकते हैं ??
shenglih

1
@ शेंगलीह एक किंवदंती के लिए, नीचे कोह्सके का जवाब बेहतर है। उनका जवाब भी आम तौर पर बेहतर है।
जोरान

F0 कहाँ से आता है?
एलन

256

@ जोरन के सैंपल डेटा का उपयोग करना,

ggplot(dat, aes(x=xx, fill=yy)) + geom_histogram(alpha=0.2, position="identity")

ध्यान दें कि डिफ़ॉल्ट स्थिति geom_histogram"स्टैक" है।

इस पृष्ठ का "स्थिति समायोजन" देखें:

docs.ggplot2.org/current/geom_histogram.html


30
मुझे लगता है कि क्योंकि यह कोड दोहरा से बचा जाता है इस शीर्ष जवाब होना चाहिए
KFOR

6
position = 'identity'यह एक अधिक पठनीय उत्तर नहीं है, यह अधिक जटिल भूखंडों जैसे कि मिश्रित कॉल aes()और के साथ अधिक अच्छी तरह से जैल करता है aes_string()
रेन्सा

2
यह उत्तर स्वचालित रूप से रंगों के लिए एक किंवदंती प्रदर्शित करेगा, जबकि @joran द्वारा उत्तर नहीं होगा। इसके बाद किंवदंती का उपयोग करके संशोधित किया जा सकता है, जैसे scale_fill_manual()। इस फ़ंक्शन का उपयोग हिस्टोग्राम में रंगों को संशोधित करने के लिए भी किया जा सकता है।
माइकल ओह्लोग्रैज

4
इसके अलावा, सुनिश्चित करें कि इस्तेमाल किया गया चर fillएक कारक है।
hhh

9
व्यक्तिगत रूप से मुझे लगता है कि स्टैकओवरफ्लो को सबसे पहले उत्क्रमित उत्तर की सूची देनी चाहिए। "सही उत्तर" केवल एक व्यक्ति की राय को दर्शाता है।
डकैनोल्स

25

जबकि ggplot2 में कई / अतिव्यापी हिस्टोग्राम को साजिश करने के लिए केवल कुछ लाइनों की आवश्यकता होती है, परिणाम हमेशा संतोषजनक नहीं होते हैं। सीमाओं और रंग का उचित उपयोग करने की आवश्यकता है ताकि यह सुनिश्चित किया जा सके कि आंख हिस्टोग्राम के बीच अंतर कर सकती है

निम्न कार्य दर्शकों को वितरण के बीच अंतर करने में सक्षम करने के लिए सीमा के रंग, अपारदर्शी और सुपरिम्पोज्ड घनत्व भूखंडों को संतुलित करते हैं

एकल हिस्टोग्राम :

plot_histogram <- function(df, feature) {
    plt <- ggplot(df, aes(x=eval(parse(text=feature)))) +
    geom_histogram(aes(y = ..density..), alpha=0.7, fill="#33AADE", color="black") +
    geom_density(alpha=0.3, fill="red") +
    geom_vline(aes(xintercept=mean(eval(parse(text=feature)))), color="black", linetype="dashed", size=1) +
    labs(x=feature, y = "Density")
    print(plt)
}

एकाधिक हिस्टोग्राम :

plot_multi_histogram <- function(df, feature, label_column) {
    plt <- ggplot(df, aes(x=eval(parse(text=feature)), fill=eval(parse(text=label_column)))) +
    geom_histogram(alpha=0.7, position="identity", aes(y = ..density..), color="black") +
    geom_density(alpha=0.7) +
    geom_vline(aes(xintercept=mean(eval(parse(text=feature)))), color="black", linetype="dashed", size=1) +
    labs(x=feature, y = "Density")
    plt + guides(fill=guide_legend(title=label_column))
}

प्रयोग :

सीधे शब्दों में ऊपर कार्यों में अपने डेटा फ्रेम पारित वांछित तर्कों सहित:

plot_histogram(iris, 'Sepal.Width')

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

plot_multi_histogram(iris, 'Sepal.Width', 'Species')

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

अतिरिक्त पैरामीटर plot_multi_histogram में श्रेणी लेबल वाले कॉलम का नाम है।

हम कई अलग-अलग वितरण साधनों के साथ डेटाफ्रेम बनाकर इसे और नाटकीय रूप से देख सकते हैं :

a <-data.frame(n=rnorm(1000, mean = 1), category=rep('A', 1000))
b <-data.frame(n=rnorm(1000, mean = 2), category=rep('B', 1000))
c <-data.frame(n=rnorm(1000, mean = 3), category=rep('C', 1000))
d <-data.frame(n=rnorm(1000, mean = 4), category=rep('D', 1000))
e <-data.frame(n=rnorm(1000, mean = 5), category=rep('E', 1000))
f <-data.frame(n=rnorm(1000, mean = 6), category=rep('F', 1000))
many_distros <- do.call('rbind', list(a,b,c,d,e,f))

पहले की तरह डेटा फ्रेम पास करना (और विकल्पों का उपयोग करके चार्ट को चौड़ा करना):

options(repr.plot.width = 20, repr.plot.height = 8)
plot_multi_histogram(many_distros, 'n', 'category')

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


1
यह बहुत उपयोगी है, उम्मीद है कि अधिक ध्यान दिया जाए।
एडवर्ड टायलर

2
@EdwardTyler बहुत सच है। काश मैं इसे एक से अधिक बार उखाड़ सकता!
ऐयपेथ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.