2

我正在尝试绘制一个使用有限数量颜色(离散)的颜色条。问题是颜色不会改变主要和次要刻度出现的位置。对数刻度(这是我需要的)问题更严重,但线性刻度也会发生!

你可以在这里看到一个例子: 在此处输入图像描述

人们可以很容易地注意到,颜色在刻度线之前或之后会发生变化。我用 Gimp 打开了图像,注释了每个刻度线中心像素的水平位置,它们位于正确的位置。因此,我确定问题出在彩色矩形的绘制上。

这是两个颜色条的缩放: 在此处输入图像描述

这是生成此图像的代码:

import matplotlib
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
import numpy as np

# fix the seed to reproduce the output exactly
np.random.seed(19680801)

# 2d normal distribution
data = np.random.normal(loc=0, scale=1., size=(2, 1000))
hist = np.histogram2d(data[0,:], data[1,:], range=[[-4, 4],[-3, 3]])
x = hist[1]
y = hist[2]
h = hist[0]/np.max(hist[0])

fig, ax = plt.subplots(1,2)

# plot with linear scale
ax[1].set_title('linear scale')
im1 = ax[1].pcolormesh(x, y, h, cmap=plt.get_cmap('jet',5))
cb1 = fig.colorbar(im1, ax=ax[1], orientation='horizontal')
cb1.ax.xaxis.set_major_locator  (mticker.FixedLocator((0,1)))
cb1.ax.xaxis.set_minor_locator  (mticker.FixedLocator((.2,.4,.6,.8)))
cb1.ax.xaxis.set_minor_formatter(mticker.FormatStrFormatter('%.1f'))
cb1.ax.tick_params(axis='x',which='major',length=7)
cb1.ax.tick_params(axis='x',which='minor',length=4,colors='red')

# plot with log scale
ax[0].set_title('log scale')
im0 = ax[0].pcolormesh(x, y, h, cmap=plt.get_cmap('jet', 6), 
                       norm=matplotlib.colors.LogNorm(vmin=0.01,vmax=1))
                       
cb0 = fig.colorbar(im0, ax=ax[0], orientation='horizontal')

cb0.ax.xaxis.set_major_locator  (mticker.FixedLocator((.01,.1,1)))
cb0.ax.xaxis.set_minor_locator  (mticker.FixedLocator((.02,.05,.2,.5)))
cb0.ax.xaxis.set_major_formatter(mticker.FormatStrFormatter('%.2f'))
cb0.ax.xaxis.set_minor_formatter(mticker.FormatStrFormatter('%.2f'))
cb0.ax.tick_params(axis='x',which='major',length=7)
cb0.ax.tick_params(axis='x',which='minor',length=4,colors='red')

fig.savefig('teste.png',dpi=300)

在这里查看一些旧线程,我可以注意到这个问题在很多年前就已经存在(请参见此处第一个响应中的第 5 点:Matplotlib 离散颜色条)。

我们应该怎么做?

4

0 回答 0