将 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
.
我是 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
.