避免绘制冗余像素?

时间:2019-06-21 15:38:45

标签: python matplotlib seaborn

当我进行qq绘图时(基本上是散点图),我经常使用matplotlib,偶尔使用Seaborn。如果我碰巧有几百万个数据点(比如说800万个),那么绘制可能会花费很长时间。我经常发现自己等了15分钟以上才将绘图输出为png或pdf。实际上,R也有同样的问题。

我尝试了许多技巧来解决此问题。 png的保存速度比pdf更快。我尝试仅绘制两个数据集中较大的那10个数据集,然后将其隐藏在较小的数据集中,发现在视觉上看不出来(除非您you着眼睛)。我曾尝试对较大的数据集进行下采样,但效果很好,但我必须预先进行大量工作,以确保所有重要点都不会下采样,并且结果图倾向于结束看起来稀疏。

最近,我一直尝试尝试上述方法的组合,直到得到一个看起来还不错的图,然后咬紧牙关,等待15分钟以上以准备好整个数据集。 。我讨厌我必须这样做。 MatLab做了一些奇怪的魔术,可以在几秒钟内吐出相同的内容,但是我讨厌使用MatLab,而且我不太了解这种语言。我的理解是MatLab可以通过首先计算冗余像素并仅绘制必要的像素来实现此目的。有没有道理呢?是否可以复制此行为?

1 个答案:

答案 0 :(得分:1)

如果您期望重复很多,那么去重复该怎么办?

from matplotlib import pyplot as plt
import numpy as np
import timeit

x = np.random.randint(0, 10**3, 8*10**6)
y = np.random.randint(0, 10**3, 8*10**6)

points = list(zip(x, y))
dedupped_points = list(set(points))

# About 12.5% in my example
print(len(dedupped_points) / len(points))

如果您不希望精确地找到 重复项,则始终可以通过舍入删除 near 重复项。

x = 100*np.random.rand(8*10**6)
y = 100*np.random.rand(8*10**6)

dec_points = list(zip(x, y))

x_rounded = np.round(x, 2)
y_rounded = np.round(y, 2)

dec_round_points = list(set(zip(x_rounded, y_rounded)))

# Again, about 12.5% for me
print(len(dec_round_points) / len(dec_points))