Matplotlib轴位置和颜色条对齐

时间:2017-06-23 20:01:05

标签: python matplotlib

我正在尝试将多个颜色条与使用gridspecfig.add_subplots生成的子图对齐。我想在matplotlib(v2.02)中添加带fig.add_axes的颜色条,因为它允许详细的对齐控制。但是,我需要获得数字位置才能进行对齐。 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")

颜色条不对齐: image with misaligned colorbar

如果我在代码运行后打印axposax.get_position(),则两者不一样。这表明ax.get_position()在代码执行时使用陈旧信息。我已尝试添加plt.show()plt.draw(),但这并未解决此问题。

如何获得轴位置?

修改

我已经修改了下面发布的解决方案(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()

enter image description here

1 个答案:

答案 0 :(得分:1)

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

如果目标是将颜色条放在轴下方,一种有用的方法是使用Microsoft.CSharp.CSharpCodeGenerator Class中的mpl_toolkits.axes_grid1.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

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

this official example

请注意,这与tight_layout绝对兼容,而设置add_axes的轴不是。

您可以通过第二次拨打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()

enter image description here

编辑问题的已编辑部分:

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

enter image description here