我有一个包装器,plot2d
,用于 matplotlib 函数 imshow
,它也调用 colorbar
(请参见下面的代码)。当我以非顺序顺序在子图上使用它时(例如,子图 2 后跟子图 1),错误的颜色条会绘制在至少一个子图轴上。下面代码中的函数 bad_cb_on_top
就是一个例子。但是,当我使用 works_just_fine
时,我得到了预期的结果。这两个函数之间的唯一区别是它们绘制到子图轴的顺序。
我的两个问题是:
- 为什么绘制子图轴的顺序很重要?
- 如何让
bad_cb_on_top
产生与works_just_fine
当前给出的结果相同的结果,而不修改bad_cp_on_top
?
版本信息:
- python 2.7.3
- matplotlib 1.1.1
示例代码:
from pylab import *
x = linspace(-1, 1, 100)
x, y = meshgrid(x, x)
data = 1./(x**2 + y**2)
def plot2d(data, ax=None, vmax=None):
'''A simple wrapper for implot.'''
# if ax was given, set ax as the current axis for plotting
if ax :
sca(ax)
# Plot the data
im = imshow(data, vmax=vmax, interpolation='lanczos')
# This line assures that ax is the axis which was just plotted on
# even if ax was not specified
ax = im.axes
# Add the colorbar
cb = colorbar(ax=ax, orientation='vertical')
return None
figsize=[4, 7]
def bad_cb_on_top():
# This function copies the color bar from the bottom panel
# to the top panel for some unknown reason.
fig, axs = subplots(2, 1, figsize=figsize)
plot2d(data, vmax=31, ax=axs[1])
plot2d(data, vmax=314, ax=axs[0])
fig.show()
def works_just_fine():
# This function works as intended despite little change
fig, axs = subplots(2, 1, figsize=figsize)
plot2d(data, vmax=314, ax=axs[0])
plot2d(data, vmax=31, ax=axs[1])
fig.show()
bad_cb_on_top()
works_just_fine()
来自bad_cp_on_top()
的输出:
来自works_just_fine()的输出
最佳答案
我可能非常错了,但是您可以通过将 im 作为可映射对象传递到 colorbar() 来强制执行正确的错误。在plot2d中:
cb = colorbar(im, ax=ax, orientation='vertical')
我认为这样它不仅指定轴,还指定可映射输入。仅供引用,这对我来说没有什么区别(使用 1.3.1),所以没有任何问题,但这也意味着我无法测试它。
关于python - Matplotlib 分配给子图的颜色条错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24378414/