如何使用未定义的区域制作颜色图?

时间:2016-08-18 14:52:15

标签: python matplotlib

说我有像

这样的功能
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))

The function plot without the excluded domain.

但中心区域为空白而不是深红色。

Center erased

3 个答案:

答案 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))

enter image description here

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))