带底图的空图形
Empty figures with basemap
我正在尝试对潮汐盆地的流动使用模型输出。该模型使用曲线网格。我的第一个任务是绘制最高水层速度的一个分量。我根据名称下的问题编写了一些代码:Matplotlib Streamplot for Unevenly (curvilinear) Grid。
现在据我所知,与前面提到的问题相比,除了数字之外,我没有更改任何重要内容,但数字仍然是空的。我把代码和一些数字放在下面。
import numpy as np
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
Lat = np.array([[ 30.40098833, 30.40103752, 30.40108727, 30.40113704],
[ 30.40140046, 30.40145021, 30.40149997, 30.40154973],
[ 30.40186559, 30.40191478, 30.40196453, 30.4020143 ],
[ 30.40239781, 30.402447, 30.40249676, 30.40254652]])
Lon = np.array([[-86.51729818, -86.51794126, -86.5185871, -86.51923603],
[-86.51725858, -86.51790149, -86.51854717, -86.51919595],
[-86.51721383, -86.51785659, -86.51850228, -86.51915089],
[-86.51716242, -86.51780518, -86.51845087, -86.51909948]])
Xvel = np.array([[ 0.0325774, -0.02811189, -0.04972513, -0.07736091],
[ 0.00592685, -0.00043959, -0.00735147, -0.05015078],
[-0.03365543, -0.03183309, -0.03701356, -0.07232581],
[-0.09578606, -0.10139448, -0.11220678, -0.13221299]])
plt.ion()
fig,(ax1) = plt.subplots(1,1)
m = Basemap(llcrnrlon=Lon.min(),llcrnrlat=Lat.min(),
urcrnrlon=Lon.max(), urcrnrlat=Lat.max(),
projection='merc',resolution='i',ax=ax1)
m.contourf(Lat,Lon,Xvel,latlon=True)
m.drawcoastlines()
m.drawrivers()
m.plot(Lat,Lon,'-k',alpha=0.3,latlon=True)
m.plot(Lat.T,Lon.T,'-k',alpha=0.3,latlon=True)
谁能告诉我是什么导致地块保持空白?
我还有一个关于底图使用的问题:我的数据表也包含很多 NaN(没有信息的网格点)。我想知道如何让 Basemap 知道我只是没有关于这些位置的任何信息并且我不想在那里进行任何绘图。在当前代码中,它会导致 'Points of LinearRing do not form a closed linestring' 错误。
关于你问题的第二部分(因为 Ajean 似乎已经解决了前半部分),告诉 Matplotlib(以及 Basemap)不绘制数据的标准方法是创建一个屏蔽数组。假设你的 Xvel 包含 NaN,那么你可以绘制它
import numpy.ma as ma
m.contourf(Lon, Lat, ma.masked_invalid(Xvel), latlon=True)
函数 ma.masked_invalid,顾名思义,会屏蔽所有无效(即 NaN)值,因此不会绘制它们。
我正在尝试对潮汐盆地的流动使用模型输出。该模型使用曲线网格。我的第一个任务是绘制最高水层速度的一个分量。我根据名称下的问题编写了一些代码:Matplotlib Streamplot for Unevenly (curvilinear) Grid。
现在据我所知,与前面提到的问题相比,除了数字之外,我没有更改任何重要内容,但数字仍然是空的。我把代码和一些数字放在下面。
import numpy as np
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
Lat = np.array([[ 30.40098833, 30.40103752, 30.40108727, 30.40113704],
[ 30.40140046, 30.40145021, 30.40149997, 30.40154973],
[ 30.40186559, 30.40191478, 30.40196453, 30.4020143 ],
[ 30.40239781, 30.402447, 30.40249676, 30.40254652]])
Lon = np.array([[-86.51729818, -86.51794126, -86.5185871, -86.51923603],
[-86.51725858, -86.51790149, -86.51854717, -86.51919595],
[-86.51721383, -86.51785659, -86.51850228, -86.51915089],
[-86.51716242, -86.51780518, -86.51845087, -86.51909948]])
Xvel = np.array([[ 0.0325774, -0.02811189, -0.04972513, -0.07736091],
[ 0.00592685, -0.00043959, -0.00735147, -0.05015078],
[-0.03365543, -0.03183309, -0.03701356, -0.07232581],
[-0.09578606, -0.10139448, -0.11220678, -0.13221299]])
plt.ion()
fig,(ax1) = plt.subplots(1,1)
m = Basemap(llcrnrlon=Lon.min(),llcrnrlat=Lat.min(),
urcrnrlon=Lon.max(), urcrnrlat=Lat.max(),
projection='merc',resolution='i',ax=ax1)
m.contourf(Lat,Lon,Xvel,latlon=True)
m.drawcoastlines()
m.drawrivers()
m.plot(Lat,Lon,'-k',alpha=0.3,latlon=True)
m.plot(Lat.T,Lon.T,'-k',alpha=0.3,latlon=True)
谁能告诉我是什么导致地块保持空白?
我还有一个关于底图使用的问题:我的数据表也包含很多 NaN(没有信息的网格点)。我想知道如何让 Basemap 知道我只是没有关于这些位置的任何信息并且我不想在那里进行任何绘图。在当前代码中,它会导致 'Points of LinearRing do not form a closed linestring' 错误。
关于你问题的第二部分(因为 Ajean 似乎已经解决了前半部分),告诉 Matplotlib(以及 Basemap)不绘制数据的标准方法是创建一个屏蔽数组。假设你的 Xvel 包含 NaN,那么你可以绘制它
import numpy.ma as ma
m.contourf(Lon, Lat, ma.masked_invalid(Xvel), latlon=True)
函数 ma.masked_invalid,顾名思义,会屏蔽所有无效(即 NaN)值,因此不会绘制它们。