Seaborn 箱线图和线图显示不正确
Seaborn boxplot and lineplot not showing properly
我正在尝试将 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()
令人惊讶的是,我没有找到这个问题的重复答案,所以我将我的评论提升为一个。站起来,先生评论:
而不是 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
for categorical variables that are used for boxplot
. Please read 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 的警告将是一件好事。
我正在尝试将 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()
令人惊讶的是,我没有找到这个问题的重复答案,所以我将我的评论提升为一个。站起来,先生评论:
而不是 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
for categorical variables that are used for boxplot
. Please read 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 的警告将是一件好事。