我正在尝试将多个颜色条与使用gridspec
或fig.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")
如果我在代码运行后打印axpos
,ax.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()
答案 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()
请注意,这与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()
编辑问题的已编辑部分:
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()