如何使用 matplotlib.pyplot.contourf 绘制密度数组

2024年 2月 13日 63.4k 0

如何使用 matplotlib.pyplot.contourf 绘制密度数组

问题内容

我有一个名为 dens 的 xarray 数据集,我想绘制它。

这是数据集:

dimensions: (time: 641, lat: 30, lon: 30)
coordinates:
* time (time) datetime64[ns] 2013-07-01t12:00:00 ... 2013-08-02t12:00:00
* lon (lon) float64 32.73 32.83 32.94 33.05 ... 35.53 35.64 35.75 35.85
* lat (lat) float64 31.08 31.27 31.47 31.66 ... 36.06 36.25 36.44 36.63
data variables:
density (time, lat, lon) float64 2e+03 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0

登录后复制

我正在使用命令

plt.contourf(dens.density.values[-1,:,:]);

登录后复制

绘制它并且它正在工作,但由于我希望海岸线也绘制在绘图上,所以我也尝试使用

m = basemap(llcrnrlon=data['lon'].min(), llcrnrlat=data['lat'].min(),
urcrnrlon=data['lon'].max(), urcrnrlat=data['lat'].max(), resolution='i', suppress_ticks=1)
m.drawcoastlines();
m.fillcontinents(color='gray',lake_color='gray');

登录后复制

但是当我运行所有命令,然后运行 ​​plt.show() 时,等高线图消失,它向我显示的只是海岸线。

如何解决此问题以获得同一图中的等高线图+海岸线图?

抱歉,如果这是一个愚蠢的问题,但我对 python 还很陌生

感谢您的帮助,

尤塔姆

编辑:我现在才意识到我正在尝试组合两个不同的“工具包”,并且有可能仅使用底图工具包来完成所有这些操作,但只是尝试写

m.contourf(dens.density.values[-1,:,:]);

登录后复制

给我这个错误:

---------------------------------------------------------------------------
typeerror traceback (most recent call last)
cell in[21], line 1
----> 1 m.contourf(dens.density.values[-1,:,:])

typeerror: basemap.contourf() missing 2 required positional arguments: 'y' and 'data'

登录后复制

另一个编辑:我不断发现更多的东西,在阅读了 basemap 的文档后,我意识到命令的语法应该是这样的

m.contourf(dens.lon.values,dens.lat.values,dens.密度.values[-1,:,:]);

但现在我收到此错误:

IndexError: too many indices for array: array is 1-dimensional, but 2 were indexed

登录后复制

我猜这是因为我的密度数组是二维的,但是如何从中提取密度值?我在时间维度中使用 [-1],因为我实际上只需要最后一个时间步

再次提前致谢,
约塔姆

最后编辑

这是最终的情节,我怎样才能让周围的土地变成灰色而不是紫色?另外,有没有一种方法可以描述更大的地理区域,稍微大一点,而不弄乱数据?

这是我的实际数据的新数字

正确答案

使用底图和 xarray 进行绘图已在此处进行了讨论一个>.

m = basemap(llcrnrlon=data['lon'].min(), llcrnrlat=data['lat'].min(),
urcrnrlon=data['lon'].max(), urcrnrlat=data['lat'].max(),
resolution='i', suppress_ticks=1)
m.drawcoastlines();
m.fillcontinents(color='gray',lake_color='gray')
dens.density[-1,:,:].plot.contourf()
plt.show()

登录后复制

上面的代码应该可以工作。
我使用 cartopy 来处理海岸线和边界等功能。下面是可供您尝试使用数据集的工作代码片段。

import xarray as xr
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cf

ds = xr.open_dataset('filename.nc')
fig = plt.figure(figsize=(8,8))
crs=ccrs.platecarree()
ax = fig.add_subplot(1,1,1, projection=crs)
gl = ax.gridlines(crs=crs, draw_labels=true,
linewidth=0.01, color='gray', alpha=0.5, linestyle='-.')

ax.add_feature(cf.coastline.with_scale("50m"), lw=0.5)
ax.add_feature(cf.borders.with_scale("50m"), lw=0.3)

ds.density[-1,:,:].plot.contourf()
plt.show()

登录后复制
最后一次编辑

要将所有紫色(零)设置为白色,您可以使用以下 cmap。

from matplotlib.colors import LinearSegmentedColormap
cm = LinearSegmentedColormap.from_list('', ['white', *plt.cm.Blues(np.arange(255))])
ds.density[-1,:,:].plot.contourf(cmap=cm)

登录后复制

以上就是如何使用 matplotlib.pyplot.contourf 绘制密度数组的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论