2013-11-22 10 views
13

मैं डेटासेट के लिए एक भरे समोच्च बनाने की कोशिश कर रहा हूं। यह काफी सरल होना चाहिए:शिफ्ट कलरबार matplotlib

plt.contourf(x, y, z, label = 'blah', cm = matplotlib.cm.RdBu) 

हालांकि, यदि मेरा डेटासेट 0 के सममित नहीं है तो मैं क्या करूँ? मान लीजिए कि मैं नीले (नकारात्मक मान) से 0 (सफेद), लाल (सकारात्मक मूल्य) तक जाना चाहता हूं। यदि मेरा डेटासेट -8 से 3 तक जाता है, तो कलर बार का सफेद भाग, जो 0 पर होना चाहिए, वास्तव में थोड़ा नकारात्मक है। कलर बार को बदलने का कोई तरीका है?

उत्तर

29

सबसे पहले, ऐसा करने के एक से अधिक तरीके हैं।

  1. contourf करने के लिए colors kwarg का प्रयोग करें और मैन्युअल रूप से रंग
  2. उपयोग एक कस्टम Normalize वर्ग निर्दिष्ट करें और norm kwarg के रूप में एक उदाहरण गुजरती हैं।
  3. matplotlib.colors.from_levels_and_colors के साथ निर्मित एक अलग रंगरूप का उपयोग करें।

colors=sequence_of_colors के साथ विशिष्ट रंगों में पारित करने का सबसे आसान तरीका है। हालांकि, यदि आप मैन्युअल रूप से समरूपता की संख्या निर्धारित नहीं कर रहे हैं, तो यह असुविधाजनक हो सकता है।

सबसे सुविधाजनक तरीका दूसरा विकल्प है: कस्टम सामान्यीकरण निर्दिष्ट करने के लिए norm kwarg का उपयोग करें। आप जो चाहते हैं उसके लिए, आपको Normalize उप-वर्ग करना होगा, लेकिन ऐसा करना मुश्किल नहीं है। यह एकमात्र विकल्प है जो आपको निरंतर रंगरूप का उपयोग करने की अनुमति देता है।

दूसरे या तीसरे विकल्पों का उपयोग करने का कारण यह है कि वे किसी भी प्रकार की matplotlib साजिश के लिए काम करेंगे जो एक colormap (उदा। imshow, scatter, आदि) का उपयोग करता है।

तीसरा विकल्प विशिष्ट रंगों से एक अलग रंगरूप और सामान्यीकरण वस्तु बनाता है। यह मूल रूप से पहले विकल्प के समान है, लेकिन यह ए) समोच्च भूखंडों की तुलना में अन्य प्रकार के भूखंडों के साथ काम करेगा, और बी) मैन्युअल रूप से समोच्चों की संख्या निर्दिष्ट करने से बचाता है।

दूसरा विकल्प का एक उदाहरण के रूप में (मैं imshow यहां इस्तेमाल करेंगे, क्योंकि यह यादृच्छिक डेटा के लिए contourf की तुलना में अधिक समझ में आता है, लेकिन contourfinterpolation विकल्प के अलावा अन्य समान उपयोग करना होगा।):

import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib.colors import Normalize 

class MidpointNormalize(Normalize): 
    def __init__(self, vmin=None, vmax=None, midpoint=None, clip=False): 
     self.midpoint = midpoint 
     Normalize.__init__(self, vmin, vmax, clip) 

    def __call__(self, value, clip=None): 
     # I'm ignoring masked values and all kinds of edge cases to make a 
     # simple example... 
     x, y = [self.vmin, self.midpoint, self.vmax], [0, 0.5, 1] 
     return np.ma.masked_array(np.interp(value, x, y)) 

data = np.random.random((10,10)) 
data = 10 * (data - 0.8) 

fig, ax = plt.subplots() 
norm = MidpointNormalize(midpoint=0) 
im = ax.imshow(data, norm=norm, cmap=plt.cm.seismic, interpolation='none') 
fig.colorbar(im) 
plt.show() 

import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib.colors import from_levels_and_colors 

data = np.random.random((10,10)) 
data = 10 * (data - 0.8) 

num_levels = 20 
vmin, vmax = data.min(), data.max() 
midpoint = 0 
levels = np.linspace(vmin, vmax, num_levels) 
midp = np.mean(np.c_[levels[:-1], levels[1:]], axis=1) 
vals = np.interp(midp, [vmin, midpoint, vmax], [0, 0.5, 1]) 
colors = plt.cm.seismic(vals) 
cmap, norm = from_levels_and_colors(levels, colors) 

fig, ax = plt.subplots() 
im = ax.imshow(data, cmap=cmap, norm=norm, interpolation='none') 
fig.colorbar(im) 
plt.show() 
: enter image description here

तीसरे विकल्प का एक उदाहरण के रूप में (सूचना इस एक सतत रंग मैप के बजाय एक असतत रंग मैप देता है कि)

enter image description here

+0

अद्भुत, यह वही था जो मैं ढूंढ रहा था, धन्यवाद! – pgierz

+2

Matplotlib – Moritz

+0

@ जो किंगटन में जोड़ा जाना चाहिए, जो वाकई बहुत अच्छा था! मैं एक ओपन-सोर्स प्रोजेक्ट के लिए अपनी कक्षा परिभाषा की प्रतिलिपि बना रहा हूं और अपना नाम लेखक के रूप में रखता हूं। आशा है कि आप इसके साथ ठीक रहेगा। –

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