matplotlib 在子图中绘制两个海运图

7fyelxc5  于 2023-05-23  发布在  其他
关注(0)|答案(1)|浏览(206)

我需要并排绘制两张图。这里是我的数据集中我感兴趣的列。

X
1
53
12
513
135
125
21
54
1231

是的

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
mean = df['X'].mean()
    
fig, ax =plt.subplots(1,2)
sns.displot(df, x="X", kind="kde", ax=ax[0]) # 1st plot
plt.axvline(mean, color='r', linestyle='--') # this add just a line on the previous plot, corresponding to the mean of X data
sns.boxplot(y="X", data=df, ax=ax[2]) # 2nd plot

但我有这个错误:IndexError: index 2 is out of bounds for axis 0 with size 2,所以使用子图是错误的。

o75abkj4

o75abkj41#

sns.boxplot(..., ax=ax[2])应该使用ax=ax[1],因为不存在ax[2]
sns.displot是一个图形级函数,它创建自己的图形,并且不接受ax=参数。如果只需要一个子图,则可以用sns.histplotsns.kdeplot替换。
plt.axvline()在“当前”ax上绘制。您可以使用ax[0].axvline()在特定子图上绘制。参见What is the difference between drawing plots using plot, axes or figure in matplotlib?
下面的代码已经在Seaborn 0.11.1中测试过:

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

sns.set()
df = pd.DataFrame({'X': [1, 53, 12, 513, 135, 125, 21, 54, 1231]})
mean = df['X'].mean()

fig, ax = plt.subplots(1, 2)
sns.kdeplot(data=df, x="X", ax=ax[0])
ax[0].axvline(mean, color='r', linestyle='--')
sns.boxplot(y="X", data=df, ax=ax[1])
plt.show()

相关问题