Matplotlib में Colorbar रेंज सेट करें


156

मेरे पास निम्नलिखित कोड हैं:

import matplotlib.pyplot as plt

cdict = {
  'red'  :  ( (0.0, 0.25, .25), (0.02, .59, .59), (1., 1., 1.)),
  'green':  ( (0.0, 0.0, 0.0), (0.02, .45, .45), (1., .97, .97)),
  'blue' :  ( (0.0, 1.0, 1.0), (0.02, .75, .75), (1., 0.45, 0.45))
}

cm = m.colors.LinearSegmentedColormap('my_colormap', cdict, 1024)

plt.clf()
plt.pcolor(X, Y, v, cmap=cm)
plt.loglog()
plt.xlabel('X Axis')
plt.ylabel('Y Axis')

plt.colorbar()
plt.show()

तो यह निर्दिष्ट कॉलॉर्मैप का उपयोग करके कुल्हाड़ियों एक्स बनाम वाई पर मूल्यों के एक ग्राफ का उत्पादन करता है। एक्स और वाई कुल्हाड़ी एकदम सही हैं, लेकिन कॉलोर्मा मिनट और अधिकतम v के बीच फैलता है। मैं कॉलॉर्मप को 0 और 1 के बीच सीमा के लिए बाध्य करना चाहूंगा।

मैंने उपयोग करने के बारे में सोचा:

plt.axis(...)

कुल्हाड़ियों की सीमा निर्धारित करने के लिए, लेकिन यह केवल एक्स और वाई के मिनट और अधिकतम के लिए तर्क लेता है, कॉलोर्मैप नहीं।

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

स्पष्टता के लिए, मान लें कि मेरा एक ग्राफ है जिसका मान श्रेणी (0 ... 0.3) है, और दूसरा ग्राफ़ जिसका मान (0.2 ... 0.8) है।

दोनों रेखांकन में, मैं चाहता हूँ कि colorbar की सीमा (0 ... 1) होगी। दोनों रेखांकन में, मैं चाहता हूं कि ऊपर दिए गए cdict की पूरी श्रृंखला का उपयोग करके रंग की यह श्रेणी समान हो (इसलिए दोनों ग्राफ़ में 0.25 समान रंग होगा)। पहले ग्राफ में, 0.3 और 1.0 के बीच के सभी रंग ग्राफ में नहीं दिखेंगे, लेकिन किनारे पर कोलोरबार की में होंगे। दूसरे में, 0 से 0.2 के बीच और 0.8 और 1 के बीच के सभी रंग ग्राफ में नहीं दिखेंगे, लेकिन किनारे पर कोलोरबार में होंगे।

जवाबों:


177

रंगों के लिए रेंज का उपयोग vminऔर vmaxबल। यहाँ एक उदाहरण है:

यहाँ छवि विवरण दर्ज करें

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

cdict = {
  'red'  :  ( (0.0, 0.25, .25), (0.02, .59, .59), (1., 1., 1.)),
  'green':  ( (0.0, 0.0, 0.0), (0.02, .45, .45), (1., .97, .97)),
  'blue' :  ( (0.0, 1.0, 1.0), (0.02, .75, .75), (1., 0.45, 0.45))
}

cm = m.colors.LinearSegmentedColormap('my_colormap', cdict, 1024)

x = np.arange(0, 10, .1)
y = np.arange(0, 10, .1)
X, Y = np.meshgrid(x,y)

data = 2*( np.sin(X) + np.sin(3*Y) )

def do_plot(n, f, title):
    #plt.clf()
    plt.subplot(1, 3, n)
    plt.pcolor(X, Y, f(data), cmap=cm, vmin=-4, vmax=4)
    plt.title(title)
    plt.colorbar()

plt.figure()
do_plot(1, lambda x:x, "all")
do_plot(2, lambda x:np.clip(x, -4, 0), "<0")
do_plot(3, lambda x:np.clip(x, 0, 4), ">0")
plt.show()

3
यह उत्तर @Amro द्वारा पोस्ट किए गए plt.clim का उपयोग करने से बेहतर क्यों है?
एलेक्स लैमसन

90

का प्रयोग करें CLIM समारोह (के बराबर CAXIS MATLAB में समारोह):

plt.pcolor(X, Y, v, cmap=cm)
plt.clim(-4,4)  # identical to caxis([-4,4]) in MATLAB
plt.show()

2
मेरा मानना ​​है कि चढ़ाई () रंग की कुल्हाड़ियों को मापती है, लेकिन रंग खुद ही मूल्यों को बदल देते हैं। पैमाने के साथ एक निश्चित अंश पर बिंदु जो भी पैमाने होगा, उसी रंग का होगा, लेकिन इसका प्रतिनिधित्व करने वाला मूल्य बदल जाएगा।
पॉल

4
हाँ। यह पूछने वाले का वांछित व्यवहार है, इसलिए समस्या को हल करता है: कि ग्राफ़ के बीच रंग स्केल समान हो।
१४:४al

16

सुनिश्चित नहीं है कि यह सबसे सुरुचिपूर्ण समाधान है (यह वही है जो मैंने इस्तेमाल किया था), लेकिन आप अपने डेटा को 0 से 1 के बीच की सीमा तक स्केल कर सकते हैं और फिर कलरबार को संशोधित कर सकते हैं:

import matplotlib as mpl
...
ax, _ = mpl.colorbar.make_axes(plt.gca(), shrink=0.5)
cbar = mpl.colorbar.ColorbarBase(ax, cmap=cm,
                       norm=mpl.colors.Normalize(vmin=-0.5, vmax=1.5))
cbar.set_clim(-2.0, 2.0)

दो अलग-अलग सीमाओं के साथ आप रेंजबार और लीजेंड को नियंत्रित कर सकते हैं। इस उदाहरण में केवल -0.5 से 1.5 के बीच की सीमा को बार में दिखाया गया है, जबकि कॉलॉर्मैप -2 से 2 तक है (इसलिए यह आपकी डेटा रेंज हो सकती है, जिसे आप स्केलिंग से पहले रिकॉर्ड करते हैं)।

इसलिए आप अपने डेटा को बड़े पैमाने पर स्केल करने के बजाय उस पर कलरबार फिट करें।


1
मुझे लगता है कि यह कुछ अलग तरह से हो रहा है ... माफ करना, मैं अपने प्रश्न में पर्याप्त सटीक नहीं था। आपका समाधान रंगों को स्केल करेगा ताकि मूल्य 1.0 का प्रतिनिधित्व करने के लिए जो उपयोग किया जाता है वह अब मेरे डेटा में अधिकतम मूल्य का प्रतिनिधित्व करेगा। Colorbar 0..1 दिखाएगा जैसा कि मुझे इसकी आवश्यकता है (vmin = 0, vmax = 1 के साथ), लेकिन इस अधिकतम मान के ऊपर सब कुछ समान रंग होगा ...
पॉल

1
... मैंने अपना प्रश्न यह दिखाने के लिए अपडेट किया है कि मैं अधिक स्पष्ट रूप से क्या कर रहा हूं। क्षमा करें यदि मैं बहुत अस्पष्ट था।
पॉल

10

आंकड़ा पर्यावरण और .set_clim () का उपयोग करना

यदि आपके पास कई प्लॉट हैं तो यह विकल्प आसान और सुरक्षित हो सकता है:

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

cdict = {
  'red'  :  ( (0.0, 0.25, .25), (0.02, .59, .59), (1., 1., 1.)),
  'green':  ( (0.0, 0.0, 0.0), (0.02, .45, .45), (1., .97, .97)),
  'blue' :  ( (0.0, 1.0, 1.0), (0.02, .75, .75), (1., 0.45, 0.45))
}

cm = m.colors.LinearSegmentedColormap('my_colormap', cdict, 1024)

x = np.arange(0, 10, .1)
y = np.arange(0, 10, .1)
X, Y = np.meshgrid(x,y)

data = 2*( np.sin(X) + np.sin(3*Y) )
data1 = np.clip(data,0,6)
data2 = np.clip(data,-6,0)
vmin = np.min(np.array([data,data1,data2]))
vmax = np.max(np.array([data,data1,data2]))

fig = plt.figure()
ax = fig.add_subplot(131)
mesh = ax.pcolormesh(data, cmap = cm)
mesh.set_clim(vmin,vmax)
ax1 = fig.add_subplot(132)
mesh1 = ax1.pcolormesh(data1, cmap = cm)
mesh1.set_clim(vmin,vmax)
ax2 = fig.add_subplot(133)
mesh2 = ax2.pcolormesh(data2, cmap = cm)
mesh2.set_clim(vmin,vmax)
# Visualizing colorbar part -start
fig.colorbar(mesh,ax=ax)
fig.colorbar(mesh1,ax=ax1)
fig.colorbar(mesh2,ax=ax2)
fig.tight_layout()
# Visualizing colorbar part -end

plt.show()

यहाँ छवि विवरण दर्ज करें

एक एकल रंगकर्मी

सबसे अच्छा विकल्प तो पूरे भूखंड के लिए एक ही रंग पट्टी का उपयोग करना है। ऐसा करने के विभिन्न तरीके हैं, यह ट्यूटोरियल सबसे अच्छा विकल्प समझने के लिए बहुत उपयोगी है। मैं इस समाधान को पसंद करता हूं जिसे आप कोड के पिछले विज़ुअलाइज़िंग कलरबार भाग के बजाय बस कॉपी और पेस्ट कर सकते हैं ।

fig.subplots_adjust(bottom=0.1, top=0.9, left=0.1, right=0.8,
                    wspace=0.4, hspace=0.1)
cb_ax = fig.add_axes([0.83, 0.1, 0.02, 0.8])
cbar = fig.colorbar(mesh, cax=cb_ax)

यहाँ छवि विवरण दर्ज करें

पुनश्च

मैं pcolormeshइसके बजाय pcolorइसका उपयोग करने का सुझाव दूंगा क्योंकि यह अधिक तेज़ है (अधिक जानकारी यहाँ )।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.