ম্যাটপ্লোটিলেবতে বিপরীত রঙের মানচিত্র


252

প্লট_সেসফেসের সাথে এটি ব্যবহার করতে কীভাবে কোনও প্রদত্ত রঙিন মানচিত্রের রঙ ক্রমকে বিপরীত করতে হয় তা জানতে চাই।

উত্তর:


463

স্ট্যান্ডার্ড রঙম্যাপগুলিও সমস্তগুলির বিপরীত সংস্করণ রয়েছে। _rশেষ পর্যন্ত ট্যাকযুক্ত তাদের একই নাম রয়েছে । ( এখানে ডকুমেন্টেশন। )


এটি "amfhot" এর সাথে কাজ করে না: "ভ্যালুআরার: রঙিনম্যাপ amfhot_r স্বীকৃত নয়"। আমি মনে করি "হট_আর" যথেষ্ট হবে।
শকবারবার্নার

একইভাবে, "মান মানক: রঙিনম্যাপ লাল_আর সনাক্ত করা যায় না।"
অ্যালেক্স উইলিসন

18

ম্যাটপ্ল্লোলিবতে একটি রঙের মানচিত্র কোনও তালিকা নয়, তবে এটিতে এর রঙগুলির তালিকা রয়েছে colormap.colors। এবং মডিউল একটি তালিকা থেকে একটি রঙ মানচিত্র উত্পন্ন করতে matplotlib.colorsএকটি ফাংশন সরবরাহ ListedColormap()করে। সুতরাং আপনি কোনও রঙের মানচিত্র বিপরীত করতে পারেন

colormap_r = ListedColormap(colormap.colors[::-1])

7
+1 টি। তবে এটি সাধারণভাবে কোনও রঙিন চিত্রের বিপরীত হবে না। কেবলমাত্র ListedColormaps (অর্থাত্‍ বিযুক্তের চেয়ে পৃথক) এর একটি colorsবৈশিষ্ট্য রয়েছে। বিপরীত LinearSegmentedColormapsকিছুটা জটিল। (আপনার _segmentdataডিক্টের প্রতিটি আইটেমটি রিভার্স করা দরকার ))
জো কিংটন

3
বিপরীত প্রসঙ্গে LinearSegmentedColormaps, আমি এটি কিছু কলর্যাপের জন্য করেছি। এটি সম্পর্কে একটি আইপিথন নোটবুক এখানে।
kwinkunks

@ কুইঙ্কঙ্কস আমি মনে করি আপনার নোটবুকে ফাংশনটি ঠিক নেই, নীচের উত্তর দেখুন
মাত্তিজন

14

সমাধানটি বেশ সোজা। মনে করুন আপনি "শরৎ" কালারম্যাপ স্কিমটি ব্যবহার করতে চান। মানক সংস্করণ:

cmap = matplotlib.cm.autumn

রঙিন মানচিত্রের বর্ণালীটি বিপরীত করতে, get_cmap () ফাংশনটি ব্যবহার করুন এবং রঙিন্যাপের শিরোনামে '_r' যুক্ত করুন:

cmap_reversed = matplotlib.cm.get_cmap('autumn_r')

আপনি যেখানে ডকুমেন্টেশন লিঙ্কটি সরবরাহ করতে পারেন যেখানে আপনি আউটমুটটি পেয়েছেন?
Xitcod13

এটি পরে ভেঙে যেতে পারে ... matplotlib.org/3.1.1/gallery/color/colormap_references.html , তবে আমি নিশ্চিত যে আগ্রহী যে কোনওভাবেই অনুসন্ধানের মাধ্যমে এটি সন্ধান করতে সক্ষম হবে I'm
Jlanger

13

যেহেতু 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')

এখানে চিত্র বর্ণনা লিখুন


এই উদাহরণটি এই অর্থে সম্পূর্ণ নয় যে সেগমেন্টডাটা তালিকায় থাকা উচিত নয় সুতরাং এটি অবিচ্ছিন্নভাবে পরিবর্তনযোগ্য নয় (যেমন স্ট্যান্ডার্ড রেইনবো রঙিন ম্যাপ)। আমি মনে করি নীতিগতভাবে সমস্ত লিনিয়ারসাইগমেন্টেড কলারম্যাপগুলি রেনবো রঙের মানচিত্রের মতো ল্যাম্বডা ফাংশনটি ব্যবহার করে প্রিন্সিবল হওয়া উচিত?
বিদেশে

@ ব্যবহারকারী 3445587 আমি আরও কয়েকটি উদাহরণ সংযোজন করেছি, তবে আমি মনে করি এটি স্ট্যান্ডার্ড রংধনু
রঙিনম্যাপের জন্য

যেহেতু এটি অনেক দীর্ঘ ছিল, তাই আমি একটি নতুন উত্তর যুক্ত করেছি, যা সব ধরণের লিনিয়ারসেজমেন্টডেটার জন্য কাজ করা উচিত। সমস্যাটি হ'ল রামধনুগুলির জন্য, _সেটমেন্টডাটা আলাদাভাবে প্রয়োগ করা হয়। সুতরাং আপনার কোড - কমপক্ষে আমার মেশিনে - রেইনবো রঙম্যাপের সাথে কাজ করে না।
বিদেশে

12

ম্যাটপ্লটলিব ২.০ হিসাবে, এর জন্য একটি reversed()পদ্ধতি ListedColormapএবং LinearSegmentedColorMapঅবজেক্ট রয়েছে, তাই আপনি ঠিক করতে পারেন

cmap_reversed = cmap.reversed()

এখানে ডকুমেন্টেশন দেওয়া আছে।


1

লিনিয়ারসেগমেন্টেড কলারম্যাপস দুই ধরণের রয়েছে। কারও কারও মধ্যে, এই বিভাগটির ডেটা স্পষ্টভাবে দেওয়া হয়, যেমন, জেটের জন্য:

>>> 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)) 

1

সালিশ রঙিনম্যাপগুলি বিপরীত করার কোনও অন্তর্নিহিত উপায় (এখনও) নেই, তবে একটি সহজ সমাধান হ'ল রঙবারটি সংশোধন না করে বরং একটি বিপরীত নরমালাইজ অবজেক্ট তৈরি করা:

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)

এটি যে কোনও ম্যাটপ্ল্লিটব রঙিনম্যাপের সাথে কাজ করবে।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.