जवाबों:
मानक colormaps भी सभी उलट संस्करण हैं। _r
अंत तक उनसे निपटने के साथ उनके नाम समान हैं । ( यहां प्रलेखन। )
Matplotlib में एक रंग का नक्शा एक सूची नहीं है, लेकिन इसमें इसके रंगों की सूची शामिल है colormap.colors
। और मॉड्यूल एक सूची से एक रंग नक्शा बनाने के लिए matplotlib.colors
एक फ़ंक्शन प्रदान करता है ListedColormap()
। तो आप किसी भी रंग के नक्शे को उल्टा कर सकते हैं
colormap_r = ListedColormap(colormap.colors[::-1])
ListedColormap
एस (यानी असतत के बजाय असतत) की colors
विशेषता है। उलटना LinearSegmentedColormaps
थोड़ा अधिक जटिल है। (आपको प्रत्येक आइटम को _segmentdata
तानाशाही में उलटने की आवश्यकता है ।)
LinearSegmentedColormaps
, मैंने अभी कुछ कोलोरैप्स के लिए ऐसा किया था। यहाँ इसके बारे में एक IPython नोटबुक है।
समाधान बहुत सीधा है। मान लीजिए कि आप "शरद ऋतु" कॉलोरामैप योजना का उपयोग करना चाहते हैं। मानक संस्करण:
cmap = matplotlib.cm.autumn
Colormap रंग स्पेक्ट्रम को उल्टा करने के लिए, get_cmap () फ़ंक्शन का उपयोग करें और colormap शीर्षक जैसे '_r' को जोड़ें:
cmap_reversed = matplotlib.cm.get_cmap('autumn_r')
चूंकि LinearSegmentedColormaps
यह लाल, हरे और नीले रंग के शब्दकोश पर आधारित है, इसलिए प्रत्येक आइटम को उल्टा करना आवश्यक है:
import matplotlib.pyplot as plt
import matplotlib as mpl
def reverse_colourmap(cmap, name = 'my_cmap_r'):
"""
In:
cmap, name
Out:
my_cmap_r
Explanation:
t[0] goes from 0 to 1
row i: x y0 y1 -> t[0] t[1] t[2]
/
/
row i+1: x y0 y1 -> t[n] t[1] t[2]
so the inverse should do the same:
row i+1: x y1 y0 -> 1-t[0] t[2] t[1]
/
/
row i: x y1 y0 -> 1-t[n] t[2] t[1]
"""
reverse = []
k = []
for key in cmap._segmentdata:
k.append(key)
channel = cmap._segmentdata[key]
data = []
for t in channel:
data.append((1-t[0],t[2],t[1]))
reverse.append(sorted(data))
LinearL = dict(zip(k,reverse))
my_cmap_r = mpl.colors.LinearSegmentedColormap(name, LinearL)
return my_cmap_r
देखें कि यह काम करता है:
my_cmap
<matplotlib.colors.LinearSegmentedColormap at 0xd5a0518>
my_cmap_r = reverse_colourmap(my_cmap)
fig = plt.figure(figsize=(8, 2))
ax1 = fig.add_axes([0.05, 0.80, 0.9, 0.15])
ax2 = fig.add_axes([0.05, 0.475, 0.9, 0.15])
norm = mpl.colors.Normalize(vmin=0, vmax=1)
cb1 = mpl.colorbar.ColorbarBase(ax1, cmap = my_cmap, norm=norm,orientation='horizontal')
cb2 = mpl.colorbar.ColorbarBase(ax2, cmap = my_cmap_r, norm=norm, orientation='horizontal')
संपादित करें
मुझे user3445587 की टिप्पणी नहीं मिली। यह इंद्रधनुष कोलोरम पर ठीक काम करता है:
cmap = mpl.cm.jet
cmap_r = reverse_colourmap(cmap)
fig = plt.figure(figsize=(8, 2))
ax1 = fig.add_axes([0.05, 0.80, 0.9, 0.15])
ax2 = fig.add_axes([0.05, 0.475, 0.9, 0.15])
norm = mpl.colors.Normalize(vmin=0, vmax=1)
cb1 = mpl.colorbar.ColorbarBase(ax1, cmap = cmap, norm=norm,orientation='horizontal')
cb2 = mpl.colorbar.ColorbarBase(ax2, cmap = cmap_r, norm=norm, orientation='horizontal')
लेकिन यह विशेष रूप से कस्टम घोषित कॉलॉर्मैप्स के लिए अच्छा काम करता है, क्योंकि _r
कस्टम घोषित कॉलोर्मैप्स के लिए डिफ़ॉल्ट नहीं है । Http://matplotlib.org/examples/pylab_examples/custom_cmap.html से लिए गए उदाहरण के बाद :
cdict1 = {'red': ((0.0, 0.0, 0.0),
(0.5, 0.0, 0.1),
(1.0, 1.0, 1.0)),
'green': ((0.0, 0.0, 0.0),
(1.0, 0.0, 0.0)),
'blue': ((0.0, 0.0, 1.0),
(0.5, 0.1, 0.0),
(1.0, 0.0, 0.0))
}
blue_red1 = mpl.colors.LinearSegmentedColormap('BlueRed1', cdict1)
blue_red1_r = reverse_colourmap(blue_red1)
fig = plt.figure(figsize=(8, 2))
ax1 = fig.add_axes([0.05, 0.80, 0.9, 0.15])
ax2 = fig.add_axes([0.05, 0.475, 0.9, 0.15])
norm = mpl.colors.Normalize(vmin=0, vmax=1)
cb1 = mpl.colorbar.ColorbarBase(ax1, cmap = blue_red1, norm=norm,orientation='horizontal')
cb2 = mpl.colorbar.ColorbarBase(ax2, cmap = blue_red1_r, norm=norm, orientation='horizontal')
Matplotlib 2.0 के रूप में, वहाँ और वस्तुओं के reversed()
लिए एक विधि है , तो आप बस कर सकते हैंListedColormap
LinearSegmentedColorMap
cmap_reversed = cmap.reversed()
यहाँ प्रलेखन है।
LinearSegmentedColormaps दो प्रकार के होते हैं। कुछ में, _segmentdata जेट के लिए स्पष्ट रूप से दिया जाता है, जैसे:
>>> cm.jet._segmentdata
{'blue': ((0.0, 0.5, 0.5), (0.11, 1, 1), (0.34, 1, 1), (0.65, 0, 0), (1, 0, 0)), 'red': ((0.0, 0, 0), (0.35, 0, 0), (0.66, 1, 1), (0.89, 1, 1), (1, 0.5, 0.5)), 'green': ((0.0, 0, 0), (0.125, 0, 0), (0.375, 1, 1), (0.64, 1, 1), (0.91, 0, 0), (1, 0, 0))}
इंद्रधनुष के लिए, _segmentdata निम्नानुसार दिया गया है:
>>> cm.rainbow._segmentdata
{'blue': <function <lambda> at 0x7fac32ac2b70>, 'red': <function <lambda> at 0x7fac32ac7840>, 'green': <function <lambda> at 0x7fac32ac2d08>}
हम माटप्लोटलिब के स्रोत में कार्यों को पा सकते हैं, जहां वे दिए गए हैं
_rainbow_data = {
'red': gfunc[33], # 33: lambda x: np.abs(2 * x - 0.5),
'green': gfunc[13], # 13: lambda x: np.sin(x * np.pi),
'blue': gfunc[10], # 10: lambda x: np.cos(x * np.pi / 2)
}
सब कुछ जो आप चाहते हैं, पहले से ही matplotlib में किया जाता है, बस cm.revcmap को कॉल करें, जो दोनों प्रकार के सेगमेंटेट को उलट देता है, इसलिए
cm.revcmap(cm.rainbow._segmentdata)
काम करना चाहिए - आप बस एक नया LinearSegmentData बना सकते हैं। Revcmap में, फ़ंक्शन आधारित SegmentData का उत्क्रमण किया जाता है
def _reverser(f):
def freversed(x):
return f(1 - x)
return freversed
जबकि अन्य सूचियों को हमेशा की तरह उलट दिया जाता है
valnew = [(1.0 - x, y1, y0) for x, y0, y1 in reversed(val)]
तो वास्तव में पूरी चीज आप चाहते हैं, है
def reverse_colourmap(cmap, name = 'my_cmap_r'):
return mpl.colors.LinearSegmentedColormap(name, cm.revcmap(cmap._segmentdata))
मनमाने ढंग से कॉलोर्मैप्स को उलटने का कोई अंतर्निहित तरीका (अभी तक) नहीं है, लेकिन एक सरल उपाय यह है कि वास्तव में कलरबार को संशोधित नहीं किया जाए, बल्कि एक इनवर्टिंग नॉर्मलाइज़ ऑब्जेक्ट बनाने के लिए:
from matplotlib.colors import Normalize
class InvertedNormalize(Normalize):
def __call__(self, *args, **kwargs):
return 1 - super(InvertedNormalize, self).__call__(*args, **kwargs)
तब आप इसके साथ plot_surface
और अन्य Matplotlib साजिश रचने वाले कार्यों का उपयोग कर सकते हैं
inverted_norm = InvertedNormalize(vmin=10, vmax=100)
ax.plot_surface(..., cmap=<your colormap>, norm=inverted_norm)
यह किसी भी Matplotlib colormap के साथ काम करेगा।