首页 > 解决方案 > Seaborn 箱线图和线图未正确显示

问题描述

我正在尝试将 seaborn 线图覆盖在 seaborn 箱线图上 结果以某种方式“令人震惊”:) 看起来这两个图放在同一个图中但分开 箱线图在左侧压缩,线图是压缩在右侧

请注意,如果我分别运行这两个图表,它们可以正常工作我无法弄清楚如何使它工作提前谢谢您的帮助

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

mydata = pd.DataFrame({
    'a':[2012, 2012, 2012, 2012, 2013, 2013, 2013, 2013, 2014, 2014, 2014, 2014, 2015, 2015, 2015, 2015, 2016, 2016, 2016, 2016, 2017, 2017, 2017, 2017, 2018, 2018, 2018, 2018, 2019, 2019, 2019, 2019, 2020, 2020, 2020, 2020],
    'v':[383.00, 519.00, 366.00, 436.00, 1348.00, 211.00, 139.00, 614.00, 365.00, 365.00, 383.00, 602.00, 994.00, 719.00, 589.00, 365.00, 990.00, 1142.00, 262.00, 1263.00, 507.00, 222.00, 363.00, 274.00, 195.00, 730.00, 730.00, 592.00, 479.00, 607.00, 292.00, 657.00, 453.00, 691.00, 673.00, 705]
})

means =mydata.groupby('a').v.mean().reset_index()

fig, ax = plt.subplots(figsize=(15,8))
sns.boxplot(data=mydata, x='a', y='v', ax=ax, showfliers=False)
sns.lineplot(data=means, x='a', y='v', ax=ax)
plt.show()

标签: pythonseabornoverlayboxplot

解决方案


令人惊讶的是,我没有找到这个问题的重复答案,所以我将我的评论提升为一个。起来,先生 评论:

而不是lineplot,您应该使用pointplot

...
sns.boxplot(data=mydata, x='a', y='v', ax=ax, showfliers=False)
sns.pointplot(data=means, x='a', y='v', ax=ax) 
plt.show()

样本输出:

在此处输入图像描述

Pointplot 等效于lineplot用于 的分类变量boxplot。请在此处阅读有关关系和分类绘图的更多信息。

lineplot问题出现了,为什么以下数据没有问题:

mydata = pd.DataFrame({'a':["m1", "m1", "m1", "m2", "m2", "m2", "m2", "m3", "m3", "m3", "m3", "m4", "m4", "m4", "m4"],     'v':[11.37, 11.31, 10.93, 9.43, 9.62, 6.61, 9.31, 11.27, 8.47, 11.86, 8.77, 8.8, 9.58, 12.26, 10] })  
means =mydata.groupby('a').v.mean().reset_index()  
print(means)
fig, ax = plt.subplots(figsize=(15,8)) 
sns.boxplot(data=mydata, x='a', y='v', ax=ax, showfliers=False) 
sns.lineplot(data=means, x='a', y='v', ax=ax) 
plt.show()

输出: 在此处输入图像描述

不同的是,这个例子没有任何歧义lineplot。Seabornlineplot可以同时使用分类数据和数值数据。看起来,代码首先尝试将其绘制为数值数据,如果这不可能,则将它们用作分类变量(我不知道源代码)。这可能是 seaborn 的一个很好的软件决策,因为另一种情况(不接受分类数据)会比人们试图将分类数据和数值数据绘制到同一个图中的罕见情况造成更多的问题。不过,seaborn 的警告将是一件好事。


推荐阅读