【问题标题】:plotting a histogram for a column in a csv file in python在python中为csv文件中的列绘制直方图
【发布时间】:2015-01-07 17:35:03
【问题描述】:

我正在尝试为给定 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

我无法摆脱这个错误。 答案应该很简单,但由于我是新手,我不知道如何处理它。

【问题讨论】:

  • 我无法重现这个。您的数据文件是什么样的?
  • 有没有一种方法可以共享或上传数据文件以查看数据的外观?我不知道这是否会给您任何想法并有所帮助:它有 9 列带有标题和数字数据,直到大约 400 行。
  • 要么将前几行粘贴到问题中(仅约 10 行),要么使用例如。 pastebin 并将链接放在问题中

标签: python csv matplotlib


【解决方案1】:

您收到错误是因为输入数据被 csv 解析器解释为字符串,而 hist 需要数字数据。您应该在附加之前显式转换每个 row[i]

【讨论】:

    【解决方案2】:

    假设您只想在 csv 文件中绘制一些数字数据,并且数据是数字(不是文本),您可能可以使用此处提到的相同方法:How to read csv into record array in numpy?

    因此,您的代码可能如下所示:

    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
    

    关于 genfromtxt 函数的信息可以在这里找到:http://docs.scipy.org/doc/numpy/reference/generated/numpy.genfromtxt.html

    【讨论】:

    • 嘿,我也试过这个,但我得到了太多索引的错误。 IndexError: 数组索引过多
    • 那么听起来你的文件可能是空的。执行print(data.shape)(或Py2 中的print data.shape),如果是(0,0),则您的文件有问题。您也可以在 Excel 中绘制它以了解您要查找的内容。您从我的错误和@hitzg 的答案中获得了足够的线索,您应该能够解决问题。 IndexError?数据不存在/足够大。 ValueError?看字符串;它是什么?可以兑换吗?
    【解决方案3】:

    我不能 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
    

    【讨论】:

    • 我试过了,但它仍然给我一个错误:ValueError: could not convert string to float: Area
    • 如果文件的第一行包含标题,则必须跳过它。如果没有您正在使用的文件,很难为您提供帮助。而且我认为@James 的回答是更直接地做你想做的事。你应该阅读他链接的文档。
    • 我在阅读文档后再次尝试跳过标题,它确实有效。感谢您的帮助。
    猜你喜欢
    • 2015-08-21
    • 2020-10-24
    • 1970-01-01
    • 2014-07-05
    • 2011-08-21
    • 1970-01-01
    • 2023-04-06
    • 2012-03-12
    • 1970-01-01
    相关资源
    最近更新 更多