Mon*_*ave 4 python matplotlib seaborn
要自定义小提琴图中显示的箱线图的样式,可以尝试在小提琴图前面绘制箱线图。然而,这似乎不起作用,因为使用 seaborn 时它总是显示在小提琴图后面。
当使用seaborn + matplotlib时,这是有效的(但仅适用于单个类别):
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
df=pd.DataFrame(np.random.rand(10,2)).melt(var_name='group')
fig, axes = plt.subplots()
# Seaborn violin plot
sns.violinplot(y=df[df['group']==0]['value'], color="#af52f4", inner=None, linewidth=0, saturation=0.5)
# Normal boxplot has full range, same in Seaborn boxplot
axes.boxplot(df[df['group']==0]['value'], whis='range', positions=np.array([0]),
showcaps=False,widths=0.06, patch_artist=True,
boxprops=dict(color="indigo", facecolor="indigo"),
whiskerprops=dict(color="indigo", linewidth=2),
medianprops=dict(color="w", linewidth=2 ))
axes.set_xlim(-1,1)
plt.show()
Run Code Online (Sandbox Code Playgroud)
然而,当仅使用seaborn能够跨多个类别进行绘图时,顺序总是错误的:
sns.violinplot(data=df, x='group', y='value', color="#af52f4", inner=None, linewidth=0, saturation=0.5)
sns.boxplot(data=df, x='group', y='value', saturation=0.5)
plt.show()
Run Code Online (Sandbox Code Playgroud)
即使尝试用此方法修复此zorder
问题也不起作用。
zorder
的参数仅sns.boxplot
影响箱线图的线条,但不影响矩形箱。
一种可能性是事后访问这些框;他们组成了 的艺术家名单ax.artists
。设置他们的意志zorder=2
将他们放在小提琴前面,同时仍然位于其他箱线图线后面。
@mwaskom 在评论中指出了更好的方法。sns.boxplot
将所有它无法识别的参数委托**kwargs
给ax.boxplot
。其中之一是boxprops
长方体的属性。所以,boxprops={'zorder': 2}
只会改变zorder
盒子的。
这是一个例子:
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(10, 2)).melt(var_name='group')
ax = sns.violinplot(data=df, x='group', y='value', color="#af52f4", inner=None, linewidth=0, saturation=0.5)
sns.boxplot(data=df, x='group', y='value', saturation=0.5, width=0.4,
palette='rocket', boxprops={'zorder': 2}, ax=ax)
plt.show()
Run Code Online (Sandbox Code Playgroud)
这是使用tips
数据集的另一个示例:
tips = sns.load_dataset('tips')
ax = sns.violinplot(data=tips, x='day', y='total_bill', palette='turbo',
inner=None, linewidth=0, saturation=0.4)
sns.boxplot(x='day', y='total_bill', data=tips, palette='turbo', width=0.3,
boxprops={'zorder': 2}, ax=ax)
Run Code Online (Sandbox Code Playgroud)