如何从 Python Xarray 数据集(例如雨量数据轴)绘制条形图?
\n\n我已经在使用此代码来调整绘图大小
\n\nfig, ax = plt.subplots(figsize=(9, 9)) #redimensionamento do gr\xc3\xa1fico\ndsfanadia.rain.plot(ax=ax)\nRun Code Online (Sandbox Code Playgroud)\n 
我正在使用一个名为 PySD 的包进行系统动力学建模。PySD 将模型从 Vensim(系统动力学建模包)转换为 Python,并允许用户用比 Vensim 更复杂的例程替换各种方程。我正在运行一个具有各种下标的模型,这会创建一种不寻常的输出格式。输出被读入数据帧,其下标元素的各个值最终为 xarray.DataArrays。我想知道如何获取 xarray.DataArrays 的列(最终成为一个系列)并将其转换为二维数组,第二个维度是下标的数量。
import pysd
import numpy as np
model=pysd.load("Example.py")
stocks=model.run
pop=np.array(Population) #Creates an object array
Population=stocks.Populaton #Creates a series
#How to get an array of population values for each country?
Run Code Online (Sandbox Code Playgroud)
example.py代码如下(请记住这是一个任意示例来说明问题)
from __future__ import division
import numpy as np
from pysd import utils
import xarray as xr
from pysd.functions import cache
from pysd import functions
_subscript_dict = {
'Country': ['Canada', 'USA', 'China', 'Norway', 'India', 'England',
'Mexico', 'Yemen']
}
_namespace = { …Run Code Online (Sandbox Code Playgroud) 我正在尝试通过使用 Xarrays 的高级绘图功能制作共享颜色条来微调我的子图。目前我的情节看起来
我想制作一个通用的颜色条并修复 yaxis,以便只有第一个子图 y 轴有刻度和标签。我用来绘制它的代码如下所示:
fig, (ax1, ax2) = plt.subplots(ncols=2, sharey=True, figsize=(14,10))
Var1_monthly_clim_N.plot(ax=ax1,vmin=6, vmax=14, cmap='jet');
Var2_monthly_clim_S.plot(ax=ax2, vmin=6, vmax=14, cmap='jet', yticks=[]);
## why is yticks removing ticks from both axis
## Var1 and Var 2 have similiar dimensions
Var1
>><xarray.DataArray 'R_metric' (month: 12, lat: 1, lon: 720)>
array([[[ 9.899495, 9.942897, ..., 9.814826, 9.856807]],
[[ 9.578215, 9.610594, ..., 9.514423, 9.546191]],
...,
[[11.974784, 12.019565, ..., 11.886591, 11.930419]],
[[10.237672, 10.285891, ..., 10.142638, 10.189836]]])
Coordinates:
* lon (lon) float32 -180.0 -179.5 -179.0 -178.5 …Run Code Online (Sandbox Code Playgroud) 我有 1 个 2007 年 9 月的 NetCDF 文件。它包含某些纬度/经度的 6 小时数据以及风和湿度变量。每个变量的形状为(120, 45, 93):120 次(每天 4 次),45 个纬度和 93 个经度。使用以下代码,我可以获得所有变量的每日平均数据。现在,每个变量的形状都是(30, 45, 93)。时间是一个整数,单位为'hours since 1900-01-01 00:00:00.0'。
从这个每日平均数据中,如何将每天分成 30 个不同的 NetCDF 文件,文件名包含YYYY:MM:DD时间格式?
import xarray as xr
monthly_data = xr.open_dataset('interim_2007-09-01to2007-09-31.nc')
daily_data = monthly_data.resample(time='1D').mean()
Run Code Online (Sandbox Code Playgroud) 对于我的数据数组,我有坐标经度、纬度和时间。我只想沿纬度反转数组,以便[90, 85, ..., -85, -90]变为[-90, -80, ..., 85, 90].
我在 python 中有一个 numpy 数组,大小 (16,250,186) 表示时间、纬度和经度。
我想将其转换为 netCDF 文件,以便将来可以使用坐标轻松读取数据。
我的 numpy 数组看起来像这样
RZS = np.load("/home/chandra/Data/rootzone_CHIRPS_era5_2003-2015_daily-analysis_annual-result.npy")
RZS.shape
Output: (16, 250, 186)
Run Code Online (Sandbox Code Playgroud)
如您所见,我上面的 numpy 数组表示 16 年的年度值。
chirps_precip =xarray.open_mfdataset("/home/chandra/Data/CHIRPS/chirps-v2.0.2000.days_p25.nc")
precip = chirps_precip.precip.sel(latitude = slice(-50,12.5), longitude = slice(-81.25,-34.75))
precip[0,:,:]
Output:
<xarray.DataArray 'precip' (latitude: 250, longitude: 186)>
dask.array<shape=(250, 186), dtype=float32, chunksize=(250, 186)>
Coordinates:
* latitude (latitude) float32 -49.875 -49.625 -49.375 ... 12.125 12.375
* longitude (longitude) float32 -81.125 -80.875 -80.625 ... -35.125 -34.875
time datetime64[ns] 2000-01-01
Attributes:
units: mm/day
standard_name: convective precipitation rate …Run Code Online (Sandbox Code Playgroud) 假设我有以下内容 DataArray
arr = xarrray.DataArray(np.arange(6).reshape(2,3),
dims=['A', 'B'],
coords=dict(A=['a0', 'a1'],
B=['b0', 'b1', 'b2']))
Run Code Online (Sandbox Code Playgroud)
我想迭代第一个维度并执行以下操作(当然我想做比打印更复杂的事情)
for coor in arr.A.values:
print(coor, arr.sel(A=coor).values)
Run Code Online (Sandbox Code Playgroud)
并得到
a0 [0 1 2]
a1 [3 4 5]
Run Code Online (Sandbox Code Playgroud)
我是新手xarray,所以我想知道是否有一些更自然的方法来实现这一点,比如
for coor, sub_arr in arr.some_method():
print(coor, sub_arr)
Run Code Online (Sandbox Code Playgroud) 我有一个交换纬度和经度位置的 NetCDF 文件。
我通常使用的 Netcdf 的标准方式定义如下:
<xarray.DataArray 'pev' (time: 365, latitude: 480, longitude: 1440)>
Coordinates:
* time (time) datetime64[ns] 2001-01-01T11:30:00 ... 2001-12-31T11:30:00
* longitude (longitude) float32 0.0 0.25 0.5 0.75 ... 359.25 359.5 359.75
* latitude (latitude) float32 59.75 59.5 59.25 59.0 ... -59.5 -59.75 -60.0
Run Code Online (Sandbox Code Playgroud)
但是我正在处理的 NetCDF 的规格如下:
<xarray.DataArray 'ETa' (time: 12, longitude: 720, latitude: 360)>
Coordinates:
* latitude (latitude) float64 89.75 89.25 88.75 ... -88.75 -89.25 -89.75
* longitude (longitude) float64 -179.8 -179.2 -178.8 ... 178.8 179.2 179.8 …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 xarray 在数据集中的所有坐标对(即像素)apply_ufunc上应用给定函数f。
该函数f返回一个二维数组(NxN 矩阵)作为结果。因此,分析后得到的 Dataset 会有几个新变量:总共是M新变量。
该功能f确实工作得很好。所以,错误似乎不是来自它。
一个可能的问题可能是 2D 数组从 返回的结构f。据我了解,xarray.apply_ufunc要求结果数组以元组结构。所以,我什至尝试将二维数组转换为数组元组,但到目前为止没有任何效果。
这种情况可以在其他地方的其他作品被选中的作品也是如此。在本链接中,作者必须在原始数据集上运行两次相同的线性回归拟合函数,以便从回归中检索所有参数(beta_0 和 alpha)。
因此,我想知道,是否xarray.apply_ufunc能够像上面的链接(或下面的代码片段)中那样操作归约函数,该函数返回多个新变量。
下面我展示了一个涉及所讨论问题的可重现代码。请注意,该函数f返回一个二维数组。第二维的深度是4。因此,我希望在整个处理后得到一个带有4个新变量的结果数据集。
import numpy as np
import xarray as xr
x_size = 10
y_size = 10
time_size = 30
lon = np.arange(50, 50+x_size)
lat = np.arange(10, 10+y_size)
time = np.arange(10, 10+time_size)
array = np.random.randn(y_size, x_size, time_size)
ds = xr.DataArray(
data=array,
coords = {'lon':lon, 'lat':lat, 'time':time}, …Run Code Online (Sandbox Code Playgroud) 我开始用网格数据开始我的旅程,我一直在尝试从带有 cartopy 的 netcdf 文件中绘制一些温度数据。我遵循了一些例子,我不明白为什么我的情节在中间有一条白线。(我已经检查了数据,矩阵中充满了数字,没有 NaN)
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
import numpy as np
import xarray as xr
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatterimport glob
data = xr.open_dataset('aux1.nc')
lat = data.lat
lon = data.lon
time = data.time
Temp = data.air
#Calculo la temperatura media anual
Tanual = Temp.resample(time="y").mean()
#Promedio de todos los meses
Tprom = Temp.mean(dim="time").values
#Grafico
fig = plt.figure(figsize=(10, 4))
ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())
ax.coastlines()
ax.set_global()
ct = ax.contourf(lon,lat,Tprom,transform=ccrs.PlateCarree(),cmap="bwr")
ax.gridlines()
cb = plt.colorbar(ct,orientation="vertical",extendrect='True')
cb.set_label("Temperatura …Run Code Online (Sandbox Code Playgroud) python-xarray ×10
python ×7
netcdf ×2
netcdf4 ×2
plot ×2
cartopy ×1
coordinates ×1
dataset ×1
matplotlib ×1
numpy ×1
python-3.x ×1