绘制蒙面 numpy 数组会导致颜色条不正确
Plotting masked numpy array leads to incorrect colorbar
我正在尝试为 matplotlib 创建自定义颜色条 PolyCollection. Everything seems ok until I attempt to plot a masked array。颜色条不再显示正确的颜色,即使绘图显示正确的颜色也是如此。绘制掩码数组是否有不同的程序?
我正在使用 matplotlib 1.4.0 和 numpy 1.8。
这是我的绘图代码:
import numpy
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib.collections import PolyCollection
vertices = numpy.load('vertices.npy')
array = numpy.load('array.npy')
# Take 2d slice out of 3D array
slice_ = array[:, :, 0:1].flatten(order='F')
fig, ax = plt.subplots()
poly = PolyCollection(vertices, array=slice_, edgecolors='black', linewidth=.25)
cm = mpl.colors.ListedColormap([(1.0, 0.0, 0.0), (.2, .5, .2)])
poly.set_cmap(cm)
bounds = [.1, .4, .6]
norm = mpl.colors.BoundaryNorm(bounds, cm.N)
fig.colorbar(poly, ax=ax, orientation='vertical', boundaries=bounds, norm=norm)
ax.add_collection(poly, autolim=True)
ax.autoscale_view()
plt.show()
情节如下:
但是,当我在 切片之前 绘制具有以下更改的掩码数组时:
array = numpy.ma.array(array, mask=array > .5)
我得到一个颜色条,现在只显示一种颜色。即使两种颜色(正确)仍显示在图中。
在绘制掩码数组时,是否有一些技巧可以使颜色条保持一致?我知道我可以使用 cm.set_bad
来更改屏蔽值的颜色,但这并不是我想要的。我希望颜色条在这两个图之间显示相同,因为颜色和颜色条本身应该保持不变。
将 BoundaryNorm 传递给 PolyCollection,poly
。否则,poly.norm
默认设置为 matplotlib.colors.Normalize
实例:
In [119]: poly.norm
Out[119]: <matplotlib.colors.Normalize at 0x7faac4dc8210>
我没有仔细检查源代码来准确解释你发布的代码中发生了什么,但我推测这个 Normalize
实例和 BoundaryNorm
的交互使范围fig.colorbar
看到的值与您的预期不同。
无论如何,如果将 norm=norm
传递给 PolyCollection
,那么结果看起来是正确的:
import numpy
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.collections as mcoll
import matplotlib.colors as mcolors
numpy.random.seed(4)
N, M = 3, 3
vertices = numpy.random.random((N, M, 2))
array = numpy.random.random((1, N, 2))
# vertices = numpy.load('vertices.npy')
# array = numpy.load('array.npy')
array = numpy.ma.array(array, mask=array > .5)
# Take 2d slice out of 3D array
slice_ = array[:, :, 0:1].flatten(order='F')
fig, ax = plt.subplots()
bounds = [.1, .4, .6]
cm = mpl.colors.ListedColormap([(1.0, 0.0, 0.0), (.2, .5, .2)])
norm = mpl.colors.BoundaryNorm(bounds, cm.N)
poly = mcoll.PolyCollection(
vertices,
array=slice_,
edgecolors='black', linewidth=.25, norm=norm)
poly.set_cmap(cm)
fig.colorbar(poly, ax=ax, orientation='vertical')
ax.add_collection(poly, autolim=True)
ax.autoscale_view()
plt.show()
我正在尝试为 matplotlib 创建自定义颜色条 PolyCollection. Everything seems ok until I attempt to plot a masked array。颜色条不再显示正确的颜色,即使绘图显示正确的颜色也是如此。绘制掩码数组是否有不同的程序?
我正在使用 matplotlib 1.4.0 和 numpy 1.8。
这是我的绘图代码:
import numpy
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib.collections import PolyCollection
vertices = numpy.load('vertices.npy')
array = numpy.load('array.npy')
# Take 2d slice out of 3D array
slice_ = array[:, :, 0:1].flatten(order='F')
fig, ax = plt.subplots()
poly = PolyCollection(vertices, array=slice_, edgecolors='black', linewidth=.25)
cm = mpl.colors.ListedColormap([(1.0, 0.0, 0.0), (.2, .5, .2)])
poly.set_cmap(cm)
bounds = [.1, .4, .6]
norm = mpl.colors.BoundaryNorm(bounds, cm.N)
fig.colorbar(poly, ax=ax, orientation='vertical', boundaries=bounds, norm=norm)
ax.add_collection(poly, autolim=True)
ax.autoscale_view()
plt.show()
情节如下:
但是,当我在 切片之前 绘制具有以下更改的掩码数组时:
array = numpy.ma.array(array, mask=array > .5)
我得到一个颜色条,现在只显示一种颜色。即使两种颜色(正确)仍显示在图中。
在绘制掩码数组时,是否有一些技巧可以使颜色条保持一致?我知道我可以使用 cm.set_bad
来更改屏蔽值的颜色,但这并不是我想要的。我希望颜色条在这两个图之间显示相同,因为颜色和颜色条本身应该保持不变。
将 BoundaryNorm 传递给 PolyCollection,poly
。否则,poly.norm
默认设置为 matplotlib.colors.Normalize
实例:
In [119]: poly.norm
Out[119]: <matplotlib.colors.Normalize at 0x7faac4dc8210>
我没有仔细检查源代码来准确解释你发布的代码中发生了什么,但我推测这个 Normalize
实例和 BoundaryNorm
的交互使范围fig.colorbar
看到的值与您的预期不同。
无论如何,如果将 norm=norm
传递给 PolyCollection
,那么结果看起来是正确的:
import numpy
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.collections as mcoll
import matplotlib.colors as mcolors
numpy.random.seed(4)
N, M = 3, 3
vertices = numpy.random.random((N, M, 2))
array = numpy.random.random((1, N, 2))
# vertices = numpy.load('vertices.npy')
# array = numpy.load('array.npy')
array = numpy.ma.array(array, mask=array > .5)
# Take 2d slice out of 3D array
slice_ = array[:, :, 0:1].flatten(order='F')
fig, ax = plt.subplots()
bounds = [.1, .4, .6]
cm = mpl.colors.ListedColormap([(1.0, 0.0, 0.0), (.2, .5, .2)])
norm = mpl.colors.BoundaryNorm(bounds, cm.N)
poly = mcoll.PolyCollection(
vertices,
array=slice_,
edgecolors='black', linewidth=.25, norm=norm)
poly.set_cmap(cm)
fig.colorbar(poly, ax=ax, orientation='vertical')
ax.add_collection(poly, autolim=True)
ax.autoscale_view()
plt.show()