如何减少散点图中的数据点数?

时间:2017-09-23 18:18:55

标签: python plotly scatter-plot scatter

目前,我有一个问题,就是使用plotly&#39引擎和python在散点图中绘制大量的X,Y数据。因此,浏览器无法在一段时间后实际呈现此数量的点而不会崩溃。 (我还尝试过Scattergl选项https://plot.ly/python/webgl-vs-svg/

是否有任何算法可以减少散点图的大量分数而不会丢失原始形状?也许像迭代终点拟合算法?

编辑:

一些代码

import plotly.plotly as py
import plotly.graph_objs as go
from  plotly.offline import plot

import numpy as np

N = 1000000
trace = go.Scattergl(
    x = np.random.randn(N),
    y = np.random.randn(N),
    mode = 'markers',
    marker = dict(
        line = dict(
            width = 1,
            color = '#404040')
    )
)
data = [trace]

layout = go.Layout(title='A Simple Plot', width=1000, height=350)

fig = go.Figure(data=data, layout=layout)

plot(fig)

3 个答案:

答案 0 :(得分:0)

如果您只是想要显示存在数据点的区域,那么将x-y数据转换为密度网格可能更有效。这可能比散点图更好,因为当你有很多点时,这些点可能会相互模糊,所以你真的不知道在某些区域有多少点。

我不熟悉情节(我使用matplotlib.pyplot),但我发现至少有one way to do this

答案 1 :(得分:0)

一种方法是从散点中随机取样。只要您对足够的点进行采样,就很可能会有类似的形状。

例如,要随机抽样100万点中的10,000个,你会使用

i_plot = np.random.choice(N, size=10000, replace=False)
trace = go.Scattergl(
    x = np.random.randn(N)[i_plot],
    y = np.random.randn(N)[i_plot],
    mode = 'markers',
    marker = dict(
        line = dict(
            width = 1,
            color = '#404040')
    )
)

这个代码段可能看起来很傻,但实际上你会有一个实际的数组而不是np.random.randn(N),所以从这些数组中随机抽样是有意义的。

您希望测试不同数量的点,并可能将其增加到引擎可以处理的最大点数而不会滞后或崩溃。

答案 2 :(得分:0)

您应该尝试DataShader软件包(http://datashader.readthedocs.io/en/latest/),该软件包完全专注于此 - 将大量数据点转换为更易于可视化的内容。他们还提供论证为什么他们的方法可能比简单的热图更好:https://anaconda.org/jbednar/plotting_pitfalls/notebook