【问题标题】:Heatmap from large CSV file来自大型 CSV 文件的热图
【发布时间】:2016-11-13 04:57:59
【问题描述】:

我正在尝试从大型 CSV 绘制热图。具体来说,我有一个这样的矩阵:

O0 X1 X2 X3 . . . Xn
Y1 Z1 Z2 Z3 . . . Zn
Y2 Z1 Z2 Z3 . . . Zn
Y3 Z1 Z2 Z3 . . . Zn
.  .  .  .  . . . .
.  .  .  .  . . . .
.  .  .  .  . . . .
Yn Z1 Z2 Z3 . . . Zn

X 值超过 4K,Y 值超过 15K,Z 值介于 0 到 1000 之间,我需要生成图像,其中 0 值是冷蓝色像素,1000 值是热红色值,与a 其余值下降,我尝试了一些 python 实用程序,但他们都说 fata 太大,有人有一个库来绘制大量数据吗?

有我用来减去数据的代码:

reader = csv.reader(open('../Data/160627_185815_1_OK.csv', 'rt'), delimiter=';')
reader2 = csv.reader(open('../Data/160627_195553_1_OK.csv', 'rt'), delimiter=';')
first = True
valuesGT1 = 0
print(reader)
Z = []
for row in reader:
    row2 = next(reader2)
    row2.pop(0)
    row.pop(0)
    if not first:
        C = [float(a) - float(b) for a, b in zip(row, row2)]
        with open('results_test.csv', 'a') as csvfile:
            spamwriter = csv.writer(csvfile, delimiter=',',
                                    quotechar='|', quoting=csv.QUOTE_MINIMAL)
            spamwriter.writerow(C)
            csvfile.close()
        Z.append(C)
    else:
        first = False;

提前致谢。

编辑:Example CSV

【问题讨论】:

  • 哇,所以你要生成一个 4000px x 15000px 的图像?
  • 您能否提供一个 csv 作为示例(可能只是 100*100 的提取),以便我们可以使用真实数据?
  • @Cyrbil 嗨,有一个文件摘录:link 谢谢。
  • @SeanFrancisN.Ballais 就是这样。

标签: python csv matplotlib plot heatmap


【解决方案1】:

我使用vips 尝试了您的问题。这是我的程序:

#!/usr/bin/python

import sys

import gi
gi.require_version('Vips', '8.0')
from gi.repository import Vips

im = Vips.Image.new_from_file(sys.argv[1])
im = (255 * im / 1000).falsecolour()
im.write_to_file(sys.argv[2])

我在笔记本电脑上针对我制作的一些测试数据运行它:

$ wc x.csv
    14990 122873030 362045970 x.csv
$ time ./heatmap.py x.csv x.tif

real    0m36.415s
user    0m37.508s
sys 0m0.904s  
$ ls -l x.tif 
-rw-rw-r-- 1 john john 184333196 Jul 14 10:01 x.tif
$ vipsheader x.tif 
x.tif: 4099x14990 uchar, 3 bands, srgb, tiffload

因此,它只需要 35 秒多一点就可以生成一个 200MB 的 tif 文件。内存使用峰值约为 30MB 的 RAM,尽管它也会使用临时文件。

您不需要提供您的平台,但您可以使用brew install vips 安装在 OS X 上,或者通过您的包管理器安装在 linux 上。在 Windows 上有点难。

编辑:我看到您的文件是其他两个 CSV 文件之间的区别。您可以在 vips 中完成所有操作,例如:

a = Vips.Image.new_from_file(sys.argv[1])
b = Vips.Image.new_from_file(sys.argv[2])
heatmap = (255 * (a - b) / 1000).falsecolour()
heatmap.write_to_file(sys.argv[3])

【讨论】:

  • 谢谢,让事情变得简单。
【解决方案2】:

这是我目前得到的:

import csv
from PIL import Image

with open('TESTCSV100x100.csv') as f:
    reader = csv.reader(f, delimiter=';')

    i, j = 0, 0
    pixels = dict()
    for i, row in enumerate(reader):
        for j, val in enumerate(row):
            r, g, b = (int(int(val) / (1000 / 255)),
                       int(20 - int(val) / (1000 / 20)),
                       int(255 - int(val) / (1000 / 255)))
            pixels[i, j] = (r, g, b)

img = Image.new('RGB', (i + 1, j + 1), "black")
data = img.load()
for k, v in pixels.items():
    data.__setitem__(k, v)

img.save('/tmp/test.jpg', "JPEG")

显然,对于您非常大的数据集,这不会是有效的。这里有一些可能性:

  • 使用 numpy:它可以非常快速地读取 csv,并且可以使用 Image.fromarray() 轻松地将结果传递给 PIL
  • 使用多处理:使用工作池,您可以将要处理的行发送到不同的线程

【讨论】:

    猜你喜欢
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多