等高线图的不规则网格结构

问题描述 投票:0回答:1

我正在尝试使用 Python 中的 matplotlib 和不规则的 xy 网格构建等高线图。我的 x-data 由 10 个数组组成,每个数组有 500 个元素。这 500 个元素对于 10 个数组中的每一个都不同。一个例子是:

x = np.random.random_sample(size = (10,50))
print(x)
y = np.random.random_sample(size = 10)
print(y)
z = np.random.random_sample(size = (10,50))
print(z)

所以我问如何将这组数据可视化为等高线或热图。沿着绘图上的 y[0],x[0] 轴值与 z[0] 数据相匹配,等等。我正在使用 pickle 来写入和提取字典数据:

# Read data from a file
with open('data.pkl', 'rb') as f:
    data_loaded = pickle.load(f)

x, y, z = data_loaded['eigenenergies'], data_loaded['r_primes'], data_loaded['dc_intensities']

我平常的绘图不起作用。

# Create meshgrid
xmesh, ymesh = np.meshgrid(x, y)

# Reshape z to match x and y dimensions
N = len(x)
M = len(y)
z = z.reshape(N, M)

# Increase the number of levels for smoother color transitions
num_levels = 1000  # Adjust as needed

# Plot contour
#plt.contour(xmesh, ymesh, z)
#plt.pcolormesh(x, y, z, shading='flat', vmin=z.min(), vmax=z.max())
plt.contourf(xmesh, ymesh, z, levels=np.linspace(z.min(), z.max(), num_levels))

# Add color bar
colorbar = plt.colorbar()
colorbar.set_label(r"Intensity")  # Set the label for the colorbar

# Add labels and title (optional)
plt.xlabel(r'$E \;\;[J]$')
plt.ylabel(r'$r^, \;[\AA]$')
plt.title('DC')

# Show the plot
plt.show()

我不知道如何继续下去。我尝试通过在 x 中形成一个线性空间来创建一个规则的网格,以

np.min(x)
np.max(x)
作为边界。我还尝试了几个 Copilot 提示,看看 AI 是否可以让我知道从哪里开始,但每个建议的 x 和 y 数据都具有相似的维度。

python matplotlib heatmap contourf
1个回答
0
投票

这是我的问题的解决方案:

dim = 50

# Read data from a file
with open('data.pkl', 'rb') as f:
    data_loaded = pickle.load(f)

x, y, z = data_loaded['eigenenergies'], data_loaded['r_primes'], data_loaded['dc_intensities']

X = np.array(x)
Y = np.array(y)
Z = np.array(z)

# Create a DataFrame with your data
data = pd.DataFrame({'x': X.flatten(), 'y': np.repeat(Y, dim), 'z': Z.flatten()})

# Pivot the data to create a 2D grid
Z = data.pivot_table(index='x', columns='y', values='z').T.values
X_unique = np.sort(data.x.unique())
Y_unique = np.sort(data.y.unique())
X, Y = np.meshgrid(X_unique, Y_unique)

# Replace nan values with zeros
Z_cleaned = np.nan_to_num(Z)


plt.contourf(X, Y, Z_cleaned, levels=10, cmap='viridis')
plt.colorbar()
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
plt.xlabel(r'$\Delta E \; [|J|]$', fontsize=17)
plt.ylabel(r'$r^, \; [\AA]$', fontsize=17)
plt.xlim(0,1)
plt.show()
© www.soinside.com 2019 - 2024. All rights reserved.