如何用 100 万个点散点图

How to scatter plot with 1 million points

我正在尝试制作一个程序,该程序使用 csv 文件中的给定点绘制图形,该文件每行包含 4 个字符串(点数、x 位置、y 位置、颜色),但是时间takes 高得离谱,所以我正在寻找让它更快的想法。

from matplotlib import pyplot as plt    
from matplotlib import style   
import csv

style.use('ggplot')

s = 0.5
with open('total.csv') as f:
  f_reader = csv.reader(f, delimiter=',')
  for row in f_reader:
    plt.scatter(str(row[1]), str(row[2]), color=str(row[3]), s=s)
plt.savefig("graph.png", dpi=1000)

第一步是调用 scatter 一次而不是对每个点都调用一次,不添加对 numpy 和 pandas 的依赖,它看起来像:

from matplotlib import pyplot as plt
from matplotlib import style
import csv

style.use("ggplot")

s = 0.5
x = []
y = []
c = []
with open("total.csv") as f:
    f_reader = csv.reader(f, delimiter=",")
    for row in f_reader:
        x.append(row[1])
        y.append(row[2])
        c.append(row[3])
plt.scatter(x, y, color=c, s=s)
plt.savefig("graph.png", dpi=1000)

然后也许可以尝试 pandas.read_csv,它会给你一个 pandas 数据框,让你无需 for 循环即可访问 CSV 的列,这可能会更快。

每次尝试变体时,测量它花费的时间(可能在较小的文件上)以了解哪些有帮助,哪些没有帮助,换句话说,不要盲目地提高性能。

使用 pandas 看起来像:

from matplotlib import pyplot as plt
from matplotlib import style
import pandas as pd

style.use("ggplot")

total = pd.read_csv("total.csv")
plt.scatter(total.x, total.y, color=total.color, s=0.5)
plt.savefig("graph.png", dpi=1000)

如果您想了解更多有关 pandas 性能良好实践的信息,我喜欢 No more sad pandas 演讲,请看一看。