使用Python MatPlotLib从.csv文件中读取X和Y坐标,生成频率热图

3

我最近遇到了一个类似的问题,关于如何使用MatPlotLib模块在Python中生成频率热图。

这篇文章非常有用,我可以运行单个脚本并创建随机测试数据的热图。然而,我无法将代码调整为创建适用于我正在处理的数据的热图。这些数据以逗号分隔格式(.csv)保存。

我目前有3788对平均质量评分保存在这个.csv文件中。这些平均质量评分都有0-5的范围。我正在尝试创建一个热图,将数据按0.5增量分组在x和y轴上(0-.499, .5-.999, 1-1.499等)。

我希望导入.csv文件的第一列(webqualityratings)作为热图的x值,第二列(inpersonqualityratings)作为热图的y值。

我尝试调整的代码由“ptomato”发布,由Mike Graham编辑,如下所示:

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

# Generate some test data  
x = np.random.randn(8873)  
y = np.random.randn(8873)  

heatmap, xedges, yedges = np.histogram2d(x, y, bins=50)  
extent = [xedges[0], xedges[-1], yedges[0], yedges[-1]]  
plt.clf()  
plt.imshow(heatmap, extent=extent)  
plt.show() 

如果有人能帮我调整此代码,按照指定的方式读取我的.csv文件中的数据,我将感激不尽!
2个回答

5

如果你拥有numpy,并且假设你的csv文件符合要求,你可以使用numpy.loadtxt()

import numpy as np   
import matplotlib.pyplot as plt  

dat = np.loadtxt('mydata.csv')

x, y = dat[:,0], dat[:,1]

heatmap, xedges, yedges = np.histogram2d(x, y, bins=50)  
extent = [xedges[0], xedges[-1], yedges[0], yedges[-1]]  
plt.clf()  
plt.imshow(heatmap, extent=extent)  
plt.show() 

-2

Python拥有绝对精彩的csv文件库:

http://docs.python.org/library/csv.html

虽然我不知道matplotlib的细节,但以下代码将循环遍历一个制表符分隔的csv文件,并在每个第一列和第二列上执行您的代码。

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

with open(yourInputFile, "rb") as mycsv:
    reader = csv.DictReader(mycsv, dialect='excel-tab')

    for row in reader:
        x = row['name of first column']
        y = row['name of second column']
        heatmap, xedges, yedges = np.histogram2d(x, y, bins=50)
        extent = [xedges[0], xedges[-1], yedges[0], yedges[-1]]
        plt.clf()
        plt.imshow(heatmap, extent=extent)

plt.show()

请注意,我正在使用DictReader变体,它需要一个标题才能工作。可以将标题放在文件开头或作为构造函数的输入。你也可以使用常规的reader,但它使用列号而不是名称,对于100多个字段来说很难处理。
如果需要的话,你可以更改特定csv文件的方言,甚至可以创建自己的方言。
最后,请注意我对matplotlib一无所知,那段代码很可能是错误的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接