首页 > 解决方案 > 使用大型数据框绘图时,Plotly Express 箱形图会产生白屏

问题描述

我有以下具有 40M 行的数据框:

occ_status_pre = ["retired","unemployed","house person","financially independent","employed","student"]

test_df = pd.DataFrame(np.random.randint(0,100,size=(40000000, 4)), columns=["id","occupation_status","age","height"])

occ_status = []
for num in range(0,40000000):
        occ_status.append(random.choice(occ_status_pre))

test_df["occupation_status"] = occ_status
test_df.head()
   id occupation_status  age  height
0  32        unemployed   41      78
1  83           retired   35      99
2  77           retired   61      19
3   8      house person   28      64
4   6        unemployed   46      22

在 Seaborn 中,我可以成功地为整个数据框创建箱形图,而不会出现任何问题:

fig,ax = plt.subplots(figsize=(10,8))
ax = sns.boxplot(x="occupation_status",y="age",data=test_df)
plt.tight_layout()

在此处输入图像描述

但是,如果我尝试在 Plotly 4.2 中重新创建相同的箱线图,那么它会使我的网络浏览器崩溃。

进一步的调查使我找到了该pio.renderers属性。如果我设置pio.renderers为等于“浏览器”,那么它将箱形图可视化输出到新的浏览器选项卡:

fig = px.box(test_df,x="occupation_status",y="age")
fig.show(renderer="browser")

但是,如果我的数据帧的行数超过 2800 万行,那么这只会显示一个空白的白色屏幕 - 新选项卡中不会出现任何可视化。

从进一步调查来看,我的数据框中是否有更多列似乎并不重要,如果我尝试为具有超过 28M 行的数据框绘制箱形图,那么我无法绘制它。

我知道可以render_mode="webgl"处理更大的数据,但我似乎只能为散点图和线图类型设置它。

所以我的问题是,有没有办法在 Plotly 中为大型数据框生成交互式箱线图?(同样的问题也适用于小提琴情节。)

如果没有,那么当行数大于 2800 万行时,阻止绘图的限制是什么?

如果这在 Plotly 中是不可能的,那么有没有人知道我可以使用 Python 生成大数据盒/小提琴图的任何替代工具?例如,这是否可能与 ggplot2 或同样的限制也存在?

我的最终目标是使用 Plotly 生成漂亮的交互式绘图,然后创建使用这些绘图的 Dash 仪表板。

非常感谢

23/10/19:附加测试:

我将 Plotly 降级到 3.10.0 并得到了相同的结果 - 没有渲染任何图形,我只是看到一个白屏。我现在已经再次升级回 4.2 版。

另外,我安装了袖扣。我按照此处描述的过程使袖扣与 Plotly 4 一起使用:https ://github.com/santosjorge/cufflinks/pull/203

Cufflinks 行为与 Plotly Express 行为几乎相同 - 如果我让绘图在笔记本中呈现,则不会发生任何事情(没有崩溃/错误,没有任何类型的输出,但单元格将自身标记为运行)。如果我按照接受的答案 Edit in Cufflinks for plotly: setting cufflinks config options launch 将其输出到 html 文件,那么它会生成一个非常大(大约 1.5gb)的 html 文件,打开时再次显示为白屏。

由于这个问题似乎是由处理大型数据框引起的,我认为 Jupyter 笔记本可能无法处理如此大量的数据。因此,我尝试iopub.data_rate根据https://community.plot.ly/t/tips-for-using-plotly-with-jupyter-notebook-5-0-the-latest-version/4156进行调整,但没有成功一个区别。

由于我在 Plotly Express 和 Cufflinks 中都遇到了非常相似的行为,这向我表明问题一定与 Plotly 本身有关?

有没有人成功地为更大的数据集制作箱形图或小提琴图?

标签: pythonpandasplotplotlydata-visualization

解决方案


最后,我的解决方案是转向全息视图。

import holoviews as hv
hv.extension('plotly')
boxwhisker = hv.BoxWhisker(test_df, 'occupation_status', 'age')
boxwhisker

输出[2]: 在此处输入图像描述

注意事项:

  1. 当我使用“散景”扩展时,我的情节呈现但不是交互式的。但是,当我使用“plotly”扩展时,我的交互式箱线图按上述成功制作。这真的很有趣,因为当我尝试直接使用 plotly 生成此图时,它仍然会使我的浏览器崩溃。

  2. 出于某种原因,我的“职业状态”类别已被截断为一个字母。我正在尝试使用 holoviews opts xrotation 和 xticks,但尚未解决此问题。这不是世界末日,但它会很好解决。


推荐阅读