2015-01-07 65 views
0

我想繪製給定csv文件中特定列的直方圖和散點圖。我是編程新手,我從朋友那裏得到了這段代碼,它顯然可以工作,但不知何故,我得到了這個錯誤。代碼:在python中繪製csv文件中的列的直方圖

import csv 
import numpy as np 
import matplotlib.pyplot as plt 
f = open('Data for question 13.csv') 
data = csv.reader(f) 
Area = []; MajorAxisLength = []; MinorAxisLength = []; Perimeter = [] 
MinIntensity = []; MeanIntensity = []; MaxIntensity = [] 
header = [Area, MajorAxisLength, MinorAxisLength,Perimeter,MinIntensity,MeanIntensity,MaxIntensity] 
for row in data: 
    i = 1 
    for name in header: 
     name.append(row[i]) 
     i = i + 1 
plt.figure() 
plt.hist(Area, bins=50) # error follows after this 

錯誤:

Traceback (most recent call last): 
    File "<pyshell#11>", line 1, in <module> 
    plt.hist(Area, bins=50, alpha=0.5) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/matplotlib/pyplot.py", line 2827, in hist 
    stacked=stacked, **kwargs) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/matplotlib/axes.py", line 8312, in hist 
    xmin = min(xmin, xi.min()) 
    File "/Library/Python/2.7/site-packages/numpy-1.9.0-py2.7-macosx-10.9-intel.egg/numpy/core/_methods.py", line 29, in _amin 
    return umr_minimum(a, axis, None, out, keepdims) 
TypeError: cannot perform reduce with flexible type 

我無法擺脫這種錯誤的。 答案應該很簡單,但由於我是新的,我不知道如何處理它。

+1

我不能重現此。你的數據文件是什麼樣的? – matsjoyce

+0

有沒有一種方法可以共享或上傳數據文件以查看數據的外觀? 我不知道這是否會給你任何想法,並會有所幫助:它有9個標題欄和數值數據列,直到約400行。 –

+0

將前幾行粘貼到問題中(僅〜10),或使用例如。 [pastebin](http://pastebin.com),並把鏈接的查詢 – hitzg

回答

0

我不是100%確定的,因爲我沒有可用的數據文件。但我認爲row[i]是一個字符串(而不是整數或浮點數)。您可以使用enumerate跳過第一行。 所以這應該解決的問題:

for n,row in enumerate(data): 
    if n > 0: 
     i = 1 
     for name in header: 
      name.append(float(row[i])) 
      i = i + 1 
+0

我試過這個,但它仍然給我一個錯誤: ValueError:無法將字符串轉換爲浮動:區域 –

+1

如果您的文件的第一行包含您必須跳過它的標題。沒有您正在使用的文件,幫助您非常困難。我想@詹姆斯的答案是直接做你想做的事情。您應該閱讀他鏈接的文檔。 – hitzg

+0

我在閱讀文檔之後再次嘗試跳過標題並且確實有效。謝謝您的幫助。 –

1

你得到的錯誤,因爲輸入數據由CSV解析器,而HIST需要數字數據解釋爲字符串。在添加之前,您應該明確地轉換每個row[i]

1

假設你只是想在你的csv文件繪製一些數值數據,並且該數據是數字(不是文本),你很可能使用同樣的方法,這裏所說的:How to read csv into record array in numpy?

因此,你的代碼可能是這樣的:在genfromtxt功能

import csv 
import numpy as np 
import matplotlib.pyplot as plt 

data = np.genfromtxt('Data for question 13.csv') # add more parameter info if neccessary like skipping header lines 
plt.figure() 
plt.hist(data[:,0], bins=50) # Area, from OP, is column 0 

信息可以在這裏找到:http://docs.scipy.org/doc/numpy/reference/generated/numpy.genfromtxt.html

+0

嘿,我也試過這個,但是我得到了太多索引的錯誤。 IndexError:數組索引太多 –

+0

然後它聽起來像你的文件可能是空的。在數據庫中執行'print(data.shape)'(或'print data.shape'),如果它是'(0,0)',那麼你的文件有問題。你也可以在Excel中繪製它來知道你在找什麼。從我的和@ hitzg的答案中得到的錯誤中有足夠的線索,您應該能夠解決問題。 'IndexError'?數據不夠/夠大。 'ValueError'?看看字符串;它是什麼?它可轉換嗎? – James