Python 三列数据绘制等高线图

我现在有个EXCEL表格,里面X,Y,Z 一共三列数据
我想利用这三列数据 绘制一个平面的 等高线填色图,我首先将X,Y,Z转化成pd.pivot_table透视表形式的网格然后画图,但是总是提示多了一行一列不知道什么情况

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl
df1=pd.read_excel(读取文件的)
#usecols 读取指定列数据

x = df1[['x']].drop_duplicates()
y = df1[['y']].drop_duplicates()
X,Y = np.meshgrid(x.values,y.values)#将原始数据变成网格数据形式
print(X)
print(Y)

df2 = pd.pivot_table(df1,index='y', columns='x', values='abs_mag_pykrige').values
print(df2)
CS = plt.contourf(Y,X,df2,linewidth=2,cmap=mpl.cm.jet)#色带型:mp.coutourf(x, y, z, 线的数量, cmap=颜色映射)
plt.colorbar(CS)
plt.show()
#提示是:TypeError: Shape of x does not match that of z: found (122, 137) instead of (121, 136).

该回答引用ChatGPT

这个错误提示是因为X和Y中的值数量和df2不一致,导致绘制等高线填色图失败。可能是因为在对X和Y进行网格化时出现了一些错误,多了一行一列。

你可以尝试将 X 和 Y 的长度减 1,然后重新进行网格化操作,再进行绘图,示例如下:


import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl

df1 = pd.read_excel(读取文件的)
# usecols 读取指定列数据

x = df1[['x']].drop_duplicates().values
y = df1[['y']].drop_duplicates().values
X, Y = np.meshgrid(x, y)  # 将原始数据变成网格数据形式
X = X[:-1, :-1]
Y = Y[:-1, :-1]

df2 = pd.pivot_table(df1, index='y', columns='x', values='abs_mag_pykrige').values
df2 = df2[:-1, :-1]

CS = plt.contourf(X, Y, df2, linewidth=2, cmap=mpl.cm.jet)  # 色带型:mp.coutourf(x, y, z, 线的数量, cmap=颜色映射)
plt.colorbar(CS)
plt.show()

这个示例中,我们将 X 和 Y 中的最后一行和最后一列都去掉了,然后再进行网格化操作。这样就可以避免多出一行一列的问题,从而成功绘制等高线填色图。

该回答引用GPTᴼᴾᴱᴺᴬᴵ
根据提示,您可以看到 X 和 Y 的形状是 (122, 137),而 df2 的形状是 (121, 136),多出的一行和一列是由于边界效应造成的。因此,需要删除一个边界行和一列,使这些数组的形状相同。例如,您可以在转换 X 和 Y 为网格数据时指定 index=False 和 columns=False 来删除边界行和列:

X, Y = np.meshgrid(x, y, indexing='ij')  # 在转换网格数据时指定 indexing='ij' 参数


完整代码如下:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl

df1 = pd.read_excel(读取文件的)
x = df1['x'].drop_duplicates()
y = df1['y'].drop_duplicates()
X, Y = np.meshgrid(x, y, indexing='ij')
df2 = pd.pivot_table(df1, index='y', columns='x', values='abs_mag_pykrige').values
CS = plt.contourf(X, Y, df2, linewidth=2, cmap=mpl.cm.jet)
plt.colorbar(CS)
plt.show()


这样您应该就能成功地绘制出等高线填色图了。