如何在垂直线绘制的地方绘制垂直线? [单个图中的多个分布]

时间:2019-06-14 16:30:09

标签: python matplotlib plot seaborn

使用this question的答案,我可以根据需要生成dist图。但是,当我想将相同的解决方案应用于多个绘图时,它似乎无法按预期工作。我正在寻找建议的解决方案。这是我正在尝试做的事情:

import seaborn as sns, numpy as np
from scipy import stats
import matplotlib.pyplot as plt
plt.figure(figsize=(20,10))

sns.set(); np.random.seed(0)
data01 = np.random.normal(10, 5, 1000)
data02 = np.random.normal(20, 5, 1000)

ax1 = sns.distplot(data01, color = 'blue', kde = True)

x1 = ax1.lines[0].get_xdata()
y1 = ax1.lines[0].get_ydata()
plt.axvline(x1[np.argmax(y1)], color='blue')

ax2 = sns.distplot(data02, color = 'red', kde = True)

x2 = ax2.lines[0].get_xdata()
y2 = ax2.lines[0].get_ydata()
plt.axvline(x2[np.argmax(y2)], color='red')

plt.legend()

这是我得到的,这不是我期望的(两条垂直线,每条垂直线):

enter image description here

1 个答案:

答案 0 :(得分:1)

您需要使用正确的索引:索引0用于蓝色kde,索引1用于蓝色垂直线,索引2用于红色kde。

直觉上,顾名思义,ax2.lines为您提供了当前图形上的所有行的集合。第二次使用distplotkde=True绘制2时,已经有2条线(先前的kde和垂直线),因此第二个kde的索引为ax1,因为在python中索引从0开始。这是因为您正在使用同一图形对象,因此从ax2绘制的艺术家也将被带到0。相反,如果您要有单独的子图,那么您将对两个子图使用相同的索引ax1 = sns.distplot(data01, color = 'blue', kde = True) x1 = ax1.lines[0].get_xdata() y1 = ax1.lines[0].get_ydata() plt.axvline(x1[np.argmax(y1)], color='blue') ax2 = sns.distplot(data02, color = 'red', kde = True) x2 = ax2.lines[2].get_xdata() # <--- Use correct index 2 here y2 = ax2.lines[2].get_ydata() # <--- Use correct index 2 here plt.axvline(x2[np.argmax(y2)], color='red') plt.legend()

i

enter image description here