【问题标题】:Seaborn boxplot and lineplot not showing properlySeaborn 箱线图和线图未正确显示
【发布时间】:2021-04-02 00:03:45
【问题描述】:

我正在尝试将 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()

【问题讨论】:

标签: python seaborn overlay boxplot


【解决方案1】:

令人惊讶的是,我没有找到与此问题相同且答案良好的重复项,因此我将我的评论提升为一个。起来,先生评论:

您应该使用pointplot,而不是lineplot

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

样本输出:

对于用于boxplot 的分类变量,Pointplot 等效于lineplot。请阅读here more about relational and categorical plotting

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

【讨论】:

  • 谢谢T先生,它可以工作,但是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() 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()
  • 我在上一条评论中发布的代码适用于线图这就是为什么我发现线图的行为很奇怪。但确定我不明白的东西
  • 请查看更新。也许其他人对 seaborn 的内部运作有更深入的了解,并且对此有更好的解释。
猜你喜欢
  • 1970-01-01
  • 2017-12-09
  • 1970-01-01
  • 2017-05-14
  • 2020-08-03
  • 2021-03-08
  • 1970-01-01
  • 1970-01-01
  • 2019-01-31
相关资源
最近更新 更多