如何在 python 中的时间序列上绘制一个点
How to plot a point on a time series in python
我在时间序列中绘制点时遇到问题,因为我无法识别 y 轴值。我有 2 个数据集:一个包含卫星数据(海面温度)的 NetCDF 文件,另一个包含风暴轨迹数据(时间、经度、纬度、风速等)的 CSV 文件。我可以为位于海洋中的所有风暴路径位置绘制所需的温度时间序列。但是,我想在每个时间序列线中指示风暴足迹发生的时间。因此,一条线代表一个位置和随时间变化的温度,但我还想显示暴风雨何时在该位置发生。
到目前为止,这是我的代码(有效):
lati = stormtrack_lat.values
loni = stormtrack_lon.values
for i, dummy in enumerate(lati):
dsloc = SSTskin_file.sel(lon=loni[i], lat=lati[i], method='nearest')
dsloc['analysed_sst'].plot()
#plt.plot(dsloc,stormtrack_time[i], "or") #here I want to add one point to each line indicating the time when the storm occured at this location
plt.title('My title')
plt.xlabel('time')
plt.ylabel('SST skin in K')
netcdf 文件包含时间数据作为日期时间坐标,但我的 CSV 文件包含此数据:
| da | INDEX | SIZE | AREA | x | y | RADIUS | MEANV
2020021018 1505 2934 177.363 -2.82 49.87 1782.18 16.18
2020021100 1505 3812 220.078 5.25 49.57 2811.51 16.17
...
其中 'da' 表示日期和时间 (YYYYMMDDHH)。所以,我想我需要 (1) 将 CSV 'da' 值转换为日期时间格式,以便将它们用于 plt.plot(dsloc,stormtrack_time[i], "or")
行,然后 (2) 在 netcdf 文件中找到这些日期时间值然后 (3) 使用比时间点绘制相应的 SST value/time 点。
问题是我不知道该怎么做。有人可以帮忙吗?
谢谢!
我找到方法了:
lati = stormtrack_lat.values
loni = stormtrack_lon.values
timei = stormtrack_datetime.values
fig2 = plt.figure(figsize=(20, 20), dpi=300)
for i, dummy in enumerate(lati):
dsloc = SSTskin_file.sel(lon=loni[i], lat=lati[i], method='nearest')
dstime = SSTskin_file.sel(time=timei[i], lon=loni[i], lat=lati[i], method='nearest')
skin_celsius = (dsloc['analysed_sst']) - 273.15
timesteps = dsloc.time.values
timestep = dstime.time.values
timevalue = ((dstime['analysed_sst']).values) - 273.15
lineplot = plt.plot(timesteps, skin_celsius )
dotplot = plt.plot(timestep, timevalue, "or")
plt.title('Skin SST over time at storm track locations', fontsize = 20 )
plt.xlabel('Date', fontsize = 16)
plt.ylabel('Skin SST in $^{\circ}C$', fontsize = 16)
plt.xticks(fontsize = 16)
plt.yticks(fontsize = 16)
#plt.legend(lineplot) #Here I would like to plot the legend for the line plots (time series data). I want to indicate the location (longitude and latitude) of the time series
plt.legend(dotplot[:1], ['Storm track at location and time'], fontsize = 16);
fig2.savefig('SSTskin_storm_timeseries_test.png', bbox_inches='tight')
我在时间序列中绘制点时遇到问题,因为我无法识别 y 轴值。我有 2 个数据集:一个包含卫星数据(海面温度)的 NetCDF 文件,另一个包含风暴轨迹数据(时间、经度、纬度、风速等)的 CSV 文件。我可以为位于海洋中的所有风暴路径位置绘制所需的温度时间序列。但是,我想在每个时间序列线中指示风暴足迹发生的时间。因此,一条线代表一个位置和随时间变化的温度,但我还想显示暴风雨何时在该位置发生。
到目前为止,这是我的代码(有效):
lati = stormtrack_lat.values
loni = stormtrack_lon.values
for i, dummy in enumerate(lati):
dsloc = SSTskin_file.sel(lon=loni[i], lat=lati[i], method='nearest')
dsloc['analysed_sst'].plot()
#plt.plot(dsloc,stormtrack_time[i], "or") #here I want to add one point to each line indicating the time when the storm occured at this location
plt.title('My title')
plt.xlabel('time')
plt.ylabel('SST skin in K')
netcdf 文件包含时间数据作为日期时间坐标,但我的 CSV 文件包含此数据:
| da | INDEX | SIZE | AREA | x | y | RADIUS | MEANV
2020021018 1505 2934 177.363 -2.82 49.87 1782.18 16.18
2020021100 1505 3812 220.078 5.25 49.57 2811.51 16.17
...
其中 'da' 表示日期和时间 (YYYYMMDDHH)。所以,我想我需要 (1) 将 CSV 'da' 值转换为日期时间格式,以便将它们用于 plt.plot(dsloc,stormtrack_time[i], "or")
行,然后 (2) 在 netcdf 文件中找到这些日期时间值然后 (3) 使用比时间点绘制相应的 SST value/time 点。
问题是我不知道该怎么做。有人可以帮忙吗?
谢谢!
我找到方法了:
lati = stormtrack_lat.values
loni = stormtrack_lon.values
timei = stormtrack_datetime.values
fig2 = plt.figure(figsize=(20, 20), dpi=300)
for i, dummy in enumerate(lati):
dsloc = SSTskin_file.sel(lon=loni[i], lat=lati[i], method='nearest')
dstime = SSTskin_file.sel(time=timei[i], lon=loni[i], lat=lati[i], method='nearest')
skin_celsius = (dsloc['analysed_sst']) - 273.15
timesteps = dsloc.time.values
timestep = dstime.time.values
timevalue = ((dstime['analysed_sst']).values) - 273.15
lineplot = plt.plot(timesteps, skin_celsius )
dotplot = plt.plot(timestep, timevalue, "or")
plt.title('Skin SST over time at storm track locations', fontsize = 20 )
plt.xlabel('Date', fontsize = 16)
plt.ylabel('Skin SST in $^{\circ}C$', fontsize = 16)
plt.xticks(fontsize = 16)
plt.yticks(fontsize = 16)
#plt.legend(lineplot) #Here I would like to plot the legend for the line plots (time series data). I want to indicate the location (longitude and latitude) of the time series
plt.legend(dotplot[:1], ['Storm track at location and time'], fontsize = 16);
fig2.savefig('SSTskin_storm_timeseries_test.png', bbox_inches='tight')