2016-05-10 1 views
24

मान लीजिए मैं ggplot में निम्नलिखित साजिश है:ggplot में रंग, रेखा शैली और आकार किंवदंतियों विलय करने के लिए कैसे

x <- seq(0, 10, by = 0.2) 
y1 <- sin(x) 
y2 <- cos(x) 
y3 <- cos(x + pi/4) 
y4 <- sin(x + pi/4) 
df1 <- data.frame(x, y = y1, Type = as.factor("sin"), Method = as.factor("method1")) 
df2 <- data.frame(x, y = y2, Type = as.factor("cos"), Method = as.factor("method1")) 
df3 <- data.frame(x, y = y3, Type = as.factor("cos"), Method = as.factor("method2")) 
df4 <- data.frame(x, y = y4, Type = as.factor("sin"), Method = as.factor("method2")) 

df.merged <- rbind(df1, df2, df3, df4) 

ggplot(df.merged, aes(x, y, colour = interaction(Type, Method), linetype = Method, shape = Type)) + geom_line() + geom_point() 

मैं करूंगा:

ggplot graph

यह नीचे दिए गए कोड का उपयोग कर उत्पन्न की गई जैसे कि केवल एक किंवदंती है जो आकार, रंग और रेखा प्रकारों को सही ढंग से प्रदर्शित करती है (बातचीत (प्रकार, विधि) किंवदंतियों को मैं जो चाहूं उसके सबसे नज़दीक है, लेकिन इसमें सही आकार/रेखा प्रकार नहीं हैं)।

मुझे पता है कि अगर मैं scale_xxx_manual का उपयोग करता हूं और मैं सभी किंवदंतियों के लिए एक ही लेबल निर्दिष्ट करता हूं तो उन्हें विलय कर दिया जाएगा, लेकिन मैं लेबल को मैन्युअल रूप से सेट नहीं करना चाहता हूं: यदि नए तरीके या प्रकार हैं, तो मैं नहीं करता मेरे कोड को संशोधित करना नहीं चाहता: एक सामान्य कुछ चाहते हैं।

संपादित

नीचे दिए गए उत्तर में बताया, वहाँ कई तरीके काम इस विशेष मामले में करवाने के लिए कर रहे हैं। सभी प्रस्तावित समाधानों को scale_xxx_manual function एस या guides फ़ंक्शन के साथ या तो लीजेंड लाइन प्रकारों और आकारों को मैन्युअल रूप से सेट करने की आवश्यकता होती है।

हालांकि, प्रस्तावित समाधान अभी भी सामान्य मामले में काम नहीं करते हैं: उदाहरण के लिए, यदि मैं एक नए "विधि 3" विधि के साथ डेटा सेट में एक नया डेटा फ्रेम जोड़ता हूं, तो यह अब काम नहीं करता है

y5 <- sin(x - pi/4) 
df5 <- data.frame(x, y = y5, Type = as.factor("sin"), Method = as.factor("method3")) 
df.merged <- rbind(df1, df2, df3, df4, df5) 
override.shape <- c(16, 17, 16, 17, 16) 
override.linetype <- c(1, 1, 3, 3, 4) 

g <- ggplot(df.merged, aes(x, y, colour = interaction(Type, Method), linetype = Method, shape = Type)) + geom_line() + geom_point() 
g <- g + guides(colour = guide_legend(override.aes = list(shape = override.shape, linetype = override.linetype))) 
g <- g + scale_shape(guide = FALSE) 
g <- g + scale_linetype(guide = FALSE) 
print(g) 

यह देता है::

5 curves

अब सवाल है: कैसे स्वचालित रूप से override.shape और override.linetype वैक्टर उत्पन्न करने के लिए मैन्युअल रूप से नए कथा आकृति और लाइन प्रकार जोड़ने?

ध्यान दें कि वेक्टर आकार 5 है, क्योंकि हम, 5 घटता है, जबकि interaction(Type, Method) कारक आकार 6 (मैं क्योंकि/method3 संयोजन के लिए डेटा नहीं है)

+1

आपका रंग स्केल संयुक्त आकार और लिनटाइप स्केल के लिए अनावश्यक है। आपको इनमें से केवल एक का उपयोग करना चाहिए। – Roland

+0

हां, इसकी अनावश्यक। सबसे पहले, मेरे पास विधि में मैप किए गए टाइप और लिनटाइप के लिए मैप किए गए रंग थे। लेकिन फिर, जब वक्र एक दूसरे के बहुत करीब थे, तो उन्हें अलग करना मुश्किल था। इस प्रकार अनावश्यकता – Ben

+1

अनावश्यक आकार/रंग समूह परिभाषाओं के लिए अक्सर उपयुक्त होता है। कई वैज्ञानिक प्रकाशनों में, रंग समूहों को अलग करने का सबसे अधिक प्रभावशाली तरीका है, लेकिन आप यह भी जानते हैं कि पाठकों का एक बड़ा हिस्सा पेपर की काले और सफेद प्रतियां प्रिंट करेगा, और इसलिए आप एक दृश्य क्यू भी शामिल करना चाहते हैं जो ' रंग पर निर्भर नहीं है। – neuropsych

उत्तर

3

यहाँ सामान्य मामले में समाधान है:

# Create the data frames 
x <- seq(0, 10, by = 0.2) 
y1 <- sin(x) 
y2 <- cos(x) 
y3 <- cos(x + pi/4) 
y4 <- sin(x + pi/4) 
y5 <- sin(x - pi/4) 
df1 <- data.frame(x, y = y1, Type = as.factor("sin"), Method = as.factor("method1")) 
df2 <- data.frame(x, y = y2, Type = as.factor("cos"), Method = as.factor("method1")) 
df3 <- data.frame(x, y = y3, Type = as.factor("cos"), Method = as.factor("method2")) 
df4 <- data.frame(x, y = y4, Type = as.factor("sin"), Method = as.factor("method2")) 
df5 <- data.frame(x, y = y5, Type = as.factor("sin"), Method = as.factor("method3")) 

# Merge the data frames 
df.merged <- rbind(df1, df2, df3, df4, df5) 

# Create the interaction 
type.method.interaction <- interaction(df.merged$Type, df.merged$Method) 

# Compute the number of types and methods 
nb.types <- nlevels(df.merged$Type) 
nb.methods <- nlevels(df.merged$Method) 

# Set the legend title 
legend.title <- "My title" 

# Initialize the plot 
g <- ggplot(df.merged, aes(x, 
          y, 
          colour = type.method.interaction, 
          linetype = type.method.interaction, 
          shape = type.method.interaction)) + geom_line() + geom_point() 
# Here is the magic 
g <- g + scale_color_discrete(legend.title) 
g <- g + scale_linetype_manual(legend.title, 
           values = rep(1:nb.types, nb.methods)) 
g <- g + scale_shape_manual(legend.title, 
          values = 15 + rep(1:nb.methods, each = nb.types)) 
# Display the plot 
print(g) 

परिणाम निम्नलिखित है:

The solution

  • साइनस वक्र एस को ठोस लाइनों और कोसिनस वक्र के रूप में खींचा जाता है जैसे धराशायी रेखाएं।
  • "method1" डेटा आकार के लिए भरे सर्कल का उपयोग करता है।
  • "method2" डेटा आकार के लिए भरे त्रिकोण का उपयोग करता है।
  • "विधि 3" डेटा आकार के लिए भरे हुए हीरे का उपयोग करता है।
  • कथा वक्र

संक्षेप करने से मेल खाता है, ट्रिक हैं:

  • प्रकार/विधि interaction का उपयोग सभी डेटा अभ्यावेदन (रंग, आकार, linetype, आदि)
  • के लिए
  • फिर scale_xxx_manual के साथ वक्र शैलियों और किंवदंतियों शैलियों दोनों मैन्युअल रूप से सेट करें।
  • scale_xxx_manual आप एक मूल्यों वेक्टर घटता की वास्तविक संख्या से अधिक लंबी है कि प्रदान करने के लिए अनुमति देता है, तो यह प्रकार के आकार से शैली वेक्टर मूल्यों की गणना करने के लिए आसान है और विधि कारकों
16

मैं दूसरे दिन इस समस्या थी हैं। Legends पर आर कुकबुक अनुभाग बताते हैं:

तुम दोनों रंग और आकार का उपयोग करते हैं, वे दोनों पैमाने दिए जाने की विनिर्देशों की जरूरत है। अन्यथा दो दो अलग किंवदंतियों होंगे।

आपके मामले में आपको shape और linetype के लिए विनिर्देशों की आवश्यकता है।

संपादित

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

आप सभी संभव आकार और लाइन प्रकार की एक विस्तृत लेआउट चाहते हैं, तो जाँच this R Graphics site संख्या पहचानकर्ता को देखने के लिए:

df.merged$int <- paste(df.merged$Type, df.merged$Method, sep=".") 

ggplot(df.merged, aes(x, y, colour = int, linetype=int, shape=int)) + 
    geom_line() + 
    geom_point() + 
    scale_colour_discrete("") + 
    scale_linetype_manual("", values=c(1,2,1,2)) + 
    scale_shape_manual("", values=c(17,17,16,16)) 

enter image description here

+1

वैसे यह लिनटाइप और आकार के लिए डायब्बलिंग किंवदंतियों के समान होगा, लेकिन मुझे लगता है कि ओपी प्रत्येक – beetroot

+0

में संयुक्त रंग/लिनटाइप/आकृति के साथ 4 किंवदंती प्रतीकों को चाहता है, ठीक है, यह लगभग वही है जो मैं ढूंढ रहा हूं: आपके पास एक किंवदंती है, सच। लेकिन मैं scale_shape (गाइड = FALSE) और scale_linetype (गाइड = FALSE) के साथ एक ही परिणाम प्राप्त कर सकता था।और आपके समाधान के साथ, मेरे पास पौराणिक कथाओं में ठोस/धराशायी रेखाएं नहीं हैं, न ही आकार। – Ben

+0

@beetroot मैं सहमत हूं – Ben

5

वांछित कथा में परिणाम नीचे कोड, अगर मैं आपका प्रश्न समझता हूं, लेकिन मुझे यकीन नहीं है कि मैं लेबल समस्या को समझता हूं, तो मुझे बताएं कि क्या यह वह नहीं है जिसे आप ढूंढ रहे थे।

p = ggplot(df.merged, aes(x, y, colour=interaction(Type, Method), 
          linetype=interaction(Type, Method), 
          shape=interaction(Type, Method))) + 
    geom_line() + 
    geom_point() 

p + scale_shape_manual(values=rep(16:17, 2)) + 
    scale_linetype_manual(values=rep(c(1,3),each=2)) 

enter image description here

+0

यह वास्तव में ऐसा करने का एक तरीका है। मैं एक और समाधान पोस्ट करूंगा जो मैंने पाया था। आईएमएचओ, दोनों बहुत आसान नहीं हैं और मेरी इच्छा है कि इस मामले को संभालने का एक बेहतर तरीका था। – Ben

2

एक बस नाम की जरूरत है दोनों गाइड एक ही हैं। उदाहरण के लिए:

g+ scale_linetype_manual(name="Guide1",values= c('solid', 'solid', 'dotdash'))+ 
    scale_colour_manual(name="Guide1", values = c("blue", "green","red")) 
+0

जो वास्तव में बहुत अच्छी तरह से काम करता है !!!!! –

संबंधित मुद्दे