python - 如何减少多个重叠 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()
在循环中添加命令对我没有帮助。
解决方案
这是我解决您的问题的尝试:
# 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)
结果:
我记录了x
和y
数据,然后继续对它进行分类。我不认为您对密度感兴趣,我只是绘制了一种静态颜色,其中一个 bin 包含多个元素。
推荐阅读
- c# - 调用异步单行 lambda 委托
- jupyter-notebook - 是否可以在 Jupyter Notebook 中缩放粘贴的图像?
- perl - 使用 HTML::PullParser 获取属性值
- javascript - 为什么在使用 reactjs 挂钩时出现“TypeError:react__WEBPACK_IMPORTED_MODULE_1___default.a.useState 不是函数”错误?
- scala - Gatling scala 扩展失败,找不到证据参数的隐式值
- android - 浮动按钮更改属性 app:maxImageSize frome 代码
- vuejs2 - VueJS 兄弟组件重载挑战
- python - 在嵌入在 tkinter 中的两个 matplotlib 图之间切换时,第一个图上会出现一组额外的意外 x 和 y 轴标签和刻度
- mysql - 如果在第二个表中满足要求,则从多个表中选择数据
- python - 构造 1 到 n 的四元组所有可能组合的最有效方法