2013-02-21 12 views
33

संपादित करें: चूंकि यह एक लोकप्रिय पोस्ट प्रतीत होता है, यह समाधान है जो मेरे लिए अच्छा काम कर रहा है। धन्यवाद @ गैज़र और @ एमएफआरए।मेरी कलरबार में लाइनें क्यों हैं?

cbar.solids.set_rasterized(True) 
cbar.solids.set_edgecolor("face") 

किसी को पता क्यों मेरे colorbar क्या उस में लाइनों होना दिखाई है करता है? या फिर रंग संक्रमण क्यों चिकनी नहीं है? मैं जाहिर तौर पर बेसमैप का उपयोग कर रहा हूं, लेकिन इससे कोई फर्क नहीं पड़ता क्योंकि यह एडीएआईसीटी के तहत सभी matplotlib कॉल है। मैं नक्शा बना रहा हूं जैसे

grays = plt.cm.get_cmap("Grays") 
sc = mymap.scatter(xpoints, ypoints, s=sizes, c=color_values, cmap=grays, alpha=.75, 
        marker="o", zorder=10, vmin=0, vmax=1) 
cbar = mymap.colorbar(sc, drawedges=True, location="bottom") 

मैंने अल्फा के बिना और बिना कोशिश की और परिणाम वही था। शायद ऐसा इसलिए है क्योंकि मेरा color_values ​​सरणी पर्याप्त नहीं है? क्या मैं अंतर्निहित मान सेट कर सकता हूं जो कहीं रंगीन रंग में मैप किए गए हैं? मैं नहीं देखता कि कैसे, और मुझे यह समस्या कहीं और नहीं दिखाई दे रही है। हां, मैं इस समस्या के बिना matplotlib show_colorbars उदाहरण दोहरा सकता हूं।

Bad Colorbar Example

+1

क्या आपने इस आकृति को विभिन्न प्रारूपों में सहेजने की कोशिश की है? यदि हां, तो क्या आपको हमेशा ये समस्याएं मिलती हैं? –

+0

मैंने इसे केवल अल्फा के परिणामस्वरूप देखा है, क्या आप वास्तव में अल्फा = 1.0 के साथ ही यह सुनिश्चित करते हैं? –

+0

हां, यह पीएनजी के साथ होता है, लेकिन मैंने इसका निवारण नहीं किया। हां, मैंने इसे एसवीजी के साथ अल्फा = 1.0 के लिए देखा। – jseabold

उत्तर

25

मामले में आप वेक्टर ग्राफिक्स बनाने के लिए, आप इस (http://matplotlib.org/api/pyplot_api.html?highlight=colorbar#matplotlib.pyplot.colorbar से लिया गया) की कोशिश की है:।

"यह ज्ञात है कि कुछ वेक्टर ग्राफिक्स दर्शक (svg और पीडीएफ) colorbar के क्षेत्रों के बीच सफेद अंतराल renders यह वह जगह है दर्शकों में कीड़े की वजह से matplotlib नहीं एक समाधान colorbar अतिव्यापी सेगमेंट साथ गाया जा सकता है:।।

cbar = colorbar() 
cbar.solids.set_edgecolor("face") 
draw() 

हालांकि इस विशेष रूप से अर्द्ध पारदर्शी छवियों (अल्फा < 1) और colorbar एक्सटेंशन के साथ अन्य परिस्थितियों में नकारात्मक परिणाम है और डिफ़ॉल्ट रूप से सक्षम नहीं है (समस्या # 1188)। "

+0

धन्यवाद। यह वास्तव में # 1188 के माध्यम से पढ़ रहा है और (वापस) पीआर संलग्न है। दिलचस्प बात यह है कि एसवीजी फ़ायरफ़ॉक्स और क्रोम में अलग-अलग प्रस्तुत करते हैं, जिन्हें मैंने नहीं सोचा था। – jseabold

+0

यह अल्फा <1 के लिए सर्वोत्तम परिणामों की तरह दिखता है जैसे drawedges = False और set_edgecolor ("face") का उपयोग करने से। मेरे पास अब ब्लैक लाइनें हैं, लेकिन वे कम स्पष्ट हैं और केवल गहरे रंगों में हैं। – jseabold

+0

यह वास्तव में दर्शक में एक बग है, लेकिन यह भी सच है कि रंगीन रेंडर प्रस्तुत करने के लिए एक उपोष्णकटिबंधीय तरीका का उपयोग किया जाता है। 256 छोटे आयतों की बजाय चिकनी छायांकन का उपयोग करके पूरी आकृति को एक टुकड़े के रूप में खींचा जाना चाहिए। पीडीएफ और एसवीजी दोनों प्रारूप रंगों की मनमानी संख्या के साथ रैखिक चिकनी छायांकन का समर्थन करते हैं। – Mojca

1

प्रयास करें:

cbar = mymap.colorbar(sc, drawedges=False, location="bottom") 

अब यह अच्छी तरह से वेब (मैं मिल सकता है कि) पर दर्ज है, लेकिन

*drawedges* [ False | True ] If true, draw lines at color 
       boundaries. 

(matplotlib/lib/matplotlib/colorbar.py से खींचा) मैं सेट करके लगता है drawedges से True आप इसे उन रेखाओं को आकर्षित करने के लिए कह रहे हैं।

+0

drawedges वास्तव में मेरे लिए किनारों को आकर्षित करता है, लेकिन उन्हें काले रंग में खींचता है! विशेष रूप से सहायक नहीं है। mfra का समाधान मेरे लिए drawedges के बिना काम करता है। (matplotlib v1.3.1) – travc

5

ऐसा लगता है कि आपकी साजिश कुछ पारदर्शी (अल्फा) मानों का उपयोग करती है। मुझे यह वही समस्या थी (अर्द्ध पारदर्शी साजिश, लेकिन रंग बार ठोस होना चाहता था), और यह question और answer मेरे लिए तय किया गया! संदर्भ के लिए:

cbar.set_alpha(1) 
cbar.draw_all() 
8

मैं आम तौर पर colorbar सामग्री रेस्टराइज़ करने के लिए निम्न पंक्ति जोड़कर इस मुद्दे एरिक फ़ायरिंग की सलाह here का उपयोग कर से बचने के लिए पसंद करते हैं।

cbar.solids.set_rasterized(True) 

इस तरीके को माना जाता है कि पारदर्शिता के साथ छवियों के लिए विफल रहता है, लेकिन सबसे सामान्य मामलों के लिए यह वांछित परिणाम पैदा करता है।

+1

इस दो साल बाद वापस घूम रहा है। यह वास्तव में थोड़ा सा मदद करता है। – jseabold

+1

उत्कृष्ट। बेहतर दिखता है, और छोटे svg आउटपुट भी! – Bram

4

मैं दोनों सेटिंग्स अन्य टिप्पणी पर दिए गए

cbar.solids.set_rasterized(True) 
cbar.solids.set_edgecolor("face") 

की कोशिश की, अर्थात् और दुर्भाग्य से न तो मेरे लिए काम किया।

इसलिए मैंने एक पूरी तरह से अलग दृष्टिकोण की कोशिश की जो एक बड़ा हैक है, लेकिन कम से कम काम पूरा हो जाता है। जब आप alpha से imshow पास करते हैं तो यह अल्फा मान सेट करता है जिसका उपयोग अन्य छवियों के साथ मिश्रण करने के लिए किया जाएगा। उच्च शक्ति के कारणों के कारण (जैसा कि @ एमएफआरए ने उल्लेख किया है) यह उन सफेद रेखाओं को बनाता है जिन्हें हम तुच्छ मानते हैं। स्पष्ट रूप से कुंजी imshow पर अल्फा मान पास करें। हालांकि, हमें अभी भी रंगीन रंग बनाने की जरूरत है।

इस प्रकार एक वर्कअराउंड के रूप में हम imshow पर रंगमंच देने से पहले अल्फा मिश्रण कर सकते हैं। उदाहरण के लिए, के winter रंग मैप का उपयोग करते हैं:

import numpy as np 
import matplotlib as mpl 
import matplotlib.pyplot as plt 

xx, yy = np.meshgrid(np.linspace(-1, 1, 100), np.linspace(-1, 1, 100)) 
zz = xx**2 + yy**2 

my_cmap_rgb = plt.get_cmap('winter')(np.arange(256)) 
alpha = 0.5 

for i in range(3): # Do not include the last column! 
    my_cmap_rgb[:,i] = (1 - alpha) + alpha*my_cmap_rgb[:,i] 
my_cmap = mpl.colors.ListedColormap(my_cmap_rgb, name='my_cmap') 

यहाँ मैं एक नया रंग मैप, my_cmap_rgb बनाने के लिए, winter के आधार पर और फिर गैर अल्फा चैनलों को संपादित (0, 1 और 2) अपने आप सम्मिश्रण अल्फा करने के लिए । मैं बस अपने आंकड़े को साकार करने के लिए इस नए रंगमंच का उपयोग कर सकता हूं।

f, ax = plt.subplots() 
cim = ax.imshow(zz, cmap=my_cmap) 
cbar = plt.colorbar(cim) 
ax.set_title("No lines and no transparency") 

No lines and no transparency अब यह छवि आप इस चाल के बिना प्राप्त होता के साथ तुलना करें: यदि आप कोई पारदर्शिता की आवश्यकता होती है

f, ax = plt.subplots() 
cim = ax.imshow(zz, cmap='winter', alpha=0.5) 
cbar = plt.colorbar(cim) 
ax.set_title("Lines and transparency") 

Lines and transparency

जाहिर है समस्या हल हो रहा है। दूसरी तरफ, यदि आपको पारदर्शिता की आवश्यकता है, तो एक और कामकाज है। आपको कलरबार प्राप्त करने के लिए पारदर्शीता के बिना एक छवि को प्लॉट करना होगा, और फिर पारदर्शिता के साथ एक प्लॉट करें, लेकिन जिसका रंग पट्टी का उपयोग नहीं किया जाएगा।

f, ax = plt.subplots() 
cim = ax.imshow(zz, cmap=my_cmap) 
cbar = plt.colorbar(cim) 
plt.cla() # Clears axis 
ax.plot(50,50, 'ko') 
ax.imshow(zz, cmap='winter', alpha=0.5) 
ax.set_title("No lines and transparency") 

यह एक ऐसी छवि में परिणाम देता है जिसकी कलरबार में कोई रेखा नहीं है और फिर भी पारदर्शिता बरकरार है। हालांकि यह एक बड़े पैमाने पर हैक बना हुआ है, कम से कम हमें इन लाइनों के साथ आगे बढ़ना नहीं है!

No lines and transparency

+0

मैंने आखिरी चाल (अल्फा, प्लॉट कलरबार, अल्फा के साथ साजिश के बिना साजिश) लागू की, क्योंकि मुझे इमेशो के माध्यम से चलाने के लिए छवियां थीं, दूसरी बार पारदर्शी रूप से ओवरलैड के साथ, और दूसरा रंगीन रंग था। इस प्रकार पारदर्शिता में चल रहा है - पट्टियां मुद्दा। – Evert

0

निम्नलिखित एक और समाधान भले ही वह सुंदर नहीं है हो सकता है।

In [1]: children = cbar.ax.get_children() 
In [2]: children 
Out[2]: 
[<matplotlib.collections.QuadMesh at 0x21783c41b70>, 
<matplotlib.collections.LineCollection at 0x21783bfdc18>, 
<matplotlib.patches.Polygon at 0x21783ba0588>, 
<matplotlib.patches.Polygon at 0x21783beef98>, 
<matplotlib.spines.Spine at 0x21783b77c88>, 
<matplotlib.spines.Spine at 0x21783b77470>, 
<matplotlib.spines.Spine at 0x21783b70c88>, 
<matplotlib.spines.Spine at 0x21783b70860>, 
<matplotlib.axis.XAxis at 0x21783b6ac50>, 
<matplotlib.axis.YAxis at 0x21783ba60f0>, 
<matplotlib.text.Text at 0x21783bc2198>, 
<matplotlib.text.Text at 0x21783bc2320>, 
<matplotlib.text.Text at 0x21783bc22b0>, 
<matplotlib.patches.Rectangle at 0x21783bc2358>] 
In [3]: obj = children[1] # Get the LineCollection object 
In [4]: obj.set_linewidth(0) 
0

के बाद से अन्य सुझावों में से कोई भी मेरे लिए काम किया मैं colorbar उदाहरण से अल्फा चैनल को हटाने से समाप्त हो गया:

from matplotlib.colors import to_rgb 

lut = colorbar.solids.get_facecolor() 
bg_color = to_rgb('white') 
lut[:, :3] *= lut[:, 3:] 
lut[:, :3] += (1 - lut[:, 3:]) * bg_color 
lut[:, 3] = 1. 
colorbar.solids.set_facecolor(lut) 

colorbar चेहरे रंग का उपयोग करने में सक्षम होने से पहले एक बार तैयार किया जा सकता था ।

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