উত্তর:
স্ট্যান্ডার্ড রঙম্যাপগুলিও সমস্তগুলির বিপরীত সংস্করণ রয়েছে। _rশেষ পর্যন্ত ট্যাকযুক্ত তাদের একই নাম রয়েছে । ( এখানে ডকুমেন্টেশন। )
ম্যাটপ্ল্লোলিবতে একটি রঙের মানচিত্র কোনও তালিকা নয়, তবে এটিতে এর রঙগুলির তালিকা রয়েছে colormap.colors। এবং মডিউল একটি তালিকা থেকে একটি রঙ মানচিত্র উত্পন্ন করতে matplotlib.colorsএকটি ফাংশন সরবরাহ ListedColormap()করে। সুতরাং আপনি কোনও রঙের মানচিত্র বিপরীত করতে পারেন
colormap_r = ListedColormap(colormap.colors[::-1])
ListedColormaps (অর্থাত্ বিযুক্তের চেয়ে পৃথক) এর একটি colorsবৈশিষ্ট্য রয়েছে। বিপরীত LinearSegmentedColormapsকিছুটা জটিল। (আপনার _segmentdataডিক্টের প্রতিটি আইটেমটি রিভার্স করা দরকার ))
LinearSegmentedColormaps, আমি এটি কিছু কলর্যাপের জন্য করেছি। এটি সম্পর্কে একটি আইপিথন নোটবুক এখানে।
সমাধানটি বেশ সোজা। মনে করুন আপনি "শরৎ" কালারম্যাপ স্কিমটি ব্যবহার করতে চান। মানক সংস্করণ:
cmap = matplotlib.cm.autumn
রঙিন মানচিত্রের বর্ণালীটি বিপরীত করতে, get_cmap () ফাংশনটি ব্যবহার করুন এবং রঙিন্যাপের শিরোনামে '_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')
সম্পাদনা
আমি ব্যবহারকারী 3445587 এর মন্তব্য পাই না। এটি রংধনুর রঙিন মানচিত্রে দুর্দান্ত কাজ করে:
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/example/pylab_example/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')
ম্যাটপ্লটলিব ২.০ হিসাবে, এর জন্য একটি reversed()পদ্ধতি ListedColormapএবং LinearSegmentedColorMapঅবজেক্ট রয়েছে, তাই আপনি ঠিক করতে পারেন
cmap_reversed = cmap.reversed()
এখানে ডকুমেন্টেশন দেওয়া আছে।
লিনিয়ারসেগমেন্টেড কলারম্যাপস দুই ধরণের রয়েছে। কারও কারও মধ্যে, এই বিভাগটির ডেটা স্পষ্টভাবে দেওয়া হয়, যেমন, জেটের জন্য:
>>> 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))}
রংধনু জন্য, _ সেগমেন্টডাটা নীচে দেওয়া হল:
>>> 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)
}
আপনি যা কিছু চান তা ইতিমধ্যে ম্যাটপ্ল্লোলিবতে সম্পন্ন হয়েছে, কেবলমাত্র সেমি.রেভক্যাম্যাপ কল করুন, যা উভয় প্রকারের সেগমেন্টডাটাকে বিপরীত করে, তাই
cm.revcmap(cm.rainbow._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এটির সাহায্যে এবং অন্যান্য ম্যাটপ্ল্লিটিব প্লট করা ফাংশনগুলি উদাহরণ সহ করে ব্যবহার করতে পারেন
inverted_norm = InvertedNormalize(vmin=10, vmax=100)
ax.plot_surface(..., cmap=<your colormap>, norm=inverted_norm)
এটি যে কোনও ম্যাটপ্ল্লিটব রঙিনম্যাপের সাথে কাজ করবে।