我已经使用.cvs文件从数据中生成直方图。它有类似这样的数据
102.919 103.36
102.602 103.05
104.106 104.57
108.791 109.26
104.045 104.52
104.324 104.77
105.106 105.57
102.619 103.08
102.124 102.6
这是我写的代码
# histplot.py
import numpy as np
import matplotlib.pyplot as plt
import csv
with open('datafile.csv', 'rU') as data:
reader = csv.DictReader(data, delimiter=' ', quoting=csv.QUOTE_NONNUMERIC)
for line in reader:
t = float(line)
data.append(t)
reader.close()
# generate the histogram
hist, bin_edges=np.histogram(data, bins=50, range=[80,135])
# generate histogram figure
plt.hist(data, bin_edges)
plt.savefig('chart_file', format="pdf")
plt.show()
运行此代码会给我一个错误 ValueError:无法将字符串转换为float:' 102.919,103.36' 有人可以帮助我提供一些关于使用csv文件将字符串转换为浮点数的想法。 先感谢您。
答案 0 :(得分:0)
首先,with open('datafile.csv', 'rU') as data:
表示您获取data
作为文件的文件句柄。您可以将此文件句柄用作可迭代但不能向其追加任何内容。
第二个csv.DictReader
提供对字典的访问。在这种情况下,我建议使用csv.reader
,以list
的形式访问数据。
第三,你不能将整个line
,可能是字典或列表转换为浮点数。您只能使用列表中的单个元素执行此操作。 (这是错误的来源。)转换为浮点数甚至是不必要的,因为读者已经处理了这一点。
现在,您可以简单地将元素逐行附加到最初为空的列表,并将此列表提供给直方图函数。
import numpy as np
import matplotlib.pyplot as plt
import csv
data = [] #create empty list
with open('datafile.csv', 'rU') as f:
reader = csv.reader(f, delimiter=' ', quoting=csv.QUOTE_NONNUMERIC)
for line in reader:
data.extend(line)
# generate the histogram
hist, bin_edges=np.histogram(data, bins=50, range=[80,135])
# generate histogram figure
plt.hist(data, bin_edges)
#plt.savefig('chart_file', format="pdf")
plt.show()
我要提一下,使用numpy.loadtxt
可以更简单的方式完成整个数据阅读。
此外,如果不需要进行进一步的数据处理,可以简化绘制直方图。
import numpy as np
import matplotlib.pyplot as plt
data = np.loadtxt('datafile.csv').flatten()
plt.hist(data, bins=50, range=[80,135])
plt.show()