在 png 上绘制 matplotlib 散点图
matplotlib scatter plotting over png
我正在尝试制作一个包含约 600 万个点的散点图,以试图理解某种聚类。
当我尝试在一个简单的分散命令中执行此操作时,matplotlib 抱怨内存过多。所以我决定绘制 3000 个点,然后将图形保存为 .png 格式,清除图形,用 imread()
加载保存的 .png,然后覆盖接下来的 3000 个点。
我遇到了一些填充问题,但我不明白它们是如何出现的。我的代码有点长,因为我要解析很多文本文件,但下面是一个复制我的想法的示例模型代码:
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
plt.xlim(0,1000)
plt.ylim(-1000,1000)
plt.scatter(400,500,marker="+",c="r")
plt.gca().set_aspect('equal')
plt.draw()
plt.savefig(r"C:\TMP\fig1.png")
plt.clf()
im = plt.imread(r"C:\TMP\fig1.png")
implot = plt.imshow(im, origin='upper', aspect='equal', extent=[0,1000,-1000,1000], zorder=0)
plt.scatter(600,500,marker="+",c="b")
plt.savefig(r"C:\TMP\fig2.png")
plt.close(fig)
结果是我不明白如何解释的东西。显然,我没有从imshow()中理解"aspect"和"extent"之间的关系。有人可以帮我解决这个问题吗?
图一
图2
我原以为 fig1.png
和 fig2.png
可以完美地叠加在一起。
我用 memory_profiler 做了一个内存配置文件作为一个合理的例子,6M 点。
import numpy as np
import time
x = np.random.normal(size=6000000)
y = np.random.normal(size=6000000)
start = time.time()
plt.scatter(x, y, alpha=0.1)
end = time.time() - start
print(end)
out
是 30.015294551849365 秒。不是特别慢。
另一方面,配置文件输出:
Line # Mem usage Increment Line Contents
================================================
5 81.738 MiB 0.000 MiB @profile
6 def make_test():
7 127.516 MiB 45.777 MiB x = np.random.normal(size=6000000)
8 173.293 MiB 45.777 MiB y = np.random.normal(size=6000000)
9
10 282.934 MiB 109.641 MiB plt.scatter(x, y, alpha=0.1)
11 298.160 MiB 15.227 MiB plt.savefig('big_plot')
达到300Mb,也不是内存问题。
问题出在别处,但您应该能够将 ALL 点绘制在一起。
最后,散点图:
我正在尝试制作一个包含约 600 万个点的散点图,以试图理解某种聚类。
当我尝试在一个简单的分散命令中执行此操作时,matplotlib 抱怨内存过多。所以我决定绘制 3000 个点,然后将图形保存为 .png 格式,清除图形,用 imread()
加载保存的 .png,然后覆盖接下来的 3000 个点。
我遇到了一些填充问题,但我不明白它们是如何出现的。我的代码有点长,因为我要解析很多文本文件,但下面是一个复制我的想法的示例模型代码:
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
plt.xlim(0,1000)
plt.ylim(-1000,1000)
plt.scatter(400,500,marker="+",c="r")
plt.gca().set_aspect('equal')
plt.draw()
plt.savefig(r"C:\TMP\fig1.png")
plt.clf()
im = plt.imread(r"C:\TMP\fig1.png")
implot = plt.imshow(im, origin='upper', aspect='equal', extent=[0,1000,-1000,1000], zorder=0)
plt.scatter(600,500,marker="+",c="b")
plt.savefig(r"C:\TMP\fig2.png")
plt.close(fig)
结果是我不明白如何解释的东西。显然,我没有从imshow()中理解"aspect"和"extent"之间的关系。有人可以帮我解决这个问题吗?
图一
图2
我原以为 fig1.png
和 fig2.png
可以完美地叠加在一起。
我用 memory_profiler 做了一个内存配置文件作为一个合理的例子,6M 点。
import numpy as np
import time
x = np.random.normal(size=6000000)
y = np.random.normal(size=6000000)
start = time.time()
plt.scatter(x, y, alpha=0.1)
end = time.time() - start
print(end)
out
是 30.015294551849365 秒。不是特别慢。
另一方面,配置文件输出:
Line # Mem usage Increment Line Contents
================================================
5 81.738 MiB 0.000 MiB @profile
6 def make_test():
7 127.516 MiB 45.777 MiB x = np.random.normal(size=6000000)
8 173.293 MiB 45.777 MiB y = np.random.normal(size=6000000)
9
10 282.934 MiB 109.641 MiB plt.scatter(x, y, alpha=0.1)
11 298.160 MiB 15.227 MiB plt.savefig('big_plot')
达到300Mb,也不是内存问题。 问题出在别处,但您应该能够将 ALL 点绘制在一起。
最后,散点图: