如何让Seaborn适配Matplotlib rcParams自定义样式?
问题描述
我正在为公司编写自定义Matplotlib样式表,需要修改箱线图的线条颜色。通过字典更新rcParams参数后,Matplotlib原生绘制的箱线图样式正常生效,但Seaborn绘制的箱线图仅部分参数生效。如何让Seaborn强制使用自定义样式表?
示例代码:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt df_penguins = pd.read_csv( "https://raw.githubusercontent.com/mwaskom/seaborn-data/master/penguins.csv" ) ex = { 'boxplot.boxprops.color': 'hotpink', 'boxplot.notch': True, 'boxplot.patchartist': False, 'boxplot.showbox': True, 'boxplot.showcaps': True, 'boxplot.showfliers': True, 'boxplot.showmeans': False, 'boxplot.vertical': True, 'boxplot.whiskerprops.color': 'hotpink', 'boxplot.whiskerprops.linestyle': '--', 'boxplot.whiskerprops.linewidth': 1.0, 'boxplot.whiskers': 1.5, } plt.rcParams.update(**ex) fig, (ax1, ax2) = plt.subplots( ncols=2, sharey=True, figsize=plt.figaspect(0.5) ) sns.boxplot(data=df_penguins, y="body_mass_g", ax=ax1) ax2.boxplot(df_penguins.body_mass_g.dropna()) plt.show()
样式对比图:
解决方法
Seaborn的boxplot默认会覆盖部分Matplotlib的rcParams设置,因为它自带一套样式逻辑。要让Seaborn完全遵循自定义样式,可采用以下方案:
1. 通过sns.set_style传入自定义参数
在更新Matplotlib的rcParams后,调用sns.set_style并传入你的自定义参数,让Seaborn基于指定基础样式(如whitegrid)应用自定义设置:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt df_penguins = pd.read_csv( "https://raw.githubusercontent.com/mwaskom/seaborn-data/master/penguins.csv" ) ex = { 'boxplot.boxprops.color': 'hotpink', 'boxplot.notch': True, 'boxplot.patchartist': False, 'boxplot.showbox': True, 'boxplot.showcaps': True, 'boxplot.showfliers': True, 'boxplot.showmeans': False, 'boxplot.vertical': True, 'boxplot.whiskerprops.color': 'hotpink', 'boxplot.whiskerprops.linestyle': '--', 'boxplot.whiskerprops.linewidth': 1.0, 'boxplot.whiskers': 1.5, } # 关键步骤:让Seaborn应用自定义参数 sns.set_style("whitegrid", rc=ex) plt.rcParams.update(**ex) fig, (ax1, ax2) = plt.subplots( ncols=2, sharey=True, figsize=plt.figaspect(0.5) ) sns.boxplot(data=df_penguins, y="body_mass_g", ax=ax1) ax2.boxplot(df_penguins.body_mass_g.dropna()) plt.show()
2. 使用Matplotlib样式表文件(推荐长期自定义)
把自定义参数写入.mplstyle格式的样式文件,比如custom_boxplot.mplstyle:
boxplot.boxprops.color: hotpink boxplot.notch: True boxplot.patchartist: False boxplot.showbox: True boxplot.showcaps: True boxplot.showfliers: True boxplot.showmeans: False boxplot.vertical: True boxplot.whiskerprops.color: hotpink boxplot.whiskerprops.linestyle: -- boxplot.whiskerprops.linewidth: 1.0 boxplot.whiskers: 1.5
然后在代码中加载样式表,并重置Seaborn样式以完全遵循Matplotlib设置:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 加载自定义样式表 plt.style.use("custom_boxplot.mplstyle") # 禁用Seaborn自带样式,完全沿用Matplotlib设置 sns.set_style(None) df_penguins = pd.read_csv( "https://raw.githubusercontent.com/mwaskom/seaborn-data/master/penguins.csv" ) fig, (ax1, ax2) = plt.subplots( ncols=2, sharey=True, figsize=plt.figaspect(0.5) ) sns.boxplot(data=df_penguins, y="body_mass_g", ax=ax1) ax2.boxplot(df_penguins.body_mass_g.dropna()) plt.show()
3. 直接给Seaborn boxplot传入参数(临时调整单个图表)
如果只需调整单个箱线图,可在调用sns.boxplot时直接传入样式参数,强制覆盖默认设置:
sns.boxplot( data=df_penguins, y="body_mass_g", ax=ax1, boxprops={'color': 'hotpink'}, whiskerprops={'color': 'hotpink', 'linestyle': '--', 'linewidth': 1.0}, notch=True )
内容的提问来源于stack exchange,提问作者GiusWestsideDS
相关产品推荐
相关产品推荐

