我有一个包含3列的.csv文件,我必须将其读入Python并转换为饼图。
如果我手动创建数据列表,我就设法制作了一个饼图,但我仍然坚持将.csv中的数据读入python。
import numpy as np
import matplotlib.pyplot as plt
import csv
outfile = open("vote_results.csv","r")
file=csv.reader(outfile)
#skip the headers
next(file, None)
Party = []
Seats = []
Votes = []
for row in file:
Party = row[0]
Seats = row[1]
Votes = row[2]
plt.pie(Votes, labels=Party)
plt.show()
我一直在:
TypeError: "Object of type 'numpy.float64' has no len()"
我认为是由于有标题而已经尝试了
next(file, None)
删除它们但仍然收到错误。
CSV文件看起来像
Party Seats Votes
Party1 50 1000
Party2 41 680
Party3 32 481
答案 0 :(得分:2)
问题来自您尝试存储数据的方式。您已使用Party = []
初始化了一个空列表,但随后将名为Party
的变量覆盖为row[0]
的结果。因此,当您尝试绘制饼图时,您尝试绘制的列表中只有一个数字。
解决方案是使用my_list.append(value)
将项目追加到您的列表中。此外,我不确定它是否是拼写错误,但您需要plt.show()
之后的括号。
请注意,根据PEP8,变量名称应以小写字母开头。
您还可以添加plt.axis('equal')
以使评论中的@Dan建议使饼图变为圆形。
因此,您的示例将变为:
outfile = open("vote_results.csv","r")
file=csv.reader(outfile)
next(file, None)
party = []
seats = []
votes = []
for row in file:
party.append(row[0])
seats.append(row[1])
votes.append(row[2])
plt.pie(votes, labels=party)
plt.axis('equal') # make the pie chart circular
plt.show()
使用样本数据给出: