目前,我有一个问题,就是使用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)
答案 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