首页 > 解决方案 > 将 x 和 y 值从 CSV 分配给 MatplotLib 散点图

问题描述

对于当前项目,我计划使用 MatplotLib 设置散点热图。xs 和 ys 的数据应从一个 CSV 文件中提供,该文件有两列都包含浮点数。

在此基础上,我还没有想出正确将 CSV 列分配给 xs 和 xy 的方法。例如,下面的示例产生错误TypeError: '_io.TextIOWrapper' object is not subscriptable。有谁知道一个聪明的调整来使这个热图工作?

对应的代码如下所示:

# Importing CSV
df = open("heatmap.csv", "r", encoding="utf8")

# Assigning X, Y
xs = df[0]
ys = df[1]
resolution = 250

# Heatmap calculations
def data_coord2view_coord(p, vlen, pmin, pmax):
    dp = pmax - pmin
    dv = (p - pmin) / dp * vlen
    return dv


def nearest_neighbours(xs, ys, reso, n_neighbours):
    im = np.zeros([reso, reso])
    extent = [np.min(xs), np.max(xs), np.min(ys), np.max(ys)]

    xv = data_coord2view_coord(xs, reso, extent[0], extent[1])
    yv = data_coord2view_coord(ys, reso, extent[2], extent[3])
    for x in range(reso):
        for y in range(reso):
            xp = (xv - x)
            yp = (yv - y)

            d = np.sqrt(xp**2 + yp**2)

            im[y][x] = 1 / np.sum(d[np.argpartition(d.ravel(), n_neighbours)[:n_neighbours]])

    return im, extent


fig, axes = plt.subplots(2, 2)

for ax, neighbours in zip(axes.flatten(), [0, 16, 32, 64]):
    if neighbours == 0:
        ax.plot(xs, ys, 'k.', markersize=2)
        ax.set_aspect('equal')
        ax.set_title("Scatter Plot")
    else:
        im, extent = nearest_neighbours(xs, ys, resolution, neighbours)
        ax.imshow(im, origin='lower', extent=extent, cmap=cm.jet)
        ax.set_title("Smoothing over %d neighbours" % neighbours)
        ax.set_xlim(extent[0], extent[1])
        ax.set_ylim(extent[2], extent[3])
plt.show()

标签: pythonnumpycsvmatplotlib

解决方案


我认为您的问题与热图的工作方式无关,而与您打开该 csv 文件的方式有关。我看不到您的导入以及打开“指向”的内容,但很可能您直接打开了 csv 文件,这意味着您必须编写代码来解析 csv 文件。

一个相当简单和流行的方法是使用 csv 模块 ( https://docs.python.org/3/library/csv.html ) 或 pandas ( https://pandas.pydata.org/pandas-docs/stable/参考/api/pandas.read_csv.html)。


推荐阅读