在 Matplotlib 和 gridspec 中为两个子图放置一个颜色条
Placing a single color bar for two sub-plots in Matplotlib and gridscpec
我正在尝试使用 gridspec 以网格形式绘制 6 个图。我想在第 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 列的底部(我在要放置的位置标记为红色)
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 中使用额外的行手动定义颜色条轴。要控制颜色条的高度,请修改 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')
我正在尝试使用 gridspec 以网格形式绘制 6 个图。我想在第 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 列的底部(我在要放置的位置标记为红色)
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 中使用额外的行手动定义颜色条轴。要控制颜色条的高度,请修改 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')