मुझे matplotlib
के स्रोत कोड में एक नज़र डाली गई थी। बुरी खबर यह है कि किंवदंती में समान आकार के अंक निर्धारित करने का कोई आसान तरीका प्रतीत नहीं होता है। स्कैटर प्लॉट्स (गलत के साथ यह विशेष रूप से कठिन है: नीचे दिए गए अपडेट को देखें)।
- बदलें
maplotlib
कोड
- एक
PathCollection
वस्तुओं छवि में डॉट्स का प्रतिनिधित्व के रूप में बदल जोड़े: वहाँ अनिवार्य रूप से दो विकल्प हैं। ट्रांसफॉर्म (स्केलिंग) को मूल आकार को ध्यान में रखना है।
इनमें से कोई भी बहुत मजेदार नहीं है, हालांकि # 1 आसान लगता है। scatter
भूखंड इस संबंध में विशेष रूप से चुनौतीपूर्ण हैं। जो तुम चाहते थे हो रहा है
:
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
ऑफ़र का उपयोग कर सकते हैं।
नीले छोटे माना जाता है, लेकिन यह सीधे आगे ठीक करने के लिए किया जाना चाहिए , +1 – Aprillion
कमाल का जवाब डॉवी! खेद है कि मैंने जल्द ही टिप्पणी नहीं की, मैंने सोचा कि मेरे पास था लेकिन स्पष्ट रूप से मैंने कभी भी सीएमटी नहीं भेजा था। – Gabriel
मैं बस यह इंगित करना चाहता था कि दूसरा हैक अब मेरे लिए काम नहीं करता है, कम से कम मेरे लिए ('पायथन 3.5', 'matplotlib 1.5.1')। शायद उन्होंने 'matplotlib' के कोड में कुछ बदल दिया। पहला काम करता है हालांकि, इसके लिए बहुत बहुत धन्यवाद। –