对于大量数据,matplotlib散点图是否缓慢?

时间:2017-03-07 02:32:38

标签: python pandas matplotlib

我有一个包含属性x,y的数据集,它们可以在x-y表面绘制。

最初,我使用代码

df.plot(kind='scatter', x='x', y='y', alpha=0.10, s=2)
plt.gca().set_aspect('equal')

代码非常快,数据大小约为50000.

最近,我使用了一个新的数据集,大小约为250000.散点图变慢了。

我想知道,如果这是预期的行为,我是否可以采取任何措施来提高情节速度?

2 个答案:

答案 0 :(得分:3)

是的,确实如此。这样做的原因是散点图超过可能一千点几乎没有意义,因此没有人愿意优化它。最好为数据使用其他表示形式:

  • 如果您的积分分布在各处,则为热图。使热图单元格非常小
  • 绘制某种近似分布的曲线,可能会将y与x相关联。务必提供一些置信度值或以其他方式描述分布;例如,对于我来说,为y(或x}范围内的x构建一个带有DISCONNECTED FROM CLIENT DISCONNECTED FROM CLIENT DISCONNECTED FROM CLIENT DISCONNECTED FROM CLIENT DISCONNECTED FROM CLIENT DISCONNECTED FROM CLIENT DISCONNECTED FROM CLIENT ...(a lot) 的盒子,并将它们放在同一网格上通常效果非常好。< / LI>
  • 减少数据集。评论中的@sascha建议随机抽样,这绝对是个好主意。根据您的数据,可能有更好的方法来选择代表点。

答案 1 :(得分:2)

我也遇到了同样的问题,即使用降维算法获得了超过300k的2D坐标,而解决方案是近似的,可以将坐标转换为2D numpy数组并将其可视化为图像。结果非常好,而且速度更快:

def plot_to_buf(data, height=2800, width=2800, inc=0.3):
    xlims = (data[:,0].min(), data[:,0].max())
    ylims = (data[:,1].min(), data[:,1].max())
    dxl = xlims[1] - xlims[0]
    dyl = ylims[1] - ylims[0]

    print('xlims: (%f, %f)' % xlims)
    print('ylims: (%f, %f)' % ylims)

    buffer = np.zeros((height+1, width+1))
    for i, p in enumerate(data):
        print('\rloading: %03d' % (float(i)/data.shape[0]*100), end=' ')
        x0 = int(round(((p[0] - xlims[0]) / dxl) * width))
        y0 = int(round((1 - (p[1] - ylims[0]) / dyl) * height))
        buffer[y0, x0] += inc
        if buffer[y0, x0] > 1.0: buffer[y0, x0] = 1.0
    return xlims, ylims, buffer

data = load_data() # data.shape = (310216, 2) <<< your data here
xlims, ylims, I = plot_to_buf(data, height=h, width=w, inc=0.3)
ax_extent = list(xlims)+list(ylims)
plt.imshow(I,
           vmin=0,
           vmax=1, 
           cmap=plt.get_cmap('hot'),
           interpolation='lanczos',
           aspect='auto',
           extent=ax_extent
           )
plt.grid(alpha=0.2)
plt.title('Latent space')
plt.colorbar()

结果如下:

希望对您有帮助。