python - 使用大型数据框绘图时,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 本身有关?
有没有人成功地为更大的数据集制作箱形图或小提琴图?
解决方案
最后,我的解决方案是转向全息视图。
import holoviews as hv
hv.extension('plotly')
boxwhisker = hv.BoxWhisker(test_df, 'occupation_status', 'age')
boxwhisker
注意事项:
当我使用“散景”扩展时,我的情节呈现但不是交互式的。但是,当我使用“plotly”扩展时,我的交互式箱线图按上述成功制作。这真的很有趣,因为当我尝试直接使用 plotly 生成此图时,它仍然会使我的浏览器崩溃。
出于某种原因,我的“职业状态”类别已被截断为一个字母。我正在尝试使用 holoviews opts xrotation 和 xticks,但尚未解决此问题。这不是世界末日,但它会很好解决。
推荐阅读
- javascript - 如何在 VueJS 中为 formBuilder 嵌入 jQuery
- arm - 新手会引起一些混乱;在 uboot/board 文件夹中,但未指定我的供应商名称 - lichee Pi Zero
- azure - 如何修复“Http11NioProtocol:读取请求时出错,被忽略”
- javascript - 如何从库 react-edittext 中的按钮中删除 `text-decoration: line-through`?
- java - 使用 NAT 向 IP 发送 UDP 数据包
- windows - 即使将防火墙规则定义为允许,Google Windows 实例也未启用 445/139 端口
- java - Selenium:网页弹出/警报/通知消息的元素不可见异常
- db2 - 如何在 IIAS 数据库中设置作业或会话优先级
- pandas - DolphinDB 时间序列数据的滚动窗口
- sapui5 - 将按钮添加到图标选项卡栏