首页 > 解决方案 > 使用 Python 创建 Cartisan X、Y、Z 值的热图

问题描述

这是我想做的事情:

  1. 导入包含 X、Y 和 Z 值的笛卡尔坐标以及名义 Z 值的 .csv 文件。
  2. 创建这些点的 2D 热图图像,其中 X、Y 是已知点的位置,Z 值确定该位置的颜色。特别是 Z 值与特定 X、Y 点的标称 Z 值的偏差。
  3. 将图像保存到与 .csv 相同的目录

我了解如何读入和保存文件,我最关心的是从哪里开始为热图准备数据。我一直在使用matplotlib.pyplot,numpypandas尝试使用该plt.contourf()函数来生成热图,但我不知道如何让它正常工作。我发现的大多数示例和教程都使用 Z 作为 X、Y 的一些数学函数,以保持示例简单,而不是像我试图做的那样从文件中引用数据。我面临的另一个问题是我正在使用的数据不一定是矩形的,也不能很好地融入网格。它们可能是不均匀分布的随机 X、Y 点。

无论如何,这是我到目前为止的一些东西(只需绘制 XY 数据):

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import matplotlib.mlab as ml
import seaborn as sns

csv_name = 'Test.csv'

# import the .csv for heatmap
print('CSV FORMAT SHOULD BE: Point_Number, X_Coord, Y_Coord, Z_Coord, Z_Coord_Nominal, Upper_Tol, Lower_Tol')
specify_filename = input("Enter a filename for data:")
myfile = open(specify_filename)
heatmap_data = myfile.read()
myfile.close()

print('Data File Contents:')
print(heatmap_data)

# data preparation
df = pd.read_csv(specify_filename, header=None)
df.columns = ['Point_Number', 'X_Coord', 'Y_Coord', 'Z_Coord', 'Z_Coord_Nominal', 'Upper_Tol', 'Lower_Tol']

plt.gca().set_aspect('equal', adjustable='box')
plt.plot(df['X_Coord'], df['Y_Coord'], 'o')


# This is where I don't know what to do with the data to make it plot properly using plt.contourf()


# save heatmap image
print('Data File:')
print(specify_filename)
output_path = specify_filename.replace(csv_name, 'heatmap.png', 1)
print('Output File:')
print(output_path)

plt.savefig(output_path)

这将创建一个如下所示的图:(请注意,这些点不在矩形网格中) 输出带有 XY 坐标的图像。

理想情况下,生成的热图图像将在点之间插入 Z 值,看起来像thisthis。我想将与标称 Z 值的偏差用于热图上的颜色。

任何帮助或示例将不胜感激。如果我为此使用了错误的工具,我很想知道更好的选择是什么。我几乎不使用 python,所以我对细微差别不是非常熟悉,但我愿意接受任何我能得到的帮助。谢谢!

标签: pythonpandasnumpymatplotlibheatmap

解决方案


如果您的数据是有序的,那么您可以使用 pcolormesh。


import matplotlib.pyplot as plt
import numpy as np
theta, r = np.meshgrid(np.linspace(0, 2*np.pi, 50), np.linspace(0, 5, 50));
X_coord = r * np.cos(theta);
Y_coord = r * np.sin(theta);
Z_coord = np.sin(3*theta) * np.cos(r)
plt.pcolormesh(X_coord, Y_coord, Z_coord, shading='nearest')

最近的

您可以通过更改着色参数来稍微平滑图像

plt.pcolormesh(X_coord, Y_coord, Z_coord, shading='gouraud')

在此处输入图像描述


推荐阅读