使用自定义刻度时重叠边缘刻度

时间:2015-07-20 12:44:26

标签: python matplotlib color-mapping

编辑:我从代码中删除了所有内容,这最终不是必需的。 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看起来像这样: using MaxNLocator

当我注释掉tick_locator = ticker.MaxNLocator(nbins=8)行并使用tick_locator = ticker.MultipleLocator(base=0.1)时,图片(example2.png)如下所示:

using MultipleLocator

我希望,我修改后的问题可以帮助您走上正确的道路。

我将非常感谢任何导致此错误的解决方案的输入,因为到目前为止,我唯一的另一个选择是使用带有prune =“both”的MaxNLocator来剪切边缘刻度。 提前致谢

0 个答案:

没有答案