2014-07-11 8 views
13

में अंक के लिए एक निश्चित आकार निर्धारित करना मैं कुछ स्कैटर प्लॉट बना रहा हूं और मैं पौराणिक कथाओं में अंक के आकार को एक निश्चित, बराबर मान पर सेट करना चाहता हूं।किंवदंती

import matplotlib.pyplot as plt 
import numpy as np 

def rand_data(): 
    return np.random.uniform(low=0., high=1., size=(100,)) 

# Generate data. 
x1, y1 = [rand_data() for i in range(2)] 
x2, y2 = [rand_data() for i in range(2)] 


plt.figure() 
plt.scatter(x1, y1, marker='o', label='first', s=20., c='b') 
plt.scatter(x2, y2, marker='o', label='second', s=35., c='r') 
# Plot legend. 
plt.legend(loc="lower left", markerscale=2., scatterpoints=1, fontsize=10) 
plt.show() 

जो इस का उत्पादन:

enter image description here

कथा में अंक के आकार दिया जाता है, लेकिन एक ही नहीं

अभी मैं इस किया है। scatter साजिश में आकार को प्रभावित किए बिना मैं पौराणिक कथाओं में अंकों के आकार को बराबर मूल्य पर कैसे ठीक कर सकता हूं?

उत्तर

26

मुझे matplotlib के स्रोत कोड में एक नज़र डाली गई थी। बुरी खबर यह है कि किंवदंती में समान आकार के अंक निर्धारित करने का कोई आसान तरीका प्रतीत नहीं होता है। स्कैटर प्लॉट्स (गलत के साथ यह विशेष रूप से कठिन है: नीचे दिए गए अपडेट को देखें)।

  1. बदलें maplotlib कोड
  2. एक PathCollection वस्तुओं छवि में डॉट्स का प्रतिनिधित्व के रूप में बदल जोड़े: वहाँ अनिवार्य रूप से दो विकल्प हैं। ट्रांसफॉर्म (स्केलिंग) को मूल आकार को ध्यान में रखना है।

इनमें से कोई भी बहुत मजेदार नहीं है, हालांकि # 1 आसान लगता है। scatter भूखंड इस संबंध में विशेष रूप से चुनौतीपूर्ण हैं। जो तुम चाहते थे हो रहा है

enter image description here

:

import matplotlib.pyplot as plt 
import numpy as np 

def rand_data(): 
    return np.random.uniform(low=0., high=1., size=(100,)) 

# Generate data. 
x1, y1 = [rand_data() for i in range(2)] 
x2, y2 = [rand_data() for i in range(2)] 

plt.figure() 
plt.plot(x1, y1, 'o', label='first', markersize=np.sqrt(20.), c='b') 
plt.plot(x2, y2, 'o', label='second', markersize=np.sqrt(35.), c='r') 
# Plot legend. 
lgnd = plt.legend(loc="lower left", numpoints=1, fontsize=10) 

#change the marker size manually for both lines 
lgnd.legendHandles[0]._legmarker.set_markersize(6) 
lgnd.legendHandles[1]._legmarker.set_markersize(6) 
plt.show() 

यह देता है:

हालांकि, मैं एक हैक जो शायद करता है कि आप क्या चाहते है।

परिवर्तन:

  • scatter एक plot, जो मार्कर स्केलिंग (इसलिए sqrt) बदलता है और बनाता है में बदल यह असंभव मार्कर आकार बदलने (यदि है कि इरादा था)
  • मार्कर आकार का उपयोग करने कथा

आप देख सकते हैं, दोनों में मार्करों के लिए मैन्युअल रूप से बदल गया 6 अंक होने के लिए, यह छिपा अंडरस्कोर गुण (_legmarker) का इस्तेमाल करता है और बग बदसूरत है। यह matplotlib में किसी भी अपडेट पर टूट सकता है।

अद्यतन

हा, मुझे मिल गया। एक बेहतर हैक:

import matplotlib.pyplot as plt 
import numpy as np 

def rand_data(): 
    return np.random.uniform(low=0., high=1., size=(100,)) 

# Generate data. 
x1, y1 = [rand_data() for i in range(2)] 
x2, y2 = [rand_data() for i in range(2)] 

plt.figure() 
plt.scatter(x1, y1, marker='o', label='first', s=20., c='b') 
plt.scatter(x2, y2, marker='o', label='second', s=35., c='r') 
# Plot legend. 
lgnd = plt.legend(loc="lower left", scatterpoints=1, fontsize=10) 
lgnd.legendHandles[0]._sizes = [30] 
lgnd.legendHandles[1]._sizes = [30] 
plt.show() 

अब _sizes (एक और संपत्ति को रेखांकित) काम कर देता है। स्रोत को छूने की कोई ज़रूरत नहीं है, भले ही यह काफी हैक है। लेकिन अब आप scatter ऑफ़र का उपयोग कर सकते हैं।

enter image description here

+0

नीले छोटे माना जाता है, लेकिन यह सीधे आगे ठीक करने के लिए किया जाना चाहिए , +1 – Aprillion

+0

कमाल का जवाब डॉवी! खेद है कि मैंने जल्द ही टिप्पणी नहीं की, मैंने सोचा कि मेरे पास था लेकिन स्पष्ट रूप से मैंने कभी भी सीएमटी नहीं भेजा था। – Gabriel

+0

मैं बस यह इंगित करना चाहता था कि दूसरा हैक अब मेरे लिए काम नहीं करता है, कम से कम मेरे लिए ('पायथन 3.5', 'matplotlib 1.5.1')। शायद उन्होंने 'matplotlib' के कोड में कुछ बदल दिया। पहला काम करता है हालांकि, इसके लिए बहुत बहुत धन्यवाद। –

4

मैं ज्यादा सफलता @ DRV के समाधान का उपयोग हालांकि शायद मेरी उपयोग के मामले में अनूठा है नहीं था। बिंदुओं की घनत्व के कारण, मैं सबसे छोटे मार्कर आकार का उपयोग कर रहा हूं, यानी plt.plot(x, y, '.', ms=1, ...), और किंवदंती प्रतीकों को बड़ा करना चाहता हूं।

  1. साजिश डेटा (कोई लेबल नहीं)
  2. रिकॉर्ड सीमा (xlimits = plt.xlim())
  3. साजिश नकली डेटा अक्ष दूर कथा के साथ वास्तविक डेटा से दूर:

    मैं सिफारिश मैं matplotlib forums पर पाया पीछा उचित प्रतीक रंग और आकार

  4. कुल्हाड़ियों सीमा बहाल (plt.xlim(xlimits))
  5. लीजेंड बनाने

यह इस प्रकार से निकला है (इस के लिए डॉट्स वास्तव में कम महत्वपूर्ण हैं कि पंक्तियां): enter image description here

आशा इस किसी और मदद करता है।

4
जवाब देने के लिए

इसी तरह, यह सोचते हैं कि आप एक ही आकार के साथ सभी मार्करों हैं:

lgnd = plt.legend(loc="lower left", scatterpoints=1, fontsize=10) 
for handle in lgnd.legendHandles: 
    handle.set_sizes([6.0]) 
matplotlib साथ

2.0.0

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