Matplotlib 轴位置和颜色条对齐

2024-03-18

我正在尝试将多个颜色条与使用其中之一生成的子图对齐gridspec or fig.add_subplots。我想添加颜色条fig.add_axes在 matplotlib (v2.02) 中,因为它允许详细的对齐控制。但是,我需要获取图形位置才能进行对齐。这ax.get_position()函数似乎没有返回正确的坐标:

这是一个 MWE:

import matplotlib.gridspec as gridspec
import scipy.misc

fig = plt.figure(1)
fig.set_tight_layout(True)
gs = gridspec.GridSpec(2,2)
ax = plt.subplot(gs[0,0])
lena = scipy.misc.face()
im = ax.imshow(lena)
axpos = ax.get_position() # bbox# get_position().get_points()
cbar_axis = fig.add_axes([axpos.x0, axpos.y0-0.1, axpos.width, 0.05])
colorbar = fig.colorbar(im, cax=cbar_axis, orientation="horizontal")

The colorbar does not align: image with misaligned colorbar

如果我打印axpos代码运行后,并且ax.get_position(),两者并不相同。这表明ax.get_position()在代码执行时使用过时的信息。我尝试过添加plt.show() and plt.draw()它并不能解决这个问题。

如何获取轴位置?

EDIT:

我修改了下面发布的解决方案(https://stackoverflow.com/a/44731797/238882 https://stackoverflow.com/a/44731797/238882)更好地展示我正在尝试做什么以及为什么make_axes_locatable似乎(还)不适合我。我想要一列下有两个颜色条,另一列下有一个。这样做与make_axes_locatable下面的代码产生下图。我希望这些数字都保持相同的大小并在网格中对齐。

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import scipy.misc
from mpl_toolkits.axes_grid1 import make_axes_locatable

plt.close(1)
fig, axes = plt.subplots(2,2)
fig.set_tight_layout(True)

lena = scipy.misc.face()

for i, ax in enumerate(axes.flatten()):

    im = ax.imshow(lena)
    divider = make_axes_locatable(ax)
    if i == 2:
        ax_cb = divider.new_vertical(size="10%", pad=0.3, pack_start=True)
        fig.add_axes(ax_cb)
        fig.colorbar(im, cax=ax_cb,  orientation="horizontal")
        ax_cb2 = divider.new_vertical(size="10%", pad=0.3, pack_start=True)
        fig.add_axes(ax_cb2)
        fig.colorbar(im, cax=ax_cb2,  orientation="horizontal")
    if i == 3:
        ax_cb = divider.new_vertical(size="10%", pad=0.3, pack_start=True)
        fig.add_axes(ax_cb)
        fig.colorbar(im, cax=ax_cb,  orientation="horizontal")

plt.show()

通常您不想使用轴的绝对位置,因为这可能(正如您发现的)根据其他艺术家绘制的或放置在画布中的图形而变化。

如果目标是将颜色条定位在轴下方,一个有用的方法是使用mpl_toolkits.axes_grid1.make_axes_locatable如所见这个官方的例子 https://matplotlib.org/examples/axes_grid/demo_axes_divider.html.

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import scipy.misc
from mpl_toolkits.axes_grid1 import make_axes_locatable

fig = plt.figure(1)
fig.set_tight_layout(True)
gs = gridspec.GridSpec(2,2)
ax = plt.subplot(gs[0,0])
lena = scipy.misc.face()
im = ax.imshow(lena)

divider = make_axes_locatable(ax)

ax_cb = divider.new_vertical(size="5%", pad=0.3, pack_start=True)
fig.add_axes(ax_cb)

fig.colorbar(im, cax=ax_cb,  orientation="horizontal")

plt.show()

请注意,这绝对兼容tight_layout设置轴时add_axes is not.

您可以通过使用第二次调用进一步划分轴来创建更多错误栏divider.new_vertical.

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import scipy.misc
from mpl_toolkits.axes_grid1 import make_axes_locatable

fig, axes = plt.subplots(2,2)
fig.set_tight_layout(True)

lena = scipy.misc.face()

for i, ax in enumerate(axes.flatten()):

    im = ax.imshow(lena)
    divider = make_axes_locatable(ax)
    ax_cb = divider.new_vertical(size="10%", pad=0.3, pack_start=True)
    ax_cb2 = divider.new_vertical(size="10%", pad=0.3, pack_start=True)
    fig.add_axes(ax_cb)
    fig.colorbar(im, cax=ax_cb,  orientation="horizontal")
    if i % 2 - 1:
        fig.add_axes(ax_cb2)
        fig.colorbar(im, cax=ax_cb2,  orientation="horizontal")

plt.show()

编辑问题的编辑部分:

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import scipy.misc
from mpl_toolkits.axes_grid1 import make_axes_locatable


fig, axes = plt.subplots(2,2)
fig.set_tight_layout(True)

lena = scipy.misc.face()

for i, ax in enumerate(axes.flatten()):

    im = ax.imshow(lena)
    divider = make_axes_locatable(ax)
    ax_cb = divider.new_vertical(size="8%", pad=0.3, pack_start=True)
    ax_cb2 = divider.new_vertical(size="8%", pad=0.02, pack_start=True)
    if i == 2:
        fig.add_axes(ax_cb)
        fig.colorbar(im, cax=ax_cb,  orientation="horizontal")
        fig.add_axes(ax_cb2)
        fig.colorbar(im, cax=ax_cb2,  orientation="horizontal")
        ax_cb.tick_params(bottom=False,labelbottom=False)
    if i == 3:
        fig.add_axes(ax_cb)
        fig.colorbar(im, cax=ax_cb,  orientation="horizontal")

plt.show()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Matplotlib 轴位置和颜色条对齐 的相关文章

随机推荐