说我有像
这样的功能def coulomb(x,y):
r = sqrt(x**2 + y**2)
return 1/r if r > 1 else None
我怎样才能在彩色图中最好地绘制它,这样每个None
值都可以简单地呈现为白色,只有分配给色标的实际数值?像,
fig = plt.figure()
xs, ys = meshgrid(linspace(-5, 5, n), linspace(-5, 5, n))
vs = 1/sqrt(xs**2 + ys**2)
ax = fig.add_subplot(1, 1, 1, aspect='equal')
fig.colorbar(ax.pcolor(xs,ys,vs, vmin=0, vmax=1))
但中心区域为空白而不是深红色。
答案 0 :(得分:4)
只使用蒙面数组:
from numpy import ma
vs_ma = ma.masked_where(vs > 1, vs)
plt.colorbar(plt.pcolor(xs, ys, vs_ma, vmin=0, vmax=1))
matplotlib有一个更复杂的示例image_masked.py,您可以在其中选择蒙版区域的颜色。要在普通数组和屏蔽数组之间进行转换,您可以使用numpy.ma.masked_*函数之一
答案 1 :(得分:1)
有趣。我没有一些我真的很满意的东西,但它有点有用。
首先,您没有使用coulomb
来生成nans:
vs = np.vectorize(coulomb)(xs, ys)
好的,然后我取非纳米值的最小值,并为纳米值指定一个低于最小值的值:
vs[np.isnan(vs)] = np.min(vs[~np.isnan(vs)]) - 1
使用除了defult之外的cmap,就像'hot'一样,确实显示了中间的洞。
答案 2 :(得分:1)
我将Tim Fuchs'和Israel Unterman's个建议合并到一个实际使用某个函数并正确掩盖None
值的人:
from numpy import *
import matplotlib.pyplot as plt
n = 100
fig = plt.figure()
xs, ys = meshgrid(linspace(-5, 5, n), linspace(-5, 5, n))
vs = vectorize(coulomb) (xs, ys)
vs = ma.masked_where(isnan(vs), vs)
ax = fig.add_subplot(1, 1, 1, aspect='equal')
fig.colorbar(ax.pcolor(xs,ys,vs, vmin=0, vmax=1))