ম্যাটপ্ললিব 2 সাবপ্লট, 1 কালারবার


235

আমি ম্যাটপ্ল্লোব-এ দু'জনের মধ্যে ভাগ করা একক রঙের বারের সাথে কীভাবে একই ওয়াই-অক্ষটি ভাগ করতে দুটি সাব-প্লট পেতে পারি তা নিয়ে পুরোপুরি দীর্ঘ সময় ব্যয় করেছি।

যা হচ্ছিল তা হ'ল আমি যখন colorbar()ফাংশনটিকে উভয় দিকে ডেকেছিলাম subplot1বা subplot2প্লটটি অটোক্যাস করবে যে রঙবার প্লাস প্লটটি 'সাবপ্লট' বাউন্ডিং বাক্সের ভিতরে ফিট করবে, যার ফলে দুটি পাশের প্লট দুটি খুব আলাদা হবে মাপ।

এটি পেতে, আমি একটি তৃতীয় সাবপ্লট তৈরি করার চেষ্টা করেছি যা আমি কেবল একটি কালারবারের সাথে কোনও প্লট রেন্ডার করতে হ্যাক করেছি। একমাত্র সমস্যা হ'ল, এখন দুটি প্লটের উচ্চতা এবং প্রস্থগুলি অসম এবং এটি কীভাবে ঠিক করা যায় তা আমি বুঝতে পারি না।

আমার কোডটি এখানে:

from __future__ import division
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import patches
from matplotlib.ticker import NullFormatter

# SIS Functions
TE = 1 # Einstein radius
g1 = lambda x,y: (TE/2) * (y**2-x**2)/((x**2+y**2)**(3/2)) 
g2 = lambda x,y: -1*TE*x*y / ((x**2+y**2)**(3/2))
kappa = lambda x,y: TE / (2*np.sqrt(x**2+y**2))

coords = np.linspace(-2,2,400)
X,Y = np.meshgrid(coords,coords)
g1out = g1(X,Y)
g2out = g2(X,Y)
kappaout = kappa(X,Y)
for i in range(len(coords)):
    for j in range(len(coords)):
        if np.sqrt(coords[i]**2+coords[j]**2) <= TE:
            g1out[i][j]=0
            g2out[i][j]=0

fig = plt.figure()
fig.subplots_adjust(wspace=0,hspace=0)

# subplot number 1
ax1 = fig.add_subplot(1,2,1,aspect='equal',xlim=[-2,2],ylim=[-2,2])
plt.title(r"$\gamma_{1}$",fontsize="18")
plt.xlabel(r"x ($\theta_{E}$)",fontsize="15")
plt.ylabel(r"y ($\theta_{E}$)",rotation='horizontal',fontsize="15")
plt.xticks([-2.0,-1.5,-1.0,-0.5,0,0.5,1.0,1.5])
plt.xticks([-2.0,-1.5,-1.0,-0.5,0,0.5,1.0,1.5])
plt.imshow(g1out,extent=(-2,2,-2,2))
plt.axhline(y=0,linewidth=2,color='k',linestyle="--")
plt.axvline(x=0,linewidth=2,color='k',linestyle="--")
e1 = patches.Ellipse((0,0),2,2,color='white')
ax1.add_patch(e1)

# subplot number 2
ax2 = fig.add_subplot(1,2,2,sharey=ax1,xlim=[-2,2],ylim=[-2,2])
plt.title(r"$\gamma_{2}$",fontsize="18")
plt.xlabel(r"x ($\theta_{E}$)",fontsize="15")
ax2.yaxis.set_major_formatter( NullFormatter() )
plt.axhline(y=0,linewidth=2,color='k',linestyle="--")
plt.axvline(x=0,linewidth=2,color='k',linestyle="--")
plt.imshow(g2out,extent=(-2,2,-2,2))
e2 = patches.Ellipse((0,0),2,2,color='white')
ax2.add_patch(e2)

# subplot for colorbar
ax3 = fig.add_subplot(1,1,1)
ax3.axis('off')
cbar = plt.colorbar(ax=ax2)

plt.show()

উত্তর:


319

কেবল রঙ অক্ষরটি তার নিজস্ব অক্ষরে রাখুন এবং এর subplots_adjustজন্য জায়গা তৈরি করতে ব্যবহার করুন।

দ্রুত উদাহরণ হিসাবে:

import numpy as np
import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=2, ncols=2)
for ax in axes.flat:
    im = ax.imshow(np.random.random((10,10)), vmin=0, vmax=1)

fig.subplots_adjust(right=0.8)
cbar_ax = fig.add_axes([0.85, 0.15, 0.05, 0.7])
fig.colorbar(im, cax=cbar_ax)

plt.show()

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

নোট রঙ পরিসীমা গত ইমেজ দ্বারা সেট করা হবে যে অঙ্কিত (যে বৃদ্ধি দিয়েছেন im) মূল্যবোধের পরিসীমা দ্বারা সেট করা হয় এমনকি যদি vminএবং vmax। উদাহরণস্বরূপ, যদি অন্য একটি প্লটে একটি উচ্চতর সর্বোচ্চ মান থাকে তবে সর্বাধিকের চেয়ে বেশি মানের সাথে পয়েন্টগুলি imঅভিন্ন রঙে প্রদর্শিত হবে।


4
এই সঠিক উদ্দেশ্যে ইমেজগ্রিডও খুব কার্যকর।
ফিলিপ ক্লাউড

5
আপনার যদি টাইট_এলআউট () ব্যবহার করতে হয়, আপনি টাইট_লেআউট পরে সাবপ্লটস-অ্যাডজাস্টের পরে সমস্ত কিছু করতে চাইবেন এবং তারপরে সাবপ্লটস-অ্যাডজাস্ট এবং অ্যাড_এক্সেসের জন্য স্থানাঙ্কগুলিকে ম্যানুয়ালি টুইঙ্ক করতে পারেন।
user1748155

2
আমার কাছে ইতিমধ্যে দুটি পৃথক স্ক্রেটার প্লটের জন্য আমি কীভাবে একক রঙের বার পাব? আমি উপরের দিকে চেষ্টা করেছিলাম কিন্তু কীভাবে উপযুক্ত ভেরিয়েবলের সাথে "im" রাখতে হবে তা আমি জানি না। আমার স্ক্যাটার প্লটগুলি প্লট 1 = পাইলিব.স্ক্যাটার (এক্স, ওয়াই, জেড) এবং প্লট 2 = পাইলিব.স্ক্যাটার (এ, বি, সি)
রোটেল

46
এটি অন্যের কাছে সুস্পষ্ট হতে পারে, তবে আমি এটি উল্লেখ করতে চেয়েছিলাম যে যাতে কলরবার সমস্ত প্লটের রং সঠিকভাবে উপস্থাপন করে, vminএবং vmaxযুক্তিগুলি সমালোচনাযোগ্য। তারা প্রতিটি সাবপ্লট এর রঙ পরিসর নিয়ন্ত্রণ করে। আপনার যদি সত্যিকারের ডেটা থাকে তবে আপনাকে সর্বনিম্ন সর্বনিম্ন এবং সর্বাধিক মানগুলি খুঁজে পেতে এর মধ্য দিয়ে যেতে হবে।
জেমস মালিকরা

2
প্লটের মানগুলির পরিসীমা যদি পৃথক হয়, রঙবার পরিসরটি কেবল শেষ প্লটের সীমানা প্রদর্শন করবে, তাই না? কোনও পরামর্শ?
লুকাস

132

আপনি অক্ষগুলির একটি তালিকা সহ axপ্যারামিটার ব্যবহার করে জো কিংটনের কোডটি সহজ করতে পারেন figure.colorbar()ডকুমেন্টেশন থেকে :

কুঠার

কোনটি | অভিভাবক অক্ষগুলি অবজেক্ট (গুলি) থেকে নতুন রঙবার অক্ষের জন্য স্থানটি চুরি হয়ে যাবে। যদি অক্ষগুলির একটি তালিকা দেওয়া থাকে তবে তাদের সবগুলি রঙ বারের অক্ষগুলির জন্য জায়গা তৈরি করতে পুনরায় আকার দেওয়া হবে।

import numpy as np
import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=2, ncols=2)
for ax in axes.flat:
    im = ax.imshow(np.random.random((10,10)), vmin=0, vmax=1)

fig.colorbar(im, ax=axes.ravel().tolist())

plt.show()

1


4
এই সমাধানটি এখানে খুব ভালভাবে কাজ করেছে এবং এটি সবচেয়ে সহজ বলে মনে হচ্ছে।
Kknd

8
আপনি যদি নરોটি 1 তে পরিবর্তন করেন তবে দুটি প্লটই কালারবারের চেয়ে শাটার। সুতরাং, এই সমস্যাটি কীভাবে সমাধান করা যায়?
জ্বিন

6
দুঃখজনকভাবে এটি টাইট_এলআউট দিয়ে কাজ করে না, তবে তবে ভাল সমাধান।
চিহ্নিত করুন

1
শুধু মনে রাখতে হবে ... আমি এই সমাধানটি ভালবাসি! তিনা কি কের সেরেন্স!
আইরি সিমোস-সুসা

1
এই উত্তরের গুরুত্বপূর্ণ অংশটি হ'ল fig.colorbar(im, ax=axes.ravel().tolist())। যদি আপনি বাদ দেন ax=axes.ravel().tolist()তবে রঙবারটি একটি সাবপ্লোটের মধ্যে স্থাপন করা হবে।
nanpasu64

55

এই সমাধানটির জন্য অক্ষের অবস্থান বা কালারবারের আকারের ম্যানুয়াল টুইট করা দরকার হয় না, বহু-সারি এবং একক-সারি বিন্যাসের সাথে কাজ করে এবং এর সাথে কাজ করে tight_layout()। এটা একটা থেকে অভিযোজিত হয় গ্যালারি উদাহরণ ব্যবহার ImageGridmatplotlib থেকে AxesGrid টুলবক্স

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import ImageGrid

# Set up figure and image grid
fig = plt.figure(figsize=(9.75, 3))

grid = ImageGrid(fig, 111,          # as in plt.subplot(111)
                 nrows_ncols=(1,3),
                 axes_pad=0.15,
                 share_all=True,
                 cbar_location="right",
                 cbar_mode="single",
                 cbar_size="7%",
                 cbar_pad=0.15,
                 )

# Add data to image grid
for ax in grid:
    im = ax.imshow(np.random.random((10,10)), vmin=0, vmax=1)

# Colorbar
ax.cax.colorbar(im)
ax.cax.toggle_label(True)

#plt.tight_layout()    # Works, but may still require rect paramater to keep colorbar labels visible
plt.show()

চিত্র গ্রিড


ডাবল +1, এটি দুর্দান্ত পদ্ধতি
ব্রেট

প্রকৃতপক্ষে টাইট_এলআউট নিয়ে কাজ করে, তবে কীভাবে সেই রঙের বারটিতে একটি লেবেল যুক্ত করবেন তা আমার কোনও ধারণা নেই। এটি kws লেবেল, শিরোনাম, পাঠ্য ... কিছু গ্রহণ করে না! এবং দস্তাবেজগুলি খুব বেশি সাহায্য করে না।
টমচো

3
@TomCho একটি লেবেল সেট, আপনি colorbar এর হাতল দখল করতে পারেন যখন আপনি এটি instantiate, যেমন: thecb = ax.cax.colorbar(im)। তারপরে আপনি এটি করতে পারেনthecb.set_label_text("foo")
06

1
কীভাবে রঙম্যাপ পরিবর্তন করবেন?
সিগুর

1
@ সিগুর আমি নিশ্চিত যে আপনি এখনই এটি বের করে ফেলেছেন, তবে অন্যদের জন্য, im: im = ax.imshow (ডেটা, vmin = 0, vmax = 1, cmap = 'your_cmap_ এখানে') ঘোষণা করার সময় আপনি cmap পরিবর্তন করতে পারবেন
শন লুইস

38

ব্যবহার make_axesকরা আরও সহজ এবং আরও ভাল ফলাফল দেয়। এটি রঙবারের অবস্থানকে কাস্টমাইজ করার সম্ভাবনাও সরবরাহ করে। subplotsএক্স এবং ওয়াই অক্ষটি ভাগ করে নেওয়ার বিকল্পটিও নোট করুন ।

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

fig, axes = plt.subplots(nrows=2, ncols=2, sharex=True, sharey=True)
for ax in axes.flat:
    im = ax.imshow(np.random.random((10,10)), vmin=0, vmax=1)

cax,kw = mpl.colorbar.make_axes([ax for ax in axes.flat])
plt.colorbar(im, cax=cax, **kw)

plt.show()


7
সাবপ্লট বর্গক্ষেত্র না হলে এই পদ্ধতিটি কাজ করে না। আপনি যদি পরিবর্তন করেন nrows=1, রঙবার আবার সাবপ্লটগুলির চেয়ে বড় হয়ে যায়।
ওয়েসলি তানসে

আপনার ম্যাটপ্ল্লিটিব ডিফল্ট কি? এটা দেখতে অসাধারণ!
রাফেলওয়ালে

18

একজন শিক্ষানবিস যিনি এই থ্রেডটি পেরিয়ে গিয়েছিলেন, আমি অ্যাভিভিরমোটার খুব ঝরঝরে উত্তরটির পাইথন-ফর-ডামি অভিযোজন যুক্ত করতে চাই (কারণ আমি কী স্তরে এসেছি যে আমি কীভাবে কাজ করতে চাইছিলাম? তাদের কোডটি করছিল):

import numpy as np
import matplotlib.pyplot as plt

fig, ((ax1,ax2,ax3),(ax4,ax5,ax6)) = plt.subplots(2,3)

axlist = [ax1,ax2,ax3,ax4,ax5,ax6]

first = ax1.imshow(np.random.random((10,10)), vmin=0, vmax=1)
third = ax3.imshow(np.random.random((12,12)), vmin=0, vmax=1)

fig.colorbar(first, ax=axlist)

plt.show()

পাইথোনিক কম, আমার মতো নুবুর পক্ষে এখানে কী ঘটছে তা দেখতে খুব সহজ।


17

অন্যান্য উত্তরে যেমন উল্লেখ করা হয়েছে, ধারণাটি হ'ল রঙ বারবারের জন্য একটি অক্ষকে সংজ্ঞায়িত করা হয় so এটি করার বিভিন্ন উপায় রয়েছে; এখনও উল্লেখ করা হয়নি এমন একটি হ'ল সাব্প্লট তৈরিতে কালারবার অক্ষটি সরাসরি উল্লেখ করাplt.subplots() । সুবিধাটি হ'ল অক্ষগুলির অবস্থানটি ম্যানুয়ালি সেট করার প্রয়োজন হয় না এবং স্বয়ংক্রিয় দিকের সাথে সব ক্ষেত্রে কালবারবার সাবপ্লটগুলির মতো ঠিক একই উচ্চতা হবে height এমনকি অনেক ক্ষেত্রে যেখানে চিত্রগুলি ব্যবহার করা হয় ফলাফলটি সন্তুষ্ট হবে নীচের মত।

ব্যবহার করার সময় plt.subplots(), gridspec_kwযুক্তির ব্যবহার অন্যান্য বর্ণের তুলনায় রঙবার অক্ষগুলিকে অনেক ছোট করে তুলতে দেয়।

fig, (ax, ax2, cax) = plt.subplots(ncols=3,figsize=(5.5,3), 
                  gridspec_kw={"width_ratios":[1,1, 0.05]})

উদাহরণ:

import matplotlib.pyplot as plt
import numpy as np; np.random.seed(1)

fig, (ax, ax2, cax) = plt.subplots(ncols=3,figsize=(5.5,3), 
                  gridspec_kw={"width_ratios":[1,1, 0.05]})
fig.subplots_adjust(wspace=0.3)
im  = ax.imshow(np.random.rand(11,8), vmin=0, vmax=1)
im2 = ax2.imshow(np.random.rand(11,8), vmin=0, vmax=1)
ax.set_ylabel("y label")

fig.colorbar(im, cax=cax)

plt.show()

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

এটি ভালভাবে কাজ করে, যদি প্লটের দিকটি অটস্কিল থাকে বা চিত্রগুলি প্রস্থের দিকের দিকের কারণে (উপরের মত) সঙ্কুচিত হয়। তবে, চিত্রগুলি আরও বেশি উচ্চতর হলে ফলাফলটি নীচের মত দেখাবে, যা অনাকাঙ্ক্ষিত হতে পারে।

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

সাবপ্লট উচ্চতায় কালারবারের উচ্চতা স্থির করার একটি সমাধান mpl_toolkits.axes_grid1.inset_locator.InsetPositionহ'ল চিত্র সাবপ্ল্লট অক্ষের সাথে সম্পর্কিত রঙের অক্ষটি সেট করতে ব্যবহার করা হবে ।

import matplotlib.pyplot as plt
import numpy as np; np.random.seed(1)
from mpl_toolkits.axes_grid1.inset_locator import InsetPosition

fig, (ax, ax2, cax) = plt.subplots(ncols=3,figsize=(7,3), 
                  gridspec_kw={"width_ratios":[1,1, 0.05]})
fig.subplots_adjust(wspace=0.3)
im  = ax.imshow(np.random.rand(11,16), vmin=0, vmax=1)
im2 = ax2.imshow(np.random.rand(11,16), vmin=0, vmax=1)
ax.set_ylabel("y label")

ip = InsetPosition(ax2, [1.05,0,0.05,1]) 
cax.set_axes_locator(ip)

fig.colorbar(im, cax=cax, ax=[ax,ax2])

plt.show()

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


আমি নিশ্চিত না যে আমাকে এখানে জিজ্ঞাসা করার অনুমতি দেওয়া হয়েছে, তবে ax = fig.add_subplot()পরিবর্তে ব্যবহার করে এই সমাধানটি কার্যকর করার কোনও উপায় আছে কি? আমি জিজ্ঞাসা করছি কারণ বেসম্যাপ দিয়ে কীভাবে এটি ব্যবহার করব তা আমি বুঝতে পারি না।
লানডাকেনদা

1
@lanadaquenada হ্যাঁ সম্ভব যে, কিন্তু আপনি একটি সরবরাহ করতে হবে GridSpecকরতে add_subplot()যে ক্ষেত্রে।
ImportanceOfBeingEnnest

10

অক্ষ দ্বারা একটি তালিকা ব্যবহার করার সমাধান মন্তব্যগুলির মধ্যে উল্লেখ না করে আপনি কেবলমাত্র এক সারি চিত্র ব্যবহার না অবধিইভিরামোট সমাধানটি খুব ভালভাবে কাজ করে। সহায়তার জন্য যুক্তিসঙ্গত দিক অনুপাত ব্যবহার করা figsize, তবে এখনও নিখুঁত। উদাহরণ স্বরূপ:

import numpy as np
import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(9.75, 3))
for ax in axes.flat:
    im = ax.imshow(np.random.random((10,10)), vmin=0, vmax=1)

fig.colorbar(im, ax=axes.ravel().tolist())

plt.show()

1 এক্স 3 চিত্র অ্যারে

Colorbar ফাংশন প্রদান করে shrinkপ্যারামিটার যা colorbar অক্ষ আকার জন্য স্কেলিং ফ্যাক্টর। এটিতে কিছু ম্যানুয়াল ট্রায়াল এবং ত্রুটি দরকার। উদাহরণ স্বরূপ:

fig.colorbar(im, ax=axes.ravel().tolist(), shrink=0.75)

সঙ্কুচিত কালারবার সহ 1 এক্স 3 চিত্রের অ্যারে


4

@ অ্যাভিভিরামোটার দুর্দান্ত উত্তরে যোগ করতে, আপনি বাঁধা_মেলাআপনার সাথে টাইট_লেআউটের ইউকোভ্যালেন্ট পেতে পারেন। আপনি আরোপিত 1: 1 টির অনুপাতের imshowপরিবর্তে আপনি যদি ব্যবহার করেন তবে আপনি বৃহত্তর অনুভূমিক শূন্যস্থানগুলি পাবেন । pcolormeshimshow

import numpy as np
import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=2, ncols=2, constrained_layout=True)
for ax in axes.flat:
    im = ax.pcolormesh(np.random.random((10,10)), vmin=0, vmax=1)

fig.colorbar(im, ax=axes.flat)
plt.show()

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


1

আমি লক্ষ্য করেছি যে প্রায় প্রতিটি সমাধান জড়িত পোস্ট করে ax.imshow(im, ...)এবং একাধিক উপসর্গের জন্য রঙিন বারে প্রদর্শিত রঙগুলিকে স্বাভাবিক করে না। imMappable হয় গত উদাহরণস্বরূপ থেকে নেওয়া হয়, কিন্তু কি যদি একাধিক মান im-s আলাদা? (আমি ধরে নিচ্ছি যে এই ম্যাপেবলগুলি একইভাবে আচরণ করা হয় যেভাবে কনট্যুর সেট এবং সারফেস-সেটগুলি চিকিত্সা করা হয়।) আমার নীচে একটি 3 ডি পৃষ্ঠতল প্লট ব্যবহার করে একটি উদাহরণ রয়েছে যা 2x2 সাবপ্লোটের জন্য দুটি কালারবার তৈরি করে (এক সারিতে প্রতি রঙিনবার) )। যদিও প্রশ্নটি একটি পৃথক ব্যবস্থার জন্য স্পষ্টভাবে জিজ্ঞাসা করেছে, আমি মনে করি উদাহরণটি কিছু বিষয় পরিষ্কার করতে সহায়তা করে। plt.subplots(...)দুর্ভাগ্যক্রমে 3 ডি অক্ষের কারণে আমি এখনও এটি ব্যবহার করার কোনও উপায় খুঁজে পাইনি ।

উদাহরণ প্লট

আমি যদি রঙিন বারগুলি আরও ভাল উপায়ে রাখতে পারি তবে ... (এটি করার আরও অনেক ভাল উপায় সম্ভবত আছে তবে এটি অনুসরণ করা খুব বেশি কঠিন হওয়া উচিত নয়))

import matplotlib
from matplotlib import cm
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

cmap = 'plasma'
ncontours = 5

def get_data(row, col):
    """ get X, Y, Z, and plot number of subplot
        Z > 0 for top row, Z < 0 for bottom row """
    if row == 0:
        x = np.linspace(1, 10, 10, dtype=int)
        X, Y = np.meshgrid(x, x)
        Z = np.sqrt(X**2 + Y**2)
        if col == 0:
            pnum = 1
        else:
            pnum = 2
    elif row == 1:
        x = np.linspace(1, 10, 10, dtype=int)
        X, Y = np.meshgrid(x, x)
        Z = -np.sqrt(X**2 + Y**2)
        if col == 0:
            pnum = 3
        else:
            pnum = 4
    print("\nPNUM: {}, Zmin = {}, Zmax = {}\n".format(pnum, np.min(Z), np.max(Z)))
    return X, Y, Z, pnum

fig = plt.figure()
nrows, ncols = 2, 2
zz = []
axes = []
for row in range(nrows):
    for col in range(ncols):
        X, Y, Z, pnum = get_data(row, col)
        ax = fig.add_subplot(nrows, ncols, pnum, projection='3d')
        ax.set_title('row = {}, col = {}'.format(row, col))
        fhandle = ax.plot_surface(X, Y, Z, cmap=cmap)
        zz.append(Z)
        axes.append(ax)

## get full range of Z data as flat list for top and bottom rows
zz_top = zz[0].reshape(-1).tolist() + zz[1].reshape(-1).tolist()
zz_btm = zz[2].reshape(-1).tolist() + zz[3].reshape(-1).tolist()
## get top and bottom axes
ax_top = [axes[0], axes[1]]
ax_btm = [axes[2], axes[3]]
## normalize colors to minimum and maximum values of dataset
norm_top = matplotlib.colors.Normalize(vmin=min(zz_top), vmax=max(zz_top))
norm_btm = matplotlib.colors.Normalize(vmin=min(zz_btm), vmax=max(zz_btm))
cmap = cm.get_cmap(cmap, ncontours) # number of colors on colorbar
mtop = cm.ScalarMappable(cmap=cmap, norm=norm_top)
mbtm = cm.ScalarMappable(cmap=cmap, norm=norm_btm)
for m in (mtop, mbtm):
    m.set_array([])

# ## create cax to draw colorbar in
# cax_top = fig.add_axes([0.9, 0.55, 0.05, 0.4])
# cax_btm = fig.add_axes([0.9, 0.05, 0.05, 0.4])
cbar_top = fig.colorbar(mtop, ax=ax_top, orientation='vertical', shrink=0.75, pad=0.2) #, cax=cax_top)
cbar_top.set_ticks(np.linspace(min(zz_top), max(zz_top), ncontours))
cbar_btm = fig.colorbar(mbtm, ax=ax_btm, orientation='vertical', shrink=0.75, pad=0.2) #, cax=cax_btm)
cbar_btm.set_ticks(np.linspace(min(zz_btm), max(zz_btm), ncontours))

plt.show()
plt.close(fig)
## orientation of colorbar = 'horizontal' if done by column

যদি একাধিক imগুলি থেকে মানগুলি পৃথক হয় তবে তাদের একই রঙবার ব্যবহার করা উচিত নয় , তাই মূল প্রশ্নটি সত্যই প্রয়োগ হয় না
স্পিনআপ

0

এই বিষয়টি ভালভাবে কভার করা হয়েছে তবে আমি কিছুটা ভিন্ন দর্শনে অন্য পদ্ধতির প্রস্তাব করতে চাই ।

এটি সেট আপ করা কিছুটা জটিল তবে এটি (আমার মতে) কিছুটা নমনীয়তা দেয়। উদাহরণস্বরূপ, প্রত্যেকটি সাবপ্লট / রঙবারের সংশ্লিষ্ট অনুপাতের সাথে খেলতে পারে:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.gridspec import GridSpec

# Define number of rows and columns you want in your figure
nrow = 2
ncol = 3

# Make a new figure
fig = plt.figure(constrained_layout=True)

# Design your figure properties
widths = [3,4,5,1]
gs = GridSpec(nrow, ncol + 1, figure=fig, width_ratios=widths)

# Fill your figure with desired plots
axes = []
for i in range(nrow):
    for j in range(ncol):
        axes.append(fig.add_subplot(gs[i, j]))
        im = axes[-1].pcolormesh(np.random.random((10,10)))

# Shared colorbar    
axes.append(fig.add_subplot(gs[:, ncol]))
fig.colorbar(im, cax=axes[-1])

plt.show()

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

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