Matplotlib 2 แผนการย่อย, 1 Colorbar


235

ฉันใช้เวลานานเกินไปในการค้นคว้าวิธีรับสอง subplots เพื่อแชร์แกน y เดียวกันกับ colorbar เดียวที่แชร์ระหว่าง Matplotlib

สิ่งที่เกิดขึ้นคือเมื่อฉันเรียกใช้colorbar()ฟังก์ชั่นอย่างใดอย่างหนึ่งsubplot1หรือsubplot2มันจะปรับขนาดพล็อตแบบอัตโนมัติเพื่อให้ colorbar บวกกับพล็อตจะพอดีภายในกล่อง 'subplot' ขอบเขต ขนาด

เพื่อหลีกเลี่ยงปัญหานี้ฉันพยายามสร้างแผนย่อยที่สามซึ่งฉันถูกแฮ็กเพื่อทำให้ไม่มีพล็อตที่มีแถบสีอยู่ ปัญหาเดียวคือตอนนี้ความสูงและความกว้างของทั้งสองแปลงไม่เท่ากันและฉันไม่สามารถหาวิธีที่จะทำให้มันดูโอเค

นี่คือรหัสของฉัน:

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
ImageGrid ยังมีประโยชน์มากสำหรับวัตถุประสงค์ที่แน่นอนนี้
Phillip Cloud

5
หากคุณต้องการใช้ tight_layout () คุณจะต้องทำทุกอย่างหลังจาก subplots_adjust หลังจาก tight_layout แล้วปรับแต่งพิกัดสำหรับ subplots_adjust และ add_axes ด้วยตนเอง
user1748155

2
ฉันจะมีแถบสีเดียวสำหรับสองแผนการกระจายที่ฉันมีอยู่แล้วได้อย่างไร ฉันลองด้านบน แต่ไม่รู้วิธีแทนที่ "im" ด้วยตัวแปรที่เหมาะสม สมมติว่าแผนการกระจายของฉันคือ plot1 = pylib.scatter (x, y, z) และ plot2 = pylib.scatter (a, b, c)
Rotail

46
สิ่งนี้อาจเห็นได้ชัดสำหรับคนอื่น ๆ แต่ฉันต้องการชี้ให้เห็นว่าเพื่อให้สีของแถบสีแสดงสีได้อย่างถูกต้องในทุกแผนการvminและvmaxข้อโต้แย้งมีความสำคัญ พวกเขาควบคุมช่วงสีของแต่ละแผนย่อย หากคุณมีข้อมูลจริงคุณอาจต้องทำผ่านสิ่งนี้เพื่อค้นหาค่า min และ max ก่อน
James Owers

2
ถ้าช่วงของค่าของพล็อตแตกต่างกันช่วง colorbar จะแสดงเฉพาะช่วงพล็อตสุดท้ายใช่ไหม ข้อเสนอแนะใด ๆ
Lukas

132

คุณสามารถทำให้โค้ดของ Joe Kington ง่ายขึ้นโดยใช้axพารามิเตอร์ที่figure.colorbar()มีรายการของแกน จากเอกสาร :

ขวาน

ไม่มี | วัตถุแกนหลักซึ่งพื้นที่สำหรับแกน 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
หากคุณเปลี่ยน nrows เป็น 1 ทั้งสองแปลงเป็น shoter มากกว่า colorbar ดังนั้นจะแก้ปัญหานี้อย่างไร
Jin

6
น่าเสียดายที่มันใช้งานไม่ได้กับ tight_layout แต่วิธีแก้ปัญหาที่ดีก็คือ
ทำเครื่องหมาย

1
แค่จำไว้ ... ฉันชอบวิธีนี้! Tinha que ser cearense!
iury simoes-sousa

1
fig.colorbar(im, ax=axes.ravel().tolist())จะเป็นส่วนสำคัญของคำตอบนี้อยู่ หากคุณไม่ใส่ax=axes.ravel().tolist()แถบสีจะถูกวางไว้ในหนึ่งแผนย่อย
nyanpasu64

55

วิธีนี้ไม่จำเป็นต้องปรับแต่งตำแหน่งแกนหรือขนาดแถบสีด้วยตนเองทำงานร่วมกับโครงร่างแบบหลายแถวและแถวเดียวและใช้งานtight_layout()ได้ มันถูกดัดแปลงมาจากตัวอย่างที่แกลเลอรี่โดยใช้ImageGridจาก matplotlib ของ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 สองครั้งนี่เป็นวิธีการที่ยอดเยี่ยม
Brett

ใช้งานได้จริงกับ tight_layout แต่ฉันไม่รู้ว่าจะเพิ่มป้ายกำกับในแถบสีนั้นได้อย่างไร ไม่ยอมรับป้ายชื่อ kws ข้อความ ... ทุกอย่าง! และเอกสารก็ไม่ได้ช่วยอะไรมาก
TomCho

3
@TomCho ในการตั้งป้าย, คุณสามารถคว้าจับ ColorBar thecb = ax.cax.colorbar(im)เมื่อคุณยกตัวอย่างก็เช่น: จากนั้นคุณสามารถทำได้thecb.set_label_text("foo")
spinup

1
วิธีการเปลี่ยน colormap?
Sigur

1
@Sigur ฉันแน่ใจว่าคุณได้คิดออกแล้ว แต่สำหรับคนอื่นคุณสามารถเปลี่ยน cmap เมื่อประกาศ im: im = ax.imshow (data, vmin = 0, vmax = 1, cmap = 'your_cmap_here')
Shaun Lowis

38

การใช้make_axesง่ายยิ่งขึ้นและให้ผลลัพธ์ที่ดีกว่า นอกจากนี้ยังมีความเป็นไปได้ในการปรับแต่งตำแหน่งของแถบสี นอกจากนี้โปรดทราบว่าตัวเลือกในsubplotsการแบ่งปันแกน x และ y

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แถบสีจะใหญ่กว่าแผนการย่อยอีกครั้ง
เวสลีย์ Tansey

ค่าเริ่มต้นของ matplotlib คืออะไร มันดูดี!
rafaelvalle

18

ในฐานะผู้เริ่มต้นที่สะดุดในหัวข้อนี้ฉันต้องการเพิ่มการปรับ python-for-dummies ของคำตอบที่ดีมากของabevieiramota (เพราะฉันอยู่ในระดับที่ฉันต้องค้นหา 'ravel' เพื่อหาว่าอะไร รหัสของพวกเขากำลังทำอยู่):

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

ไพทอนน้อยลงมากง่ายขึ้นสำหรับ noobs เช่นฉันที่จะเห็นสิ่งที่เกิดขึ้นจริงที่นี่


17

ตามที่ระบุไว้ในคำตอบอื่น ๆ ความคิดมักจะกำหนดแกนสำหรับ colorbar ให้อยู่มีหลายวิธีในการทำเช่นนั้น หนึ่งที่ไม่ได้รับการเอ่ยถึงยังจะต้องระบุแกน colorbar โดยตรงที่การสร้างแผนย่อยด้วยplt.subplots()ในการสร้างแผนด้วย ข้อดีคือตำแหน่งของแกนไม่จำเป็นต้องถูกตั้งค่าด้วยตนเองและในทุกกรณีที่มีมุมมองแบบอัตโนมัติแถบสีจะมีความสูงเท่ากับพล็อตย่อย แม้ในหลายกรณีที่มีการใช้รูปภาพผลลัพธ์จะเป็นที่น่าพอใจดังที่แสดงด้านล่าง

เมื่อใช้plt.subplots()การใช้gridspec_kwอาร์กิวเมนต์อนุญาตให้แกน colorbar มีขนาดเล็กกว่าแกนอื่นมาก

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()แทนหรือไม่ ฉันถามเพราะฉันไม่สามารถหาวิธีใช้กับแผนที่ฐานได้
lanadaquenada

1
@lanadaquenada ใช่ว่าเป็นไปได้ แต่คุณจะต้องจัดหาGridSpecเพื่อadd_subplot()ในกรณีที่
ImportanceOfBeingErnest

10

วิธีแก้ปัญหาของการใช้รายการแกนโดยabevieiramotaทำงานได้ดีมากจนกว่าคุณจะใช้รูปภาพเพียงแถวเดียวตามที่ระบุไว้ในความคิดเห็น ใช้อัตราส่วนที่เหมาะสมสำหรับความ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 x 3

ฟังก์ชั่น ColorBarให้shrinkพารามิเตอร์ซึ่งเป็นปัจจัยการปรับขนาดของแกน ColorBar ที่ ต้องมีการทดลองใช้และข้อผิดพลาดด้วยตนเอง ตัวอย่างเช่น:

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

อาร์เรย์ภาพขนาด 1 x 3 พร้อมแถบสีหด


4

หากต้องการเพิ่มคำตอบที่ยอดเยี่ยมของ @ abevieiramota คุณสามารถรับ euqivalent ของ tight_layout ด้วย constrained_layout คุณจะยังคงได้รับช่องว่างในแนวนอนขนาดใหญ่ถ้าคุณใช้imshowแทนpcolormeshเพราะ 1: 1 imshowอัตราส่วนที่กำหนดโดย

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, ...)และไม่ทำให้สีที่แสดงบนแถบสีสำหรับมาตรฐานย่อยหลายรายการเป็นปกติ การimแม็พนั้นนำมาจากอินสแตนซ์สุดท้าย แต่จะเกิดอะไรขึ้นถ้าค่าของ multi im-s ต่างกัน? (ฉันสมมติว่า mappables เหล่านี้ได้รับการรักษาในลักษณะเดียวกับที่ชุดรูปร่างและพื้นผิวได้รับการปฏิบัติ) ฉันมีตัวอย่างโดยใช้พล็อตพื้นผิว 3 มิติด้านล่างที่สร้างสองแถบสีสำหรับแผนย่อย 2x2 (หนึ่ง colorbar ต่อแถว ) แม้ว่าคำถามจะถามอย่างชัดเจนถึงข้อตกลงที่แตกต่างกัน แต่ฉันคิดว่าตัวอย่างช่วยอธิบายบางสิ่งได้ ฉันไม่พบวิธีในการใช้สิ่งนี้plt.subplots(...)เนื่องจากขวานสามมิติน่าเสียดาย

พล็อตตัวอย่าง

ถ้าเพียง แต่ฉันสามารถวางตำแหน่งแถบสีได้ดีกว่า ... (อาจมีวิธีที่ดีกว่าในการทำเช่นนี้ แต่อย่างน้อยมันก็ไม่ยากที่จะติดตาม)

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แตกต่างกันพวกเขาไม่ควรใช้แถบสีเดียวกันดังนั้นคำถามดั้งเดิมจะไม่นำมาใช้จริง
spinup

0

หัวข้อนี้ได้รับการคุ้มครองอย่างดี แต่ฉันยังต้องการเสนอวิธีการอื่นในปรัชญาที่แตกต่างออกไปเล็กน้อย

มันค่อนข้างซับซ้อนกว่าเล็กน้อยในการตั้งค่า แต่มันทำให้มีความยืดหยุ่นมากขึ้น ตัวอย่างเช่นหนึ่งสามารถเล่นกับอัตราส่วนที่เกี่ยวข้องของแต่ละย่อย / colorbar:

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.