xnx*_*xnx 5 python numpy matplotlib
我试图将一维数组绘制为pcolormesh(因此颜色沿x轴变化,但对于每个x在y轴上是恒定的).但是我的数据有一些不好的值,所以我使用了一个蒙版数组和一个自定义颜色图,其掩码值设置为蓝色:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import copy
a = np.array([3, 5, 10, np.inf, 5, 8])
a = np.ma.masked_where(np.isinf(a), a)
imdata = np.vstack((a, a))
myhot = copy.copy(cm.hot)
myhot.set_bad('b', 1)
fig, ax = plt.subplots()
im = ax.pcolormesh(imdata, cmap=myhot)
plt.colorbar(im)
plt.show()
Run Code Online (Sandbox Code Playgroud)
如果我没有np.inf价值,它的工作正常,但如果我这样做,我只会得到一个空白的情节.我似乎误解了一些有效的方法,set_bad因为我得到了一个额外的警告:
RuntimeWarning: invalid value encountered in true_divide
resdat /= (vmax - vmin)
Run Code Online (Sandbox Code Playgroud)
我应该怎么做才能得到我想要的效果?
unu*_*tbu 10
你需要掩饰imdata,不一定a:
import numpy as np
import matplotlib.pyplot as plt
a = np.array([3, 5, 10, np.inf, 5, 8])
imdata = np.ma.masked_invalid(np.atleast_2d(a))
cmap = plt.cm.hot
cmap.set_bad('b', 1)
fig, ax = plt.subplots()
im = ax.pcolormesh(imdata, cmap=cmap)
plt.colorbar(im)
plt.show()
Run Code Online (Sandbox Code Playgroud)

如果你imdata在交互式会话中查看,你会看到
In [185]: imdata
Out[185]:
masked_array(data =
[[ 3. 5. 10. inf 5. 8.]
[ 3. 5. 10. inf 5. 8.]],
mask =
False,
fill_value = 1e+20)
Run Code Online (Sandbox Code Playgroud)
在上面,mask=False意味着没有任何掩盖.如果你用那包裹它np.ma.masked_invalid:
In [186]: np.ma.masked_invalid(imdata)
Out[186]:
masked_array(data =
[[3.0 5.0 10.0 -- 5.0 8.0]
[3.0 5.0 10.0 -- 5.0 8.0]],
mask =
[[False False False True False False]
[False False False True False False]],
fill_value = 1e+20)
Run Code Online (Sandbox Code Playgroud)
掩蔽的问题a是np.vstack不尊重掩模.或者,您可以使用np.ma.vstack.一般来说,只有np.ma命名空间中的函数才会尊重掩码.
但是,你实际上并不需要在vstack这里使用; np.atleast_2d会做.
vstack创建一个形状数组(2, N),同时np.atleast_2d创建一个形状数组(1, N).
另一种选择是使用set_over而不是set_bad.这样可以避免完全需要掩码数组:
import numpy as np
import matplotlib.pyplot as plt
a = np.array([3, 5, 10, np.inf, 5, 8])
imdata = np.atleast_2d(a)
cmap = plt.cm.hot
cmap.set_over('b')
cmap.set_under('g')
fig, ax = plt.subplots()
b = a[np.isfinite(a)]
im = ax.pcolormesh(imdata, cmap=cmap, vmin=b.min(), vmax=b.max())
plt.colorbar(im, extend='both')
plt.show()
Run Code Online (Sandbox Code Playgroud)

在extend='both'会同set_over和set_under给你这表明用于超出了彩条的范围值的颜色的彩条小彩色箭头.
| 归档时间: |
|
| 查看次数: |
4022 次 |
| 最近记录: |