来自大型 CSV 文件的热图
Heatmap from large CSV file
我正在尝试从大型 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 值是热红色值,随着其他值的下降,我尝试了一些 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
这是我目前得到的:
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
- 使用多处理:使用工作池,您可以将要处理的行发送到不同的线程
我用 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])
我正在尝试从大型 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 值是热红色值,随着其他值的下降,我尝试了一些 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
这是我目前得到的:
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
- 使用多处理:使用工作池,您可以将要处理的行发送到不同的线程
我用 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])