Ggplot2 में श्रेणीबद्ध चर वाले रंगों को कैसे नियत किया जाए जिसमें स्थिर मानचित्रण हो?


178

मैं पिछले महीने में आर के साथ गति करने के लिए उठ रहा हूं।

यहाँ मेरा सवाल है:

Ggplot2 में श्रेणीबद्ध चरों को रंग प्रदान करने का एक अच्छा तरीका क्या है जिसमें स्थिर मानचित्रण है? मुझे रेखांकन के एक सेट में लगातार रंगों की आवश्यकता होती है जिसमें विभिन्न उपसमूह होते हैं और विभिन्न प्रकार के श्रेणीबद्ध चर होते हैं।

उदाहरण के लिए,

plot1 <- ggplot(data, aes(xData, yData,color=categoricaldData)) + geom_line()

जहां categoricalData5 स्तर हैं।

और तब

plot2 <- ggplot(data.subset, aes(xData.subset, yData.subset, 
                                 color=categoricaldData.subset)) + geom_line()

जहां categoricalData.subset3 स्तर हैं।

हालांकि, एक विशेष स्तर जो दोनों सेटों में है, एक अलग रंग के साथ समाप्त होगा, जिससे ग्राफ़ को एक साथ पढ़ना मुश्किल हो जाता है।

क्या मुझे डेटा फ़्रेम में रंगों का वेक्टर बनाने की आवश्यकता है? या श्रेणियों के लिए विशिष्ट रंगों को असाइन करने का एक और तरीका है?

जवाबों:


187

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

इसे संबोधित करने का एक तरीका निम्नानुसार एक कस्टम मैनुअल रंग स्केल बनाना है:

#Some test data
dat <- data.frame(x=runif(10),y=runif(10),
        grp = rep(LETTERS[1:5],each = 2),stringsAsFactors = TRUE)

#Create a custom color scale
library(RColorBrewer)
myColors <- brewer.pal(5,"Set1")
names(myColors) <- levels(dat$grp)
colScale <- scale_colour_manual(name = "grp",values = myColors)

और फिर आवश्यकतानुसार प्लॉट पर रंग स्केल जोड़ें:

#One plot with all the data
p <- ggplot(dat,aes(x,y,colour = grp)) + geom_point()
p1 <- p + colScale

#A second plot with only four of the levels
p2 <- p %+% droplevels(subset(dat[4:10,])) + colScale

पहला प्लॉट इस तरह दिखता है:

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

और दूसरा प्लॉट इस तरह दिखता है:

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

इस तरह आपको यह देखने के लिए प्रत्येक डेटा फ़्रेम को याद रखने या जाँचने की आवश्यकता नहीं है कि उनके पास उपयुक्त स्तर हैं।


1
यह काम करेगा, लेकिन शायद अधिक जटिल है। मुझे नहीं लगता कि इसके लिए आपको कोई मैनुअल पैमाना बनाने की जरूरत है। आप सभी की जरूरत है factorकि सभी भूखंडों के बीच आम है।
एंड्री

14
@Andrie - एक एकल सबसेट के लिए, हाँ। लेकिन अगर आप बहुत सारे डेटा सेटों की बाजीगरी कर रहे हैं जो एक मूल डेटा फ़्रेम को कम करके नहीं बनाए गए थे, तो मुझे यह रणनीति बहुत सरल लगती है।
जोरान

2
@ जोरान थैंक्स जोरान। यह मेरे लिए काम किया! यह कारकों की सही संख्या के साथ एक किंवदंती बनाता है। मुझे दृष्टिकोण पसंद है और विभिन्न डेटा सेटों में रंग मैपिंग प्राप्त करने के लिए तीन लाइनों के लायक है।
विंटोर

3
मैं की जरूरत: पुस्तकालय ( "RColorBrewer")
PatrickT

4
पूरी तरह से काम किया! मैंने fillScale <- scale_fill_manual(name = "grp",values = myColors)बार भूखंडों के साथ इसका उपयोग करने के लिए जोड़ा ।
p:१४ पर

42

मैं उसी स्थिति में हूं जो उनकी टिप्पणी में मैस्क्यू द्वारा इंगित किया गया है : दुर्भाग्य से थियरी का जवाब ggplot2 संस्करण 0.9.3.1 के साथ काम नहीं करता है।

png("figure_%d.png")
set.seed(2014)
library(ggplot2)
dataset <- data.frame(category = rep(LETTERS[1:5], 100),
    x = rnorm(500, mean = rep(1:5, 100)),
    y = rnorm(500, mean = rep(1:5, 100)))
dataset$fCategory <- factor(dataset$category)
subdata <- subset(dataset, category %in% c("A", "D", "E"))

ggplot(dataset, aes(x = x, y = y, colour = fCategory)) + geom_point()
ggplot(subdata, aes(x = x, y = y, colour = fCategory)) + geom_point()

यहाँ यह पहला आंकड़ा है:

ggplot AE, मिश्रित रंग

और दूसरा आंकड़ा:

ggplot ADE, मिश्रित रंग

जैसा कि हम देख सकते हैं कि रंग स्थिर नहीं रहते हैं, उदाहरण के लिए मजेंटा से लेकर ई तक स्विच।

द्वारा सुझाव दिया गया है malcook में उसकी टिप्पणी और द्वारा हैडली में उसकी टिप्पणी कोड है जो का उपयोग करता है limitsकाम करता है ठीक से:

ggplot(subdata, aes(x = x, y = y, colour = fCategory)) +       
    geom_point() + 
    scale_colour_discrete(drop=TRUE,
        limits = levels(dataset$fCategory))

निम्नलिखित आंकड़ा देता है, जो सही है:

सही ggplot

इस से उत्पादन है sessionInfo():

R version 3.0.2 (2013-09-25)
Platform: x86_64-pc-linux-gnu (64-bit)

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] methods   stats     graphics  grDevices utils     datasets  base     

other attached packages:
[1] ggplot2_0.9.3.1

loaded via a namespace (and not attached):
 [1] colorspace_1.2-4   dichromat_2.0-0    digest_0.6.4       grid_3.0.2        
 [5] gtable_0.1.2       labeling_0.2       MASS_7.3-29        munsell_0.4.2     
 [9] plyr_1.8           proto_0.3-10       RColorBrewer_1.0-5 reshape2_1.2.2    
[13] scales_0.2.3       stringr_0.6.2 

3
आपको एक नए प्रश्न के रूप में पोस्ट करना चाहिए, इस प्रश्न को संदर्भित करना और यह दिखाना कि यहां समाधान क्यों काम नहीं किया।
ब्रायन डिग

इसी तरह का सवाल यहां पूछा गया था , लेकिन मैं यह बताना चाहता हूं कि स्वीकृत उत्तर ठीक काम करता है।
tonytonov

1
तो मुझे पता है कि यह पुराना है, लेकिन मुझे आश्चर्य है कि अगर किंवदंती में अतिरिक्त रंग न होने के बावजूद ऐसा करने का कोई तरीका है।
गोरथ

20

सबसे आसान उपाय यह है कि अपने श्रेणीबद्ध चर को घटाव से पहले एक कारक में परिवर्तित किया जाए। लब्बोलुआब यह है कि आपको अपने सभी सबसेट में समान स्तरों के साथ एक कारक चर की आवश्यकता है।

library(ggplot2)
dataset <- data.frame(category = rep(LETTERS[1:5], 100), 
    x = rnorm(500, mean = rep(1:5, 100)), y = rnorm(500, mean = rep(1:5, 100)))
dataset$fCategory <- factor(dataset$category)
subdata <- subset(dataset, category %in% c("A", "D", "E"))

एक चरित्र चर के साथ

ggplot(dataset, aes(x = x, y = y, colour = category)) + geom_point()
ggplot(subdata, aes(x = x, y = y, colour = category)) + geom_point()

एक कारक चर के साथ

ggplot(dataset, aes(x = x, y = y, colour = fCategory)) + geom_point()
ggplot(subdata, aes(x = x, y = y, colour = fCategory)) + geom_point()

11
सबसे आसान तरीका सीमा का उपयोग करना है
हैडली

1
इस संदर्भ में एक उदाहरण प्रदान कर सकता हैडली? मुझे यकीन नहीं है कि एक कारक के साथ सीमा का उपयोग कैसे करें।
थियरी

@ थिएरी धन्यवाद। मैं अपनी पहली पोस्ट पर प्रतिक्रियाएं पाकर खुश था। और धन्यवाद Thierry या प्रतिलिपि प्रस्तुत करने योग्य कोड में जोड़ने के रूप में मुझे अपनी पोस्ट में होना चाहिए ... मेरे श्रेणीबद्ध चर सही प्रकार - कारक थे। दूसरा मुद्दा यह है कि मैं चाहता हूं कि किंवदंती अप्रयुक्त कारकों को न दिखाए। किंवदंती का निर्माण करते समय अप्रयुक्त वर्ण चर को अनदेखा करता है। हालांकि, अप्रयुक्त कारक बने रहते हैं। यदि मैं उनका उपयोग करना छोड़ देता हूं: उपडेटा $ श्रेणी <- कारक (उपडेटा $ श्रेणी) [ड्रॉप = ट्रू] तो किंवदंती ने कारकों की सही संख्या बताई है लेकिन मैपिंग में नुकसान होता है।
विंटूर

11
@ थिएरी - मेरे हाथों में, ggplot2_0.9.3.1 का उपयोग करते हुए, यह विधि काम नहीं करती है; fCategory को सौंपे गए रंग दो भूखंडों के बीच भिन्न होते हैं। हालाँकि, खुशी से, @ क्विंट, मुझे लगा कि @ हडले सुझाव दे रहा है कि + scale_colour_discrete(drop=TRUE,limits = levels(dataset$fCategory))रंग को संरक्षित करने के लिए। कारक संघ लेकिन, जो काम करता है, मेरे हाथों को छोड़कर, ड्रॉप = ट्रू का सम्मान नहीं किया जा रहा है (मुझे उम्मीद है कि इससे स्तर को हटा दें। प्रसिद्ध व्यक्ति)। Drat ... या यह मैं हूँ?
malcook

1
@malcook, drop = TRUE के बजाय, आपको निर्दिष्ट करने की आवश्यकता है कि आप "ब्रेक" के माध्यम से किन स्तरों को रखना चाहते हैं: github.com/hadley/ggplot2/issues/1433
Eric

17

यह एक पुरानी पोस्ट है, लेकिन मैं इस प्रश्न का उत्तर ढूंढ रहा था,

क्यों न कुछ आज़माएं:

scale_color_manual(values = c("foo" = "#999999", "bar" = "#E69F00"))

यदि आपके पास श्रेणीबद्ध मूल्य हैं, तो मुझे कोई कारण नहीं दिखता कि यह काम क्यों न करे।


3
यह वास्तव में जोरान का जवाब है, लेकिन myColors <- brewer.pal(5,"Set1"); names(myColors) <- levels(dat$grp)स्तरों को मैन्युअल रूप से कोड करने से बचने के लिए उपयोग करना।
एक्समेन

हालांकि, जोरन का जवाब रंगों के मूल्यों को नहीं बताता है। ऐसे मामले हैं जहां आपको किसी दिए गए कारक के लिए एक विशिष्ट रंग मूल्य की आवश्यकता होती है।
रेने न्यफेनेगर

जबकि मुझे कुछ मामलों में "हार्ड कोडिंग" के नकारात्मक पहलू मिलते हैं, मुझे लगता है कि बहुत बार अमूर्त डेवलपर्स / कोडर्स की परतें अपने काम को कम सुलभ बनाती हैं, अधिक नहीं। इस मामले में आशय 100% स्पष्ट है। साथ ही यह सोचना आसान है कि एक उपयोगिता फ़ंक्शन कैसे बनाया जाए जो इस उदाहरण पर फैलता है जो विशिष्ट रंगों के नामांकित वेक्टर को लौटाता है।
मैट बैरस्टेड

16

जोरन द्वारा बहुत ही उपयोगी उत्तर के आधार पर मैं बूलियन फैक्टर ( TRUE; FALSE) के लिए स्थिर रंग पैमाने के लिए इस समाधान के साथ आने में सक्षम था ।

boolColors <- as.character(c("TRUE"="#5aae61", "FALSE"="#7b3294"))
boolScale <- scale_colour_manual(name="myboolean", values=boolColors)

ggplot(myDataFrame, aes(date, duration)) + 
  geom_point(aes(colour = myboolean)) +
  boolScale

चूंकि ColorBrewer बाइनरी कलर स्केल के साथ बहुत मददगार नहीं है, इसलिए दो आवश्यक रंगों को मैन्युअल रूप से परिभाषित किया गया है।

यहां TRUE / FALSE कारक mybooleanको myDataFrameपकड़ने के लिए कॉलम का नाम है । dateऔर durationइस उदाहरण में भूखंड के x और y अक्ष पर मैप किए जाने वाले स्तंभ नाम हैं।


एक अन्य दृष्टिकोण "as.character ()" कॉलम पर लागू करना है। यह इसे एक स्ट्रिंग स्तंभ बना देगा जो स्केल _ * _ मैनुअल के साथ अच्छी तरह से काम करता है
साहिर मूसवी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.