matplotlib 当使用python从netcdf文件中绘制等值线图时,如何在轴中显示实际值而不是索引?

bogh5gae  于 2022-11-15  发布在  Python
关注(0)|答案(1)|浏览(102)

我正在探索用python从netcdf文件(可以在这里访问:https://drive.google.com/file/d/1zGpDK35WmCv62gNEI8H_ONHS2V_L9JEb/view?usp=sharing)。该文件包含了每隔1小时的各种气象变量。我正在尝试绘制风的时间-高度图(在netcdf文件中显示为“u”)。以下是u的详细信息:

<class 'netCDF4._netCDF4.Variable'>
float32 u(time, height)
standard_name: eastward_wind
units: m s-1
_FillValue: -99999.0
missing_value: -99999.0
unlimited dimensions: time
current shape = (945, 30)
filling on

如你所见,它是时间和高度的函数。我试着做一个等值线图,如下所示:
expected plot
这是我为同样的人写的代码:

import numpy as np
import xarray as xr
import matplotlib.pyplot as plt
import netCDF4
from netCDF4 import num2date, date2num, date2index, Dataset

f = netCDF4.Dataset("Wangara_1hourly_data.nc")
u = f.variables["u"]
t = f.variables["time"]
h = f.variables["height"]

time = t[:]
height = h[:]

timedim = u.dimensions[0]
times = f.variables[timedim]
# print('units = %s, values = %s' %(times.units, times[:]))
dates = num2date(times[:], times.units)
print([date.strftime('%Y-%m-%d %H:%M:%S') for date in dates[677:702]])

# plt.rcParams["figure.figsize"] = (12.0, 8.0)

fig = plt.figure( figsize= (10,6))

plt.subplot(1,1,1)
contours = plt.contour(u[677:702, :].T)
plt.clabel(contours, inline=True, fontsize=10)
plt.title(u.standard_name + " (" + u.units + ")")
plt.xlabel(t.standard_name    + ' (' + t.units    + ')')
plt.ylabel(h.standard_name    + ' (' + h.units    + ')')

Plotted figure using the code
正如您所看到的,只打印了指数,而不是实际值。我想知道如何显示实际值(以及以3小时为间隔)以及如何在X轴上显示小时值,以便准确地再现预期的曲线图。有人能帮助我吗?
我使用Spyder5.1.5编写和绘制代码,它使用从Anaconda获得的Python3.9。

ruoxqz4g

ruoxqz4g1#

你应该把时间作为x,高度作为y给轮廓法,而不是自己去砍标签。
下面是一个可能的解决方案:

import numpy as np
import xarray as xr
import matplotlib.pyplot as plt
import netCDF4
from netCDF4 import num2date, date2num, date2index, Dataset
# ------------------------------------------------------------
f = netCDF4.Dataset("Wangara_1hourly_data.nc")
u = f.variables["u"]
t = f.variables["time"]
h = f.variables["height"]

time = t[:]
height = h[:]

timedim = u.dimensions[0]
times = f.variables[timedim]
# print('units = %s, values = %s' %(times.units, times[:]))
dates = num2date(times[:], times.units, only_use_cftime_datetimes=False, only_use_python_datetimes=True)
# ----------------------------------------------------------
fig = plt.figure( figsize= (10,6));ax = fig.add_subplot(111);
contours = ax.contour(dates[677:702],height,u[677:702, :].T)
plt.clabel(contours, inline=True, fontsize=10)
plt.title(u.standard_name + " (" + u.units + ")")
plt.ylabel(h.standard_name    + ' (' + h.units    + ')')
plt.show()

请注意,我为num2date提供了额外的值,以便以datetime对象的形式获取日期(在我的示例中,matplotlib不支持cftime对象)。
结果与您的预期接近:

相关问题