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

标签 python matplotlib subplot colorbar matplotlib-gridspec

我正在尝试使用 gridspec 以网格的形式绘制 6 个图。我希望在第二列和第三列之间的底部放置一个颜色条。

我的代码如下,但它生成了6个颜色条。如何更改此代码,以便将一个颜色条放置在两列之间的底部? enter image description here

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 列的底部(我在希望放置的位置用红色标记)。

最佳答案

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

Colorbar for multiple axis using ax

颜色条将占据轴的一部分,并且第一列不会在底部对齐。

如果这让您烦恼,请在网格规范中使用额外的行手动定义颜色条轴。要控制颜色条的高度,请修改 grispec 高度比率(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')

Colorbar for multiple axis using cax

关于python - 如何为两个 gridspec 子图放置单个颜色条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68769075/

相关文章:

python - Popen-ing 使用多处理调用脚本的 python 调用(pgrp 问题)?

python - 如何使用 Python 获得直方图中可变 bin 范围的相同 bin 宽度?

python - 在 Python 中读取未定义数量的列并使用 matplotlib 绘制数据

python - 如何调整子图的高度和宽度以紧密配合?

python - Scrapy - 使用 header 和请求负载模拟 AJAX 请求

python - python min 函数是如何工作的

python - * 在 Python 正则表达式匹配中有副作用吗?

python - matplotlib 中 Poly3DCollection 图的透明度

python - 子图中的循环产生了两次图表

matlab - 如何在 MATLAB 中的 for 循环内切换不同图形的子图