将 csv 文件中的行加载到 Python 中的热图轴

Loading lines from csv files into heatmap axes in Python

我是 python 的新手,有一个课程作业是根据 csv 文件中的数据生成热图。上方是汽车的性能指标,下方是汽车名称。我还将行和列的标题切成数组。我不确定如何将这些值加载到轴刻度中。

我正在使用代码 ax.set_xticks() 并且对 y 使用相同的代码,但不确定将什么放入括号中。 ax.get_xticks() 也不起作用。我尝试了多种方法,但都抛出错误,主要是切片的名称;请参阅下面的代码。

if __name__ == "__main__":
    # Load the data.
    fileObj = open("CARS.csv").readlines()
    lines = [line.strip().split(",") for line in fileObj]
    # Reads the data into a list,
    # then slicing to extract a list of cars, kpis and scoring.
    cars = [line[0] for line in lines[1:]]      #array storing car names
    kpis = lines[0][1:]                         #array storing kpis
    scoring = np.array([line[1:-1] for line in lines[1:]], dtype=float)
fig=plt.figure(figsize=(6,3))   
    ax=fig.add_subplot(111)         
    ax.set_xlim([0,9])
    ax.set_xticks(kpis[lines[0][1:]])
    ax.set_yticks(cars)
    ax.set_title('Sportscar KPI Data')
    ax.set_xlabel('KPI's')
    ax.set_ylabel('Sportscars')
    im = ax.imshow(scores, interpolation='nearest', aspect='auto')
    plt.show()

我希望将切片中的跑车名称放入 ticks 部分,但错误会显示无法传递的名称列表。 kpi也是一样。

简答:

使用pandas和seaborn:

import pandas as pd
import seaborn as sns
df = pd.read_csv('CARS.csv', index_col=0)
sns.heatmap(df)

长答案:

可以通过更正一些错误使您的代码达到运行...

fileObj = open("CARS.csv").readlines()
lines = [line.strip().split(",") for line in fileObj]
cars = [line[0] for line in lines[1:]]
kpis = lines[0][1:]              
scoring = np.array([line[1:-1] for line in lines[1:]], dtype=float)

fig=plt.figure(figsize=(6,3))   
ax=fig.add_subplot(111)         
ax.set_title('Sportscar KPI Data')
ax.set_xlabel("KPI")
ax.set_ylabel('Sports car')
ax.set_xticks(range(len(kpis)))
ax.set_xticklabels(kpis)
ax.set_yticks(range(len(cars)))
ax.set_yticklabels(cars)
im = ax.imshow(scoring, interpolation='nearest', aspect='auto')
plt.show()

不过,
在 python 中有很多事情不会像这样完成(除了所有缩进错误和事实,尽管您的变量被引入为 [=16=,但您尝试绘制 scores ]):

首先,如果打开文件,您会在第一行执行此操作,然后开始访问它:

fileObj = open("CARS.csv")
lines = [line.strip().split(",") for line in fileObj.readlines()]

然后你可以通过

读取文件后正确关闭文件
fileObj.close()

因为现在fileObj真的一个文件对象,fileObj.readlines()不是,它是一个字符串列表。

无论如何,为该文件处理任务使用 with 块会更好,它会自动为您关闭:

with(open('CARS.csv')) as fileObj:
    lines = [line.strip().split(",") for line in fileObj.readlines()]

(请注意,此处 缩进是所有应由 with 块处理的内容的缩进)

但是,即使这已经更好了,也没有人会这样一步一步地这样做,逐行读取文件,手动提取标签并将一个子部分转换为一个 numpy 数组。
即使您出于某种原因 cannot/do 不想按照上面的建议使用 pandas 和 seaborn,numpy 本身也有几个写得很好的导入器,例如np.genfromtxt.