pyplot contourf 不填“0”级
Pyplot contourf don't fill in "0" level
我正在绘制天气模型输出的降水数据。我正在使用 contourf 绘制我拥有的数据轮廓。但是,我不希望它用颜色填充“0”级别(仅值 >0)。有没有好的方法来做到这一点?我试过搞乱关卡。
这是我用来绘制的代码:
m = Basemap(projection='stere', lon_0=centlon, lat_0=centlat,
lat_ts=centlat, width=width, height=height)
m.drawcoastlines()
m.drawstates()
m.drawcountries()
parallels = np.arange(0., 90, 10.)
m.drawparallels(parallels, labels=[1, 0, 0, 0], fontsize=10)
meridians = np.arange(180., 360, 10.)
m.drawmeridians(meridians, labels=[0, 0, 0, 1], fontsize=10)
lons, lats = m.makegrid(nx, ny)
x, y = m(lons, lats)
cs = m.contourf(x, y, snowfall)
cbar = plt.colorbar(cs)
cbar.ax.set_ylabel("Accumulated Snow (km/m^2)")
plt.show()
这是我得到的图像。
示例降雪数据集如下所示:
0 0 0 0 0 0
0 0 1 1 1 0
0 1 2 2 1 0
0 2 3 2 1 0
0 1 0 1 2 0
0 0 0 0 0 0
我能够自己解决问题,我发现有两种方法可以解决这个问题。
使用
屏蔽掉数据集中<0.01的所有数据
np.ma.masked_less(snowfall, 0.01)
或
将绘图的级别设置为从 0.01 -> 任何最大值
levels = np.linspace(0.1, 10, 100)
然后
cs = m.contourf(x, y, snowfall, levels)
我发现选项 1 最适合我。
如果您不在 levels
中包含 0
,您将不会在 0 级绘制等高线。
例如:
import numpy as np
import matplotlib.pyplot as plt
a = np.array([
[0, 0, 0, 0, 0, 0],
[0, 0, 1, 1, 1, 0],
[0, 1, 2, 2, 1, 0],
[0, 2, 3, 2, 1, 0],
[0, 1, 0, 1, 2, 0],
[0, 0, 0, 0, 0, 0]
])
fig, ax = plt.subplots(1)
p = ax.contourf(a, levels=np.linspace(0.5, 3.0, 11))
fig.colorbar(p)
plt.show()
产量:
另一种方法是屏蔽任何 0:
的数据点
p = ax.contourf(np.ma.masked_array(a, mask=(a==0)),
levels=np.linspace(0.0, 3.0, 13))
fig.colorbar(p)
看起来像:
我想这取决于你哪一个最符合你想要的情节。
这也可以使用 'locator' 和 ticker 子类中的 MaxNLocator('prune = 'lower') 来实现。参见 docs。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
a = np.array([
[0, 0, 0, 0, 0, 0],
[0, 0, 1, 1, 1, 0],
[0, 1, 2, 2, 1, 0],
[0, 2, 3, 2, 1, 0],
[0, 1, 0, 1, 2, 0],
[0, 0, 0, 0, 0, 0]
])
fig, ax = plt.subplots(1)
p = ax.contourf(a, locator = ticker.MaxNLocator(prune = 'lower'))
fig.colorbar(p)
plt.show()
Image of output
'nbins'参数可以用来控制区间数(levels)
p = ax.contourf(a, locator = ticker.MaxNLocator(prune = 'lower'), nbins = 5)
我正在绘制天气模型输出的降水数据。我正在使用 contourf 绘制我拥有的数据轮廓。但是,我不希望它用颜色填充“0”级别(仅值 >0)。有没有好的方法来做到这一点?我试过搞乱关卡。
这是我用来绘制的代码:
m = Basemap(projection='stere', lon_0=centlon, lat_0=centlat,
lat_ts=centlat, width=width, height=height)
m.drawcoastlines()
m.drawstates()
m.drawcountries()
parallels = np.arange(0., 90, 10.)
m.drawparallels(parallels, labels=[1, 0, 0, 0], fontsize=10)
meridians = np.arange(180., 360, 10.)
m.drawmeridians(meridians, labels=[0, 0, 0, 1], fontsize=10)
lons, lats = m.makegrid(nx, ny)
x, y = m(lons, lats)
cs = m.contourf(x, y, snowfall)
cbar = plt.colorbar(cs)
cbar.ax.set_ylabel("Accumulated Snow (km/m^2)")
plt.show()
这是我得到的图像。
示例降雪数据集如下所示:
0 0 0 0 0 0
0 0 1 1 1 0
0 1 2 2 1 0
0 2 3 2 1 0
0 1 0 1 2 0
0 0 0 0 0 0
我能够自己解决问题,我发现有两种方法可以解决这个问题。
使用
屏蔽掉数据集中<0.01的所有数据np.ma.masked_less(snowfall, 0.01)
或
将绘图的级别设置为从 0.01 -> 任何最大值
levels = np.linspace(0.1, 10, 100)
然后
cs = m.contourf(x, y, snowfall, levels)
我发现选项 1 最适合我。
如果您不在 levels
中包含 0
,您将不会在 0 级绘制等高线。
例如:
import numpy as np
import matplotlib.pyplot as plt
a = np.array([
[0, 0, 0, 0, 0, 0],
[0, 0, 1, 1, 1, 0],
[0, 1, 2, 2, 1, 0],
[0, 2, 3, 2, 1, 0],
[0, 1, 0, 1, 2, 0],
[0, 0, 0, 0, 0, 0]
])
fig, ax = plt.subplots(1)
p = ax.contourf(a, levels=np.linspace(0.5, 3.0, 11))
fig.colorbar(p)
plt.show()
产量:
另一种方法是屏蔽任何 0:
的数据点p = ax.contourf(np.ma.masked_array(a, mask=(a==0)),
levels=np.linspace(0.0, 3.0, 13))
fig.colorbar(p)
看起来像:
我想这取决于你哪一个最符合你想要的情节。
这也可以使用 'locator' 和 ticker 子类中的 MaxNLocator('prune = 'lower') 来实现。参见 docs。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
a = np.array([
[0, 0, 0, 0, 0, 0],
[0, 0, 1, 1, 1, 0],
[0, 1, 2, 2, 1, 0],
[0, 2, 3, 2, 1, 0],
[0, 1, 0, 1, 2, 0],
[0, 0, 0, 0, 0, 0]
])
fig, ax = plt.subplots(1)
p = ax.contourf(a, locator = ticker.MaxNLocator(prune = 'lower'))
fig.colorbar(p)
plt.show()
Image of output
'nbins'参数可以用来控制区间数(levels)
p = ax.contourf(a, locator = ticker.MaxNLocator(prune = 'lower'), nbins = 5)