编辑:我从代码中删除了所有内容,这最终不是必需的。 Bug仍然存在于MultipleLocator中,但不会出现MaxNLocator。
我目前遇到了一个小的视觉错误,当我升级到matplotlib 1.4.3时发生了。我在ubuntu 12.04上使用python 2.7.3。我有一行,两列图和两个热图。两者都被迫共享色彩映射的相同范围的值。我规范化色图,使vmin和vmax的绝对值相等,但符号相反。当我尝试使用由MaxNLocator或MultipleLocator生成的现在自定义刻度时,在颜色条的一个或两个边缘处显示两个重叠的刻度。
以下是重现问题的最小代码:
#setup
#make scripts executable when logged in per ssh (no x-window)
import matplotlib
# Force matplotlib to not use any Xwindows backend.
matplotlib.use('Agg')
#other setup
import numpy as np
import matplotlib.pyplot as plt
import argparse
from matplotlib import ticker
from matplotlib.colors import Normalize
#
class MidpointNormalize(Normalize):
def __init__(self, vmin=None, vmax=None, midpoint=None, clip=False):
self.midpoint = midpoint
Normalize.__init__(self, vmin, vmax, clip)
def __call__(self, value, clip=None):
# I'm ignoring masked values and all kinds of edge cases to make a
# simple example...
x, y = [self.vmin, self.midpoint, self.vmax], [0, 0.5, 1]
return np.ma.masked_array(np.interp(value, x, y))
#first row first column plot
fig, axes = plt.subplots(nrows=1, ncols=2)
#plt.subplot(121)
#declare filename
data = np.random.rand(10,10)
data2 = np.random.rand(10,10)
cmapmin = -0.4
cmapmax = 0.4
cmap="jet"
norm = MidpointNormalize(midpoint=0.0, vmin=cmapmin, vmax=cmapmax)
axes[0].pcolor(data, edgecolors='k', vmin=cmapmin, vmax=cmapmax, cmap=cmap, norm=norm)
im = axes[1].pcolor(data2, edgecolors='k', vmin=cmapmin, vmax=cmapmax, cmap=cmap, norm=norm)
#give room for colorbar
fig.subplots_adjust(bottom=0.1, wspace=0.1, hspace=0.1)
cbar_ax = fig.add_axes([0.1, 0.95, 0.8, 0.04])
cb = fig.colorbar(im, cax=cbar_ax, orientation='horizontal')
#only use limited number of ticks as specified
tick_locator = ticker.MaxNLocator(nbins=8)
#set ticks every specified tickrange
#tick_locator = ticker.MultipleLocator(base=0.1)
cb.locator = tick_locator
cb.update_ticks()
#save file
fig.savefig("example1.png")
现在example1.png看起来像这样:
当我注释掉tick_locator = ticker.MaxNLocator(nbins=8)
行并使用tick_locator = ticker.MultipleLocator(base=0.1)
时,图片(example2.png)如下所示:
我希望,我修改后的问题可以帮助您走上正确的道路。
我将非常感谢任何导致此错误的解决方案的输入,因为到目前为止,我唯一的另一个选择是使用带有prune =“both”的MaxNLocator来剪切边缘刻度。 提前致谢