2016-01-03 9 views
11

मैं (plotly में) एक स्कैटरप्लॉट बनाने की कोशिश कर रहा हूं जो एक ही श्रृंखला के बिंदुओं को दो (या तीन) सौंदर्यशास्त्र - रंग, आकार, आकार से अलग करता है। आखिरकार उद्देश्य तीन सौंदर्यशास्त्रों में से किसी एक का उपयोग करके पौराणिक कथाओं के माध्यम से बिंदुओं के समूहों को टॉगल करने में सक्षम होना है। यह एक सौंदर्य के लिए अच्छी तरह से काम करता है।प्लॉटली का उपयोग करके स्कैटर प्लॉट में रंग/आकार/आकार को एक साथ कैसे लागू करें?

[जोड़ा गया 2016/06/20] वांछित इंटरैक्टिव व्यवहार पर विस्तार करने के लिए: विचार, है एक बार आंकड़ा दिखाया गया है, किंवदंतियों में से किसी पर क्लिक करके अंक के समूहों टॉगल करने के लिए सक्षम होने के लिए। उदाहरण के लिए (नीचे नमूना डेटा में), अगर मैं पौराणिक कथाओं में y पर क्लिक करना चाहता था, तो यह सभी श्रृंखलाओं से अंक # 4, 5 और 10 छुपाएगा/दिखाएगा। यदि A पर कोई क्लिक है, तो टॉगल पॉइंट # 1, 2 और 8. वास्तविक जीवन उपयोग के मामले के रूप में - क्षैतिज धुरी पर परिपक्वता और ऊर्ध्वाधर पर मूल्य के साथ बॉन्ड की कीमतें सोचें। बांड उत्पत्ति, क्रेडिट रेटिंग और अंक आकार के देश द्वारा विशेषता है। इसलिए यदि मैं क्रेडिट रेटिंग "ए" पर क्लिक करता हूं, तो मुझे छुपाया जाने वाला आकार और मूल के देश के बावजूद सभी ए-रेटेड मुद्दे चाहिए। वर्तमान में वे केवल रेटिंग से संबंधित ट्रेस से छिपाए गए हैं। निशान में अंक जो अन्य विशेषताओं को दर्शाते हैं (आकार & देश) दिखाया गया है। नीचे दिए गए विस्तृत उत्तर को देखते हुए, मैं इसे plotly की साइट पर एक सुविधा अनुरोध के रूप में पोस्ट करने के इच्छुक हूं।

मैं plotly के लिए सवाल तैयार किए गए हैं, लेकिन इस व्यवहार अपेक्षाकृत कम दर्द के स्तर के साथ आर से दूसरे पैकेज/पुस्तकालय में प्राप्त किया जा सकता है, तो (जिसका अर्थ है कोई कस्टम जावास्क्रिप्ट या की तरह), मुझे लगता है कि बहुत स्वीकार करेंगे एक जवाब के रूप । [अंत संपादित करें]

स्थिर हिस्सा आसानी से (अन्तरक्रियाशीलता के लिए) ggplot2 में किया जाता है, लेकिन मैं plotly में इसे पुन: नहीं कर सकते हैं, यहां तक ​​कि ggplotly() का उपयोग कर। यकीन नहीं है कि यह संभव है, लेकिन सोचा कि मैं पूछूंगा। नमूना डेटा & नीचे कोड।

(संभवतः Using 2+ legends from R to plotly/plot.ly से संबंधित)

कुछ डमी डेटा जनरेट करें:

library(data.table) 
library(plotly) 
library(ggplot2) 


DT <- data.table(
    x = c(1:10), y = 1:10/2, 
    gr1 = c("A", "A", "B", "C", "D", "D", "B", "A", "E", "E"), 
    gr2 = c("x", "x", "x", "y", "y", "z", "z", "x", "x", "y"), 
    gr3 = c(1,2,2,1,3,4,1,2,2,1) 
) 

ggplot() संस्करण इस तरह लग रहा है, और मैं में plotly प्राप्त करना चाहते हैं क्या है:

p <- ggplot(data = DT) + geom_point(aes(x = x, y = y, color = gr1, shape = gr2, size = gr3)) 
p 

पौराणिक कथाओं में मानदंड के तीन समूह हैं, और अंक अलग-अलग रंग, आकार और आकार हैं। ggplot version

ggplotly(p) कॉलिंग चेतावनी के एक झुंड उत्पन्न करता है:

Warning messages: 
1: In if (s == Inf) { : 
    the condition has length > 1 and only the first element will be used 
2: In if (s == Inf) { : 
    the condition has length > 1 and only the first element will be used 
3: In if (s == Inf) { : 
    the condition has length > 1 and only the first element will be used 
4: In if (s == Inf) { : 
    the condition has length > 1 and only the first element will be used 
5: In if (s == Inf) { : 
    the condition has length > 1 and only the first element will be used 
6: In if (s == Inf) { : 
    the condition has length > 1 and only the first element will be used 
7: In if (s == Inf) { : 
    the condition has length > 1 and only the first element will be used 
8: In if (s == Inf) { : 
    the condition has length > 1 and only the first element will be used 

और यह आंकड़ा पैदा करता है:

ggplotly version

plot_ly() उपयोग करने के लिए कोशिश कर रहा है, मैं निम्नलिखित हो:

plot_ly(data = DT, x = x, y = y, color = gr1, symbol = gr2, type = "scatter", mode = "markers", marker = list(size = 10 * gr3)) # size is multiplied by 10, in plotly it is in pixels 

plot_ly version

समस्या रंग के पार की बजाय समस्या के बीच में सबसे स्पष्ट है, अलग-अलग रंगों में कई आकार एक-दूसरे पर आच्छादित होते हैं। चूंकि यह एकमात्र बिंदु है, इसलिए मुझे एक रंगीन आकार की उम्मीद है, जैसा कि ggplot में है। साजिश में, 'रंग', 'प्रतीक' और 'आकार' तर्क एक नया निशान बनाते हैं?

मैं अभी भी plotly पर काफी नया हूं, इसलिए मुझे कुछ स्पष्ट याद आ रही है।

ऊपर दिए गए R 3.2.2 का उपयोग विंडोज के तहत plotly_2.0.16 और ggplot2_2.0.0 के साथ किया जाता है।

उत्तर

3

दुर्भाग्य से, साजिशपूर्वक यह व्यवहार स्वचालित रूप से नहीं देता है। लेकिन, यह colors =, size =, और symbols = तर्कों का उपयोग करके प्रत्येक बिंदु के रंग, आकार और आकार को निर्दिष्ट करके बस पर्याप्त किया जा सकता है। यह इस बात पर नियंत्रण की अनुमति देता है कि अंक कैसे प्लॉट किए जाते हैं, लेकिन आपको जो किंवदंती चाहिए वह प्राप्त नहीं होता है। इसलिए हम मुख्य साजिश में showlegend = FALSE का उपयोग करते हैं और पौराणिक कथाओं को उत्पन्न करने के लिए केवल तीन और (अदृश्य) निशान जोड़कर पौराणिक कथाओं का निर्माण करते हैं।

ध्यान दें कि यहां एक और चाल है जिसे हमें यहां आवेदन करने की आवश्यकता है। रंग या आकार दिखाने वाली किंवदंती प्राप्त करने के लिए, आप visible = "legendonly" तर्क का उपयोग कर सकते हैं जो ग्राफ पर अतिरिक्त बिंदुओं को ओवर-प्लॉट किए बिना एक किंवदंती प्रविष्टि बनाता है। लेकिन यह आकार के साथ काम नहीं करता है। के साथ visible = "legendonly" का संयोजन एक बग है जो गलत वस्तुओं को किंवदंती में डालता है। इसलिए, आकृतियों के लिए किंवदंती प्रविष्टियों को बनाने के लिए, आप उन्हें समताप मंडल में बहुत दूर एक स्थान पर प्लॉट कर सकते हैं जहां वे कभी दिखाई नहीं देंगे (यहां मैंने x = y = 1e6 का उपयोग किया) और इन्हें बाहर रखने के लिए x और y अक्ष सीमाएं सेट की हैं मानना ​​है कि।

DT <- data.table(
    x = c(1:10), y = 1:10/2, 
    gr1 = as.factor(c("A", "A", "B", "C", "D", "D", "B", "A", "E", "E")), 
    gr2 = as.factor(c("x", "x", "x", "y", "y", "z", "z", "x", "x", "y")), 
    gr3 = c(1,2,2,1,3,4,1,2,2,1) 
) 
shapes <- c("circle", "square", "diamond","cross", "x","square-open","circle-open","diamond-open") 
DT$shapes <- shapes[DT$gr1] 
DT$col <- rainbow(3)[DT$gr2] 
DT$size <- DT$gr3*10 

plot_ly() %>% 
    add_trace(data = DT, x = x, y = y, type = "scatter", mode = "markers", 
      color=gr2, colors=col, 
      marker = list(size = size, symbol=shapes), showlegend=F) %>% 
    add_trace(data = DT, x = x, y = y, type = "scatter",mode = "markers", 
      color= factor(gr2), colors=col, 
      visible="legendonly", showlegend=T, legendgroup="color", 
      marker = list(size = 14)) %>% 
    add_trace(data = DT, x = x, y = y, type = "scatter",mode = "markers", 
      color=factor(gr3), colors="#000000", 
      marker = list(size = size), 
      visible="legendonly", showlegend=T, legendgroup="size") %>% 
    add_trace(data = DT, x = 1e6, y = 1e6, type = "scatter", mode = "markers", 
      color=factor(gr1), colors="#000000", 
      marker = list(size=14, symbol=shapes), 
      showlegend=T, legendgroup="shape") %>% 
    layout(legend=list(traceorder="grouped+reversed", tracegroupgap =30), 
     xaxis=list(range=c(0,12)), 
     yaxis=list(range=c(0,6))) 

enter image description here

+0

दिलचस्प जवाब के लिए धन्यवाद, "अब तक बाहर समताप मंडल में" एक महान स्पर्श :) यह एक बड़ी हद तक (नष्ट कर देता है कथा पर क्लिक करने के लिए दृश्य हिस्सा हल करने के लिए प्रकट होता है है प्रभाव, क्योंकि यह पिछले लोगों पर एक और आकार प्लॉट करता है)। हालांकि, मूल प्रश्न अंतःक्रियाशीलता (पहली वाक्य में) था - जो काम नहीं कर रहा है। विचार यह है कि, यदि मैं किंवदंतियों में 'सी', 'y' या' 1' पर क्लिक करता हूं तो बिंदु # 4 (x = 4, y = 2.0) गायब हो जाता है। इसे सभी तीन श्रृंखलाओं से संबंधित बिंदु छिपाना होगा, जो मुझे यकीन नहीं है कि स्टॉक 'प्लॉटली 'में संभव है। – Peter

+1

यदि आप अंक को ओवरप्लॉट करने के लिए किंवदंती पर क्लिक नहीं करना चाहते हैं (यह दृश्यता स्थिति को प्रभावी ढंग से टॉगल करता है), तो प्रत्येक पौराणिक कथाओं के लिए केवल समताप मंडल विधि का उपयोग करें। यदि आप इससे अधिक जटिल व्यवहार चाहते हैं, तो शुभकामनाएं ... संदेह है कि आप इसे साजिश में कर सकते हैं। – dww

+0

हां, मुझे लगा कि मैं बहुत ज्यादा चाहता हूं :) यदि वे मौजूद हैं, तो मैं इसे अन्य पैकेज/पुस्तकालयों के लिए सुझावों के लिए खोल सकता हूं। फिर से धन्यवाद - भले ही मैं इस तत्काल प्रश्न का उत्तर स्वीकार नहीं कर सकता, फिर भी मैंने एक उपयोगी चाल सीख ली। – Peter

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