matplotlib:使用axes_grid1创建颜色栏时,将颜色条缩短一半

时间:2018-03-30 14:52:04

标签: matplotlib colorbar

我正在尝试将颜色条缩短一半。有谁知道如何做到这一点?我尝试了cax.get_position()然后cax.set_position(),但是这个方法不起作用。

此外,似乎axis_grid1创建的轴具有与原始轴相同的bbox位置。这是一个错误吗?

PS。我必须使用axes_grid1来创建颜色条轴,因为之后我需要使用tight_layout(),而tight_layout()仅适用于axes_grid1创建的轴,而不适用于add_axes()创建的轴。

import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
import numpy as np
plt.figure()
ax = plt.gca()
im = ax.imshow(np.arange(100).reshape((10,10)))
divider = make_axes_locatable(ax)
cax = divider.append_axes("right", size="5%", pad=0.05)
bbox1 = ax.get_position()
print(bbox1)
bbox1 = cax.get_position()
print(bbox1)
plt.colorbar(im, cax=cax)
plt.show()

enter image description here

1 个答案:

答案 0 :(得分:2)

axes_divider的重点是划分轴以为新轴腾出空间。这可确保所有轴都具有相同的周围框。那就是你看到的那个盒子。

this question中显示了在figue中某个位置创建颜色条的一些常用方法。这里的问题似乎是能够调用tight_layout。这可以通过以下两个选项实现。 (可能还有其他人。)

甲。使用gridspec

我对此处的具体要求不太确定,但似乎使用正常的网格布局会更符合您的需求。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

fig = plt.figure()
gs = gridspec.GridSpec(2, 2, width_ratios=[95,5],)

ax = fig.add_subplot(gs[:, 0])

im = ax.imshow(np.arange(100).reshape((10,10)))

cax = fig.add_subplot(gs[1, 1])
fig.colorbar(im, cax=cax, ax=ax)
plt.tight_layout()
plt.show()

enter image description here

B中。使用axes_grid1

如果你真的需要使用axes_grid1,它可能会变得有点复杂。

import matplotlib.pyplot as plt
import matplotlib.axes
from mpl_toolkits.axes_grid1 import make_axes_locatable, Size
import numpy as np

fig, ax = plt.subplots()

im = ax.imshow(np.arange(100).reshape((10,10)))

divider = make_axes_locatable(ax)

pad = 0.03
pad_size = Size.Fraction(pad, Size.AxesY(ax))

xsize = Size.Fraction(0.05, Size.AxesX(ax))
ysize = Size.Fraction(0.5-pad/2., Size.AxesY(ax))

divider.set_horizontal([Size.AxesX(ax), pad_size, xsize])
divider.set_vertical([ysize, pad_size, ysize])

ax.set_axes_locator(divider.new_locator(0, 0, ny1=-1))


cax = matplotlib.axes.Axes(ax.get_figure(),
                 ax.get_position(original=True))
locator = divider.new_locator(nx=2, ny=0)
cax.set_axes_locator(locator)

fig.add_axes(cax)

fig.colorbar(im, cax=cax)

plt.tight_layout()
plt.show()

enter image description here