ম্যাটপ্লোটিলেব রঙিন রেঞ্জ সেট করুন


155

আমার কাছে নিম্নলিখিত কোড রয়েছে:

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

সুতরাং এটি নির্দিষ্ট রঙিনম্যাপ ব্যবহার করে এক্স বনাম Y এর অক্ষগুলিতে 'v' মানগুলির একটি গ্রাফ তৈরি করে। এক্স এবং ওয়াই অক্ষগুলি নিখুঁত, তবে রঙিন্যাপটি নূন্যতম এবং সর্বাধিক ভি এর মধ্যে ছড়িয়ে যায় I

আমি ব্যবহার করার কথা ভেবেছিলাম:

plt.axis(...)

অক্ষগুলির ব্যাপ্তি নির্ধারণ করতে, তবে এটি কেবল রঙিন মানচিত্র নয়, এক্স এবং ওয়াইয়ের সর্বনিম্ন এবং সর্বাধিক জন্য আর্গুমেন্ট গ্রহণ করে।

সম্পাদনা:

সুস্পষ্টতার জন্য, আসুন আমি বলি যে আমার কাছে একটি গ্রাফ রয়েছে যার মানগুলির পরিসর (0 ... 0.3), এবং অন্য একটি গ্রাফ যার মান (0.2 ... 0.8)।

উভয় গ্রাফে, আমি রঙ বারের ব্যাপ্তি (0 ... 1) হওয়া চাই। উভয় গ্রাফগুলিতে, আমি উপরের সিডিক্টের সম্পূর্ণ পরিসর ব্যবহার করে রঙের এই ব্যাপ্তিটি একরকম হতে চাই (সুতরাং উভয় গ্রাফের 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
এই উত্তরটি @ আম্রো পোস্ট করা প্লটক্লিম ব্যবহারের চেয়ে কেন ভাল?
অ্যালেক্স ল্যামসন

89

ব্যবহার করুন CLIM ফাংশন (সমতূল্য CAXIS ম্যাটল্যাব ফাংশন):

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

2
আমি বিশ্বাস করি যে ক্লাইম () রঙের অক্ষগুলিকে স্কেল করে তবে রঙগুলি নিজেরাই মান পরিবর্তন করে। স্কেল বরাবর একটি নির্দিষ্ট ভগ্নাংশের বিন্দু একই রঙের হবে স্কেল যাই হোক না কেন, তবে এটি যে মানটির প্রতিনিধিত্ব করে তা পরিবর্তিত হবে।
পল

4
হ্যাঁ. এটিই জিজ্ঞাসকের কাঙ্ক্ষিত আচরণ, সুতরাং সমস্যাটি সমাধান করে: রঙের স্কেল গ্রাফগুলির মধ্যে একরকম হতে পারে।
এক্সকালাবুর

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 এর মানটি উপস্থাপন করতে ব্যবহৃত এখন আমার ডেটাতে সর্বাধিক মান উপস্থাপন করবে। রঙিনবারটি আমার প্রয়োজন অনুসারে ০.১ দেখাবে (ভিমন = ০, ভিম্যাক্স = ১ সহ) তবে এই সর্বোচ্চ মানের উপরে থাকা সমস্ত কিছুই একই রঙে হবে ...
পল

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কারণ এটি দ্রুত ( এখানে আরও ইনফো )।

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