英文:
Interpolating grid with NaN values for plotting with contour
问题
我有一个表格,是从一个更大的数据集中创建的,它给我提供了我想要绘制的 y、x 和 z 值。我创建了一个网格,然后对这些值进行插值,但我认为沿着行的插值函数并没有正确进行,因为在图中可以看到在纬度 78-80 附近有数据断裂点(参见图像),这让我认为沿着行的插值没有正确执行。是否有人有关于如何平滑这些数据的提示?
aou_df = df_1994.pivot_table(index='CTDPRS', columns='LATITUDE', values='AOU')
aou_df = aou_df.interpolate(method='linear', limit_area='inside', axis=0)
##绘制 AOU 1994
y = ([4.2, 4.7, 4.8, 4.9, 5.4, 9.1, 9.6, 9.7, 10.0, 10.1, ... 4287.3],
x = [72.13, 73.0, 73.49, 73.98, 74.5, 75.0, 75.45, 75.75, 75.94, 76.62, ... 90.0],
z = [[-12.29372749, nan, nan, ..., nan, nan, nan],
[nan, nan, -43.41465869, ..., nan, nan, nan],
[nan, -54.49999783, nan, ..., nan, nan, nan],
...,
[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, 55.87256821, nan],
[nan, nan, nan, ..., 55.39665852, nan, 55.05005376]])
xi, yi = np.meshgrid(x, y, indexing='ij')
# from matplotlib.colors import LogNorm
plt.figure(figsize=(25, 10))
levels = np.linspace(-135, 135)
# cbar = plt.colorbar(ticks=(-85, -65, -45, -25, -5, 15, 35, 55, 75, 95, 115, 135))
plt.contourf(xi, yi, z, cmap='jet', levels=levels, vmin=-135, vmax=135)
plt.gca().invert_yaxis()
plt.gca().invert_xaxis()
cbar = plt.colorbar(ticks=(-135, -110, -85, -60, -35, 0, 35, 60, 85, 110, 135), extend='both')
cbar.set_label('AOU', fontsize=18)
cbar.ax.tick_params(labelsize=18)
plt.xlabel('LAT', fontsize=18)
plt.ylabel('Pressure (dbar)', fontsize=18)
plt.ylim(bottom=1000)
plt.xticks(fontsize=18)
plt.yticks(fontsize=18)
plt.plot(x, range(len(x)), 'gD', clip_on=False, markersize=10)
# plt.xlim(left=80)
英文:
I have a table I create from a larger dataset which gives me the y, x, and z values that I want to plot. I create a grid and then interpolate the values, but I don't think the function interpolation along the rows correctly since I can see data as break-up points around Latitude 78-80 in the plot (see image), this makes me think that the interpolation is not been done correctly along the rows. Does anyone have a tip on how to smooth this data?
aou_df = df_1994.pivot_table(index='CTDPRS', columns = 'LATITUDE', values='AOU')
aou_df = aou_df.interpolate(method='linear', limit_area='inside', axis =0 )
##Plotting AOU 1994
y = ([ 4.2, 4.7, 4.8, 4.9, 5.4, 9.1, 9.6, 9.7,
10.0, 10.1,
...
3568.2, 3608.6, 3818.6, 3824.9, 3866.7, 3979.1, 4013.4, 4133.1,
4159.3, 4287.3],
x= ([72.13, 73.0, 73.49, 73.98, 74.5, 75.0, 75.45, 75.75, 75.94,
76.62, 77.33, 77.78, 78.14, 78.15, 78.98, 79.98, 80.15, 80.16,
80.33, 80.71, 81.24, 81.58, 82.47, 83.17, 84.06, 84.85, 85.89,
87.16, 88.06, 88.79, 88.86, 88.95, 89.02, 90.0],
z = [[-12.29372749, nan, nan, ..., nan,
nan, nan],
[ nan, nan, -43.41465869, ..., nan,
nan, nan],
[ nan, -54.49999783, nan, ..., nan,
nan, nan],
...,
[ nan, nan, nan, ..., nan,
nan, nan],
[ nan, nan, nan, ..., nan,
55.87256821, nan],
[ nan, nan, nan, ..., 55.39665852,
nan, 55.05005376]])
xi, yi = np.meshgrid(x,y,indexing='ij')
#from matplotlib.colors import LogNorm
plt.figure(figsize=(25,10))
levels = np.linspace(-135,135)
#cbar = plt.colorbar(ticks=(-85,-65,-45,-25,-5,15,35,55,75,95, 115,135))
plt.contourf(xi,yi,z, cmap = 'jet', levels=levels,vmin=-135, vmax=135)
plt.gca().invert_yaxis()
plt.gca().invert_xaxis()
cbar = plt.colorbar(ticks=(-135,-110,-85,-60,-35,0,35,60,85,110,135), extend= 'both')
cbar.set_label('AOU', fontsize=18)
cbar.ax.tick_params(labelsize=18)
plt.xlabel('LAT',fontsize=18)
plt.ylabel('Pressure (dbar)' ,fontsize=18)
plt.ylim(bottom = 1000)
plt.xticks(fontsize=18)
plt.yticks(fontsize=18)
plt.plot(x,range(len(x)),'gD', clip_on=False, markersize=10)
#plt.xlim(left = 80)
答案1
得分: 1
好的,值在一个表格中...抱歉...我更新了代码...尝试运行...
尝试这样做... 你可以传递 method='Linear'
和 method='Cubic'
到 griddata
from scipy.interpolate import griddata
### 获取有效数据
xdata, ydata = np.meshgrid(x, y)
not_nan = ~np.isnan(xdata) & ~np.isnan(ydata) & ~np.isnan(z)
i, j = np.argwhere(not_nan).T
xval = xdata[i, j]
yval = ydata[i, j]
zval = z[i, j]
xy = np.column_stack((xval, yval))
### 网格
nx_mesh = 100
ny_mesh = 100
xi, yi = np.meshgrid(np.linspace(xval.min(), xval.max(), nx_mesh),
np.linspace(yval.min(), yval.max(), ny_mesh))
### 插值
zi = griddata(xy, zval, (xi, yi), method='nearest')
### 将 xi, yi 和 zi 传递给等高线图....
编辑:这是使用 method='nearest'
的 Joao 代码的结果:
英文:
Ok, the values are in a table... I'm sorry... I updated the code... Try to run...
Try this... You can to pass method='Linear'
and method='Cubic'
to griddata
from scipy.interpolate import griddata
### getting the valid data
xdata, ydata = np.meshgrid(x, y)
not_nan = ~np.isnan(xdata) & ~np.isnan(ydata) & ~np.isnan(z)
i, j = np.argwhere(not_nan).T
xval = xdata[i, j]
yval = ydata[i, j]
zval = z[i, j]
xy = np.column_stack((xval, yval))
### mesh
nx_mesh = 100
ny_mesh = 100
xi, yi = np.meshgrid(np.linspace(xval.min(), xval.max(), nx_mesh),
np.linspace(yval.min(), yval.max(), ny_mesh))
### interpolation
zi = griddata(xy, zval, (xi, yi), method='nearest')
### Pass xi, yi and zi to contour....
EDIT: This is the result from Joao's code using method='nearest'
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论