Databricks中Seaborn 0.11.2绘图报错且无法改版本的解决办法
解决Databricks中Seaborn 0.11.2绘制直方图的OptionError问题
问题描述
在Databricks环境运行以下代码创建直方图时,反复报错OptionError: "No such keys(s): 'mode.use_inf_as_null'",且无法修改或重新安装Seaborn(0.11.2版本)及相关依赖版本:
import matplotlib.pyplot as plt import pandas as pd import random import seaborn as sns random.seed(2023) # 保证每次生成相同的图 x = [random.randrange(100) for _ in range(100)] y = [random.randrange(100) for _ in range(100)] df = pd.concat(axis=0, ignore_index=True, objs=[ pd.DataFrame.from_dict({'value': x, 'name': 'x'}), pd.DataFrame.from_dict({'value': y, 'name': 'y'}) ]) fig, ax = plt.subplots() sns.histplot( data=df, x='value', hue='name', multiple='dodge', bins=range(1, 110, 10), ax=ax ) sns.move_legend(ax, bbox_to_anchor=(1, 0.5), loc='center left', frameon=False)
报错信息:
OptionError: "No such keys(s): 'mode.use_inf_as_null'"
原因分析
Seaborn 0.11.2会调用pandas中已被移除的mode.use_inf_as_null配置项,但当前Databricks环境的pandas版本较高,该配置已被废弃/删除,导致版本不兼容,且无法调整依赖版本。
可行解决办法
方法1:添加pandas配置兼容映射
在导入Seaborn前,给pandas的配置系统添加该废弃项的兼容映射,让Seaborn调用时不会报错:
import pandas as pd # 给废弃配置项添加映射,指向当前有效的配置 pd._config.config._deprecated_options['mode.use_inf_as_null'] = 'mode.use_inf_as_na' # 后续导入其他库并执行原代码 import matplotlib.pyplot as plt import random import seaborn as sns random.seed(2023) x = [random.randrange(100) for _ in range(100)] y = [random.randrange(100) for _ in range(100)] df = pd.concat(axis=0, ignore_index=True, objs=[ pd.DataFrame.from_dict({'value': x, 'name': 'x'}), pd.DataFrame.from_dict({'value': y, 'name': 'y'}) ]) fig, ax = plt.subplots() sns.histplot( data=df, x='value', hue='name', multiple='dodge', bins=range(1, 110, 10), ax=ax ) sns.move_legend(ax, bbox_to_anchor=(1, 0.5), loc='center left', frameon=False)
方法2:直接用Matplotlib实现相同效果
如果上述方法无效,绕过Seaborn直接使用Matplotlib绘制分组直方图,完全避开版本兼容问题:
import matplotlib.pyplot as plt import pandas as pd import random random.seed(2023) x = [random.randrange(100) for _ in range(100)] y = [random.randrange(100) for _ in range(100)] df = pd.concat(axis=0, ignore_index=True, objs=[ pd.DataFrame.from_dict({'value': x, 'name': 'x'}), pd.DataFrame.from_dict({'value': y, 'name': 'y'}) ]) fig, ax = plt.subplots() # 提取分组数据 x_vals = df[df['name'] == 'x']['value'] y_vals = df[df['name'] == 'y']['value'] # 设置直方图区间 bins = range(1, 110, 10) # 绘制分组直方图(dodge=True实现并列效果) ax.hist([x_vals, y_vals], bins=bins, label=['x', 'y'], alpha=0.7, dodge=True) # 设置图例位置 ax.legend(bbox_to_anchor=(1, 0.5), loc='center left', frameon=False) plt.show()
内容的提问来源于stack exchange,提问作者DBA_player
相关产品推荐
相关产品推荐

