matplotlib 如何在海运箱线图下添加条形图(默认情况下它总是在顶部)?

nkhmeac6  于 2023-02-13  发布在  其他
关注(0)|答案(2)|浏览(168)

似乎stripplot(或swarmplot)总是自动添加到boxplot的顶部,即使我在调用一个函数之前调用另一个函数。
我在这里错过了什么吗?如何使条形图在箱线图后面?而且,我实际上只是使用箱线图来使用菱形标记的“平均值”。
下面是一个示例代码,说明我现在如何调用这些函数:

fig, axs = plt.subplots(nrows=1, ncols=1, figsize=(5, 4), dpi=200)
sns.boxplot(ax=axs, data=df, x='region', y='measure', hue='group',
            meanprops={'marker' : 'D', 'markeredgecolor' : 'black', 'markersize' : 6},
            medianprops={'visible': False}, whiskerprops={'visible': False},
            showmeans=True, showfliers=False, showbox=False, showcaps=False)
sns.stripplot(ax=axs, data=df, x='region', y='measure', hue='group',
              dodge=True, jitter=0.05)
plt.show()

The plot currently

nfzehxib

nfzehxib1#

您可以添加sns.stripplot(..., zorder=0)以将条形图放在其他元素下方。
要在图例中包含均值,您可以添加一个label。由于这将标记每个单独的均值,您可以收集所有图例句柄,并过滤掉第一个句柄,以及表示stripplot的点的PathCollection,同时也会忽略表示左侧框的矩形。

import matplotlib.pyplot as plt
from matplotlib.collections  import PathCollection
from matplotlib.lines  import Line2D
import seaborn as sns

tips = sns.load_dataset('tips')
fig, axs = plt.subplots(figsize=(5, 4))
sns.boxplot(ax=axs, data=tips, x='day', y='tip', hue='smoker',
            meanprops={'marker' : 'D', 'markeredgecolor' : 'black', 'markersize' : 6, 'label':'mean'},
            medianprops={'visible': False}, whiskerprops={'visible': False},
            showmeans=True, showfliers=False, showbox=False, showcaps=False)
sns.stripplot(ax=axs, data=tips, x='day', y='tip', hue='smoker', palette='autumn',
              dodge=True, jitter=0.05, zorder=0)
handles, _ = axs.get_legend_handles_labels()
new_handles = [h for h in handles if isinstance(h, PathCollection)] + [h for h in handles if isinstance(h, Line2D)][:1]
axs.legend(handles=new_handles, title=axs.legend_.get_title().get_text())
plt.show()

irlmq6kh

irlmq6kh2#

如果要使用两个或更多绘图

fig, ax = plt.subplots(2,2, figsize=(20, 15))

使用ax=ax[0,1],行和列,

sns.boxplot(x = 'bedrooms', y = 'price', data = dataset_df, ax=ax[0,1])
sns.boxplot(x = 'floor, y = 'price', data = dataset_df,  ax=ax[0,2])

相关问题