matplotlib 如何为两个gridspec子图放置单个颜色条

tzdcorbm  于 2023-04-06  发布在  其他
关注(0)|答案(1)|浏览(87)

我试图绘制6个地块的形式,一个网格使用gridspec。我想一个颜色条之间的第2和第3列底部放置。
我的代码如下,但它生成了6个颜色条。我如何更改此代码,使其在两列之间的底部放置一个颜色条?

import matplotlib.gridspec as gridspec
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1.inset_locator import inset_axes

plt.figure(figsize=(8, 6))
gs = gridspec.GridSpec(2, 3)
gs.update(wspace= 1)

cmaps = ['RdBu_r', 'viridis', 'viridis']

for i in range(2):
  for j in range(3):
      ax = plt.subplot(gs[i, j])
      image = ax.pcolormesh(np.random.random((20, 20)) * (j + 1),
                            cmap=cmaps[j])
      #image = ax.imshow(im)
      axins = inset_axes(ax, 
               width="10%",  
               height="100%",  
               loc='lower left',
               bbox_to_anchor=(1.05, 0.0, 1, 1),
               bbox_transform=ax.transAxes,
               borderpad=0
               )
               
      cb = plt.colorbar(image, cax=axins)

我希望颜色条水平放置在底部,跨越第2列和第3列(我用红色标记了我希望放置的位置)。

1l5u6lss

1l5u6lss1#

Matplotlib足够聪明,可以给予你使用ax参数一次为多个轴创建一个颜色条:

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

plt.figure(figsize=(8, 6))
gs = gridspec.GridSpec(2, 3)
gs.update(wspace= 1)

cmaps = ['RdBu_r', 'viridis', 'viridis']

axs = [[],[]]
for i in range(2):
  for j in range(3):
      ax = plt.subplot(gs[i, j])
      axs[i].append(ax)
      image = ax.pcolormesh(
          np.random.random((20, 20)) * (j + 1),
          cmap=cmaps[j])

# converting to numpy array for easier slicing
axs = np.array(axs)

cb = plt.colorbar(
    image,
    ax=axs[:,1:], # select all axis from second column
    orientation='horizontal')

颜色条将占据轴的一部分,并且第一列将不在底部对齐。
如果这让你感到困扰,可以在gridspec中手动定义colorbar轴,并在其中增加一行。要控制colorbar的高度,可以修改gridspec的高度比(height_ratios=[1,1,.1],更多的是gridspec's documentation)。我的尝试是:

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

plt.figure(figsize=(8, 6))

gs = gridspec.GridSpec(
    3, 3,
    height_ratios=[1,1,.1]) 
gs.update(wspace= 1)

cmaps = ['RdBu_r', 'viridis', 'viridis']

axs = [[],[]]
for i in range(2):
  for j in range(3):
      ax = plt.subplot(gs[i, j])
      axs[i].append(ax)
      image = ax.pcolormesh(
          np.random.random((20, 20)) * (j + 1),
          cmap=cmaps[j])

# ax is not necessary if cax is given
cb = plt.colorbar(
    image,
    cax=plt.subplot(gs[-1, 1:]),
    orientation='horizontal')

相关问题