Seaborn Catplot绘制耗时超10分钟,如何优化提升运行速度?
Seaborn catplot 绘图耗时过长优化方案
核心原因
你当前使用的catplot是Seaborn的FacetGrid级封装函数,自带大量分面布局相关的额外计算,且未显式指定参数时,函数默认执行的分类推断、散点抖动计算、大量刻度的自动布局操作都会被563个城市分类放大,最终导致耗时异常。另外Matplotlib渲染默认是单线程执行,所以不会占满CPU资源,属于正常现象。
可落地优化方法
- 替换为Axes级绘图函数,去掉不必要的FacetGrid开销
你没有分面需求,完全不需要使用catplot,直接使用底层的stripplot/barplot即可,代码示例:import matplotlib.pyplot as plt import pandas as pd import seaborn as sns # 提前将City转为分类类型,避免Seaborn运行时推断排序 # 如果需要按特定顺序排序,可自定义categories参数 city_lit_rate_long['City'] = pd.Categorical(city_lit_rate_long['City'], ordered=True) # 直接用Axes级函数绘图,替换catplot fig, ax = plt.subplots(figsize=(10, 5)) # 对应你之前的height=5,aspect=2参数 sns.stripplot( data=city_lit_rate_long, y='City', x='Literacy Levels', hue='Legend', jitter=0, # 每个分组只有1个数据点,无需抖动计算 dodge=0.2, # 分组偏移宽度,可按需调整 ax=ax ) ax.legend(loc='best') plt.tight_layout() - 关闭不必要的自动计算特性
若仍需使用catplot,可添加以下参数减少无效计算:plot=sns.catplot( data=city_lit_rate_long, y='City', x='Literacy Levels', hue='Legend', height=5, aspect=2, legend=True, legend_out=False, jitter=0, # 关闭抖动计算 dodge=0.2 ) - 更换Matplotlib渲染后端
Jupyter环境默认的inline后端渲染大量分类标签时效率较低,可在绘图前运行魔法命令切换到更快的后端:# 非交互式渲染,适合直接导出图片 %matplotlib agg # 如需交互式查看可使用qt/osx后端,需提前安装对应依赖 # %matplotlib qt - 调整渲染精度
不需要高清矢量图时,可降低渲染dpi进一步提速:plt.rcParams['figure.dpi'] = 100
以上优化全部落地后,绘图耗时可降至2秒以内。
内容的提问来源于stack exchange,提问作者geoabram
相关产品推荐
相关产品推荐

