在 Seaborn 群图上以图形方式显示平均值
Displaying Averages Graphically on Seaborn Swarm Plots
假设我有以下 seaborn swarmplot:
import seaborn as sns
sns.set_theme(style="whitegrid")
tips = sns.load_dataset("tips")
ax = sns.swarmplot(x="day", y="total_bill", data=tips)
在绘图上显示每个群的平均值的简单方法是什么,或许可以使用不同的符号,例如“X”?
要获得 python 中值的平均值,您可以执行
def avg(arr): # arr is a list of values to get the average of
return sum(arr) / len(arr)
您可以使用 pandas' groupby
来汇总均值。然后 sns.scatterplot
绘制它们。由于某种原因,散点图重置了视图限制。您可以先保存 xlim
和 ylim
,然后再重置它们。要将散点图放在群图之上,可以设置 zorder(尝试使用 Seaborn 0.11.1):
import seaborn as sns
sns.set_theme(style="whitegrid")
tips = sns.load_dataset("tips")
ax = sns.swarmplot(x="day", y="total_bill", data=tips)
df_means = tips.groupby("day")["total_bill"].agg("mean").reset_index()
xlim = ax.get_xlim()
ylim = ax.get_ylim()
sns.scatterplot(x="day", y="total_bill", marker='X', color='black', s=100, zorder=3, ax=ax, legend=False, data=df_means)
ax.set_xlim(xlim)
ax.set_ylim(ylim)
plt.show()
PS:获得所需视图限制的另一种解决方法是首先绘制均值(但 zorder
至少 4),然后绘制群图:
ax = sns.scatterplot(x="day", y="total_bill", marker='X', color='black', s=100, zorder=4, legend=False, data=df_means)
sns.swarmplot(x="day", y="total_bill", data=tips, ax=ax)
另一种方法是在箱线图上绘制群图,如 swarmplot's manual page 上的最后一个示例。
假设我有以下 seaborn swarmplot:
import seaborn as sns
sns.set_theme(style="whitegrid")
tips = sns.load_dataset("tips")
ax = sns.swarmplot(x="day", y="total_bill", data=tips)
在绘图上显示每个群的平均值的简单方法是什么,或许可以使用不同的符号,例如“X”?
要获得 python 中值的平均值,您可以执行
def avg(arr): # arr is a list of values to get the average of
return sum(arr) / len(arr)
您可以使用 pandas' groupby
来汇总均值。然后 sns.scatterplot
绘制它们。由于某种原因,散点图重置了视图限制。您可以先保存 xlim
和 ylim
,然后再重置它们。要将散点图放在群图之上,可以设置 zorder(尝试使用 Seaborn 0.11.1):
import seaborn as sns
sns.set_theme(style="whitegrid")
tips = sns.load_dataset("tips")
ax = sns.swarmplot(x="day", y="total_bill", data=tips)
df_means = tips.groupby("day")["total_bill"].agg("mean").reset_index()
xlim = ax.get_xlim()
ylim = ax.get_ylim()
sns.scatterplot(x="day", y="total_bill", marker='X', color='black', s=100, zorder=3, ax=ax, legend=False, data=df_means)
ax.set_xlim(xlim)
ax.set_ylim(ylim)
plt.show()
PS:获得所需视图限制的另一种解决方法是首先绘制均值(但 zorder
至少 4),然后绘制群图:
ax = sns.scatterplot(x="day", y="total_bill", marker='X', color='black', s=100, zorder=4, legend=False, data=df_means)
sns.swarmplot(x="day", y="total_bill", data=tips, ax=ax)
另一种方法是在箱线图上绘制群图,如 swarmplot's manual page 上的最后一个示例。