对大型数据集进行绘图表达

问题描述 投票:0回答:1
import plotly.express as px
import pandas as pd
dfa = pd.DataFrame()
dfa["travel_time(min)"] = range(100000)
fig = px.ecdf(dfa["travel_time(min)"], x="travel_time(min)")
#fig.write_html("debug.html")
fig.show()

100k 点正在生成一个图形,该图形是滞后的(10k 点它工作正常)。 我怎样才能解决这个问题?是否可以以某种方式预先计算图形?

python plotly plotly-dash plotly-python
1个回答
0
投票

TLDR: 不建议对大型数据集使用 Plotlyexpress 的 ecdf 或 hist 函数,因为它封装了图表中的所有数据点,而不是预先计算 bin。使用 Matplotlib 显示预先计算的 bin 或显示数据样本。由于大数定律,如果您对大部分数据进行随机采样,这不会影响输出分布的统计数据。

对大型数据集(例如示例中的 100,000 个数据点)使用 Plotlyexpress 的 ecdf 或 hist 函数并不是最佳选择。主要问题源于以下事实:这些函数直接将每个数据点合并到图中。处理如此大的数据集时,可能会导致滞后和性能问题。

原因如下:Plotly 的 ecdf(经验累积分布函数)绘制数据范围内的每个点,这使得随着数据集的增大,资源越来越密集。当您从 10k 到 100k 点时,浏览器或渲染引擎必须处理增加十倍的信息,这可能会导致明显的滞后。

要解决此问题,您可以考虑使用其他库或方法,在可视化之前对数据进行分箱或下采样。这是一个使用 matplotlib 和 numpy 的示例:

import numpy as np
import matplotlib.pyplot as plt

# Assuming 'dfa' is your DataFrame
x = dfa["travel_time(min)"]
ecdf_x, ecdf_y = np.sort(x), np.arange(1, len(x) + 1) / len(x)

plt.plot(ecdf_x, ecdf_y)
plt.xlabel('travel_time(min)')
plt.ylabel('ECDF')
plt.show()

此代码仍然绘制 ECDF,但通过使用 matplotlib 和 numpy,它可以更有效地处理更大的数据集。如有必要,调整分箱或采样率可以进一步提高性能。

© www.soinside.com 2019 - 2024. All rights reserved.