首页 > 解决方案 > 如何减少多个重叠 matplotlib loglog 图的内存开销?

问题描述

我有 40 个数据集,每个数据集大小约为 115MB,我想将它们全部绘制在对数刻度的同一个图上。

# make example data 
import numpy as np
data_x = []
data_y = []
for _ in range(40):
    x, y = np.random.random(size = (2, int(7e6))) # 7e6 chosen to make about 115MB size
    data_x.append(x)
    data_y.append(y)
del x, y

# now show the size of one set in MB
print((data_x[0].nbytes + data_y[0].nbytes)/1e6, 'MB')
# 112.0 MB

我的电脑有大约 30GB 的可用内存,所以我完全希望它40*112MB = 4.5GB适合。

我想为每个数据集制作一个重叠的日志图:

import matplotlib.pyplot as plt 
for x,y in zip(data_x, data_y):
    plt.loglog(x, y)
plt.show()

但是内存开销太大了。我不想对数据进行下采样。有没有办法可以减少内存开销以绘制4.5GB数据?

我宁愿保留 for 循环,因为我需要修改其中每个图的点样式和颜色,因此连接数据集是不利的。

我能找到的最相似的问题是here,但不同之处在于循环用于创建不同的图,而不是添加到同一个图,因此plt.clf()在循环中添加命令对我没有帮助。

标签: pythonmatplotlib

解决方案


这是我解决您的问题的尝试:

# make example data 
import numpy as np
import matplotlib.pyplot as plt
import colorsys

data_x = np.random.random((40, int(7e6)))*np.logspace(0, 7, 40)[:, None]
data_y = np.random.random((40, int(7e6)))*np.logspace(0, 7, 40)[:, None]

# now show the size of one set in MB
print((data_x[0].nbytes + data_y[0].nbytes)/1e6, 'MB')

x, y = np.log(data_x), np.log(data_y)

hists = [np.histogram2d(x_, y_, bins=1000) for x_, y_ in zip(x,y)]

N = len(hists)

for i, h in enumerate(hists):
    color = colorsys.hsv_to_rgb(i/N, 1, 1)
    rows, cols = np.where(h[0]>0)
    plt.scatter(h[1][rows], h[2][cols], color=color, s=1)

结果:

在此处输入图像描述

我记录了xy数据,然后继续对它进行分类。我不认为您对密度感兴趣,我只是绘制了一种静态颜色,其中一个 bin 包含多个元素。


推荐阅读