【问题标题】:How to reduce the number of data points in a scatter chart?如何减少散点图中的数据点数量?
【发布时间】:2017-09-23 18:18:54
【问题描述】:

目前,我在使用 plotly 的引擎和 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)

【问题讨论】:

  • 能否请您提供您的代码。
  • 你能包括一个Minimal, Complete, and Verifiable 的例子吗?我有一个“答案”,但没有你的代码我就写不出一个合适的答案。
  • 刚刚添加了一些代码。

标签: python plotly scatter-plot scatter


【解决方案1】:

如果您只是想可视化数据点所在的区域,将 x-y 数据转换为密度网格可能更有效。这可能比散点图更好,因为当您有大量点时,这些点可能会相互遮挡,因此您真的不知道某些区域有多少点。

我不熟悉 plotly(我使用 matplotlib.pyplot),但我看到至少有 one way to do this

【讨论】:

    【解决方案2】:

    一种方法是从散点中随机抽样。只要您采样了足够多的点,您就极有可能拥有相似的形状。

    例如,从您将使用的 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')
        )
    )
    

    这个 sn-p 可能看起来很傻,但实际上您将拥有一个实际的数组而不是 np.random.randn(N),因此从这些数组中随机采样是有意义的。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2023-03-06
        • 2017-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-29
        • 1970-01-01
        • 1970-01-01
        • 2019-07-03
        相关资源
        最近更新 更多