2017-06-12 10 views
5

मैंने 3 अलग-अलग रंगों के साथ एक स्कैटर प्लॉट बनाया और मैं प्रतीक के रंग और किंवदंती में पाठ से मेल खाना चाहता हूं।matplotlib: स्कैटर प्लॉट में प्रतीक के साथ मैच लीजेंड टेक्स्ट रंग

एक अच्छा solution लाइन भूखंडों के मामले के लिए मौजूद हैं:

leg = ax.legend() 

# change the font colors to match the line colors: 
for line,text in zip(leg.get_lines(), leg.get_texts()): 
    text.set_color(line.get_color()) 

हालांकि, बिखराव साजिश रंग 3 रंग के मामले .For get_lines() द्वारा पहुँचा नहीं जा सकता मुझे लगता है कि मैं मैन्युअल रूप से पाठ रंग सेट कर सकते हैं एक- उदाहरण के लिए एक-एक करके। text.set_color('r')। लेकिन मैं उत्सुक था अगर इसे लाइनों के रूप में स्वचालित रूप से किया जा सकता है। धन्यवाद!

+0

कैसे get_children' के बारे में ' या 'get_patches'? क्या आप न्यूनतम कामकाजी उदाहरण प्रदान कर सकते हैं? आप अन्य विचारों के लिए पौराणिक तरीकों को देखना चाह सकते हैं: https://matplotlib.org/1.3.0/api/legend_api.html –

+0

@AleksanderLidtke सुझावों के लिए धन्यवाद! मैंने पहले 'leg.get_patches()' की कोशिश की और कुछ भी वापस नहीं आया। मैंने अभी 'leg.get_children() 'की कोशिश की है और यह' matplotlib.offsetbox.VPacker' और 'matplotlib.patches.FancyBboxPatch' ऑब्जेक्ट्स लौटाता है, जिनमें से कोई भी संपत्ति 'get_color()' है। समाधान लिंक में लाइनों के लिए एक कामकाजी उदाहरण है, स्कैटर प्लॉट्स के साथ खेद है, मेरे पास केवल एक गैर-कामकाजी उदाहरण है ... – Phyinmi

+0

एक गैर-कामकाजी उदाहरण ठीक है। कृपया, बस एक साधारण उदाहरण बनाएं जो दिखाता है कि आप स्कैटर प्लॉट और किंवदंती कैसे बनाते हैं। यदि यह काम नहीं करता है, तो कृपया कहें कि आपको कौन सी त्रुटियां मिलती हैं। –

उत्तर

0

यह जटिल लगता है लेकिन जो आपको चाहिए वह आपको देता है। सुझावों का स्वागत है। मैं मार्करों को प्राप्त करने के लिए ax.get_legend_handles_labels() का उपयोग करता हूं और matplotlib रंग tuple प्राप्त करने के लिए tuple(handle.get_facecolor()[0]) का उपयोग करता हूं।

संपादित करें::

रूप ImportanceOfBeingErnest उसकी answer में कहा: इस तरह एक बहुत सरल बिखराव साजिश के साथ एक उदाहरण बना दिया

  1. leg.legendHandles कथा संभालती प्राप्त होगा;
  2. सूची, टुपल के बजाय, matplotlib रंग असाइन करने के लिए उपयोग किया जा सकता है।

संहिताओं सरलीकृत कर रहे हैं के रूप में:

import matplotlib.pyplot as plt 
from numpy.random import rand 


fig, ax = plt.subplots() 
for color in ['red', 'green', 'blue']: 
    x, y = rand(2, 10) 
    ax.scatter(x, y, c=color, label=color) 

leg = ax.legend() 
for handle, text in zip(leg.legendHandles, leg.get_texts()): 
    text.set_color(handle.get_facecolor()[0]) 

plt.show() 

मुझे क्या मिला है: enter image description here

4

स्कैटर भूखंडों एक facecolor और एक edgecolor है। स्कैटर के लिए पौराणिक हैंडलर PathCollection है।

तो तुम पर कथा हैंडल पाश और कथा का facecolor के लिए पाठ रंग सेट संभाल कर सकते हैं

for h, t in zip(leg.legendHandles, leg.get_texts()): 
    t.set_color(h.get_facecolor()[0]) 

पूरा कोड:

import matplotlib.pyplot as plt 
import numpy as np 

fig, ax = plt.subplots() 
for i in range(3): 
    x,y = np.random.rand(2, 20) 
    ax.scatter(x, y, label="Label {}".format(i)) 

leg = ax.legend() 

for h, t in zip(leg.legendHandles, leg.get_texts()): 
    t.set_color(h.get_facecolor()[0]) 

plt.show() 

enter image description here

+0

'किंवदंती हैंडल्स' का जिक्र करने के लिए धन्यवाद! किसी भी तरह से मुझे इसे डॉक्टर में नहीं मिला, हालांकि ऐसा लगता है कि 'get_legend_handles_labels() ' – Phyinmi

+0

' leg.legendHandles' और रंग 'सूची' के रूप में रंग दिखाने के लिए धन्यवाद। बहुत कुछ सीखा! –

+1

'legend.legend हैंडल्स 'हैंडल की सूची है जो वास्तव में किंवदंती में हैं, जबकि' ax.get_legend_handles_labels() 'हैंडल और लेबल की सूची देता है जो पौराणिक कथाओं में होने के लिए अर्हता प्राप्त करेंगे।तो अंतर दिखाई देगा जब पौराणिक कथाओं में सभी कलाकारों को शामिल नहीं किया जाएगा या जब पौराणिक कथाओं में कलाकारों को शामिल किया जाएगा, जो साजिश का हिस्सा नहीं हैं। – ImportanceOfBeingErnest

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