Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何减少多个重叠matplotlib loglog绘图的内存开销?_Python_Matplotlib - Fatal编程技术网

Python 如何减少多个重叠matplotlib loglog绘图的内存开销?

Python 如何减少多个重叠matplotlib loglog绘图的内存开销?,python,matplotlib,Python,Matplotlib,我有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

我有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的可用ram,所以我完全希望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循环,因为我需要修改其中每个绘图的点样式和颜色,因此连接数据集是不利的


我能找到的最相似的问题是,但这不同于循环用于创建不同的绘图,而不是添加到同一绘图,因此将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,但我必须使用指数增长的bin大小,因为我的数据跨越多个数量级。绝对不是一个快速而肮脏的解决方案。如果有一个干净的matplotlib功能来控制内存开销,例如,在上一次调用的png输出上按顺序打印,就会简单得多。我只是问社区是否存在一个选项。matplotlib如何使将4.5GB数据写入500x500像素图像的开销超过4.5GB?我只是在想我遗漏了什么……你可以预期matplotlib figure对象及其子对象会比数据的原始字节大小大得多。我不认为你遗漏了什么。您的数据太大,无法使用matplotlib打印。我肯定会考虑一些装箱。谢谢大家。我会追查的。请看你是否有时间。Thxthanks@user8408080-这确实有效!但我需要更多地控制垃圾箱的大小。如何更仔细地生成垃圾箱?我想要一个介于0和10之间的箱子,然后10个介于10^k和10^k+1}之间的箱子。对于所有的k>0,如中所述,您可以为箱子设置自己的边