2015-01-15 36 views
0

我正在绘制与pyplot.pcolormesh的网格,并且我想自定义颜色条上的标记标记。我列出了一个勾号位置列表,并提供了一个应该与勾号位置相匹配的勾号标签列表,但我并不知道哪些勾号实际上会包含在内,因为我不知道最大值和最小值数据。问题是我提供的第一个标签总是在第一个可见的勾号中使用,无论这是否是我列表中的第一个勾号。颜色条标记与标记位置不匹配

工作实施例:

import matplotlib.pyplot as plt 
import numpy as np 

a = np.arange(1,10).reshape(3,3) 
m = plt.pcolormesh(a) 
c = plt.colorbar(m) 
c.set_ticks(np.arange(11)) 
c.set_ticklabels(np.arange(11)) 
plt.savefig('mesh.png') 

此代码将产生图像的下方,并且这里的问题是,最暗蓝色标有0,而在该单元格的值实际上是1,并且类似地所有其它标签被移动了1.

这是一个错误还是一个特性,如果它是一个特性,我如何确保这些标签能以优雅的方式匹配?我想我会处理一些关于数据的测试,并试图找出哪个嘀嗒声是第一个可见的,等等,但这似乎不是pythonic。

mesh

回答

3

它的一个特色,因为你设置ticklabels自己(与错误的标签)。最好总是尽量避免手动设置ticklabels,除非没有其他办法。

如果删除此行,标签会显示正确:

c.set_ticklabels(np.arange(11)) 

enter image description here

为了提高可读性,你也可以考虑标准化的颜色,使他们成为独立和匹配特定的整数值。但是,只有在颜色总量有限的情况下,这个效果才会很好,就像本例中一样。

fig, ax = plt.subplots() 

cmap = plt.cm.jet 

bounds = np.arange(0.5,10.5,1) 
norm = mpl.colors.BoundaryNorm(bounds, cmap.N) 

m = ax.pcolormesh(a, cmap=cmap, norm=norm) 
c = plt.colorbar(m, ticks=bounds-0.5) 

enter image description here

+0

的事情是,我需要改变ticklabels的可读性,因为我展示对数尺度的厚度,所以我想上的标签,说10^-1毫米, 10^-2毫米等,但我通过查询数据来查找最大值和最小值,然后仅生成将使用的标签。 – Tor

+0

您还可以使用'格式化程序'来获取刻度线,它可以读取刻度线的值,然后将其修改为正确的格式。但是,你只需要定义格式而不是数值本身。 http://matplotlib.org/examples/pylab_examples/custom_ticker1.html –