Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在0和平均值y之间的距离图上绘制平均线?_Python_Matplotlib_Seaborn_Distribution - Fatal编程技术网

Python 如何在0和平均值y之间的距离图上绘制平均线?

Python 如何在0和平均值y之间的距离图上绘制平均线?,python,matplotlib,seaborn,distribution,Python,Matplotlib,Seaborn,Distribution,我有一个距离图,我想画一条平均线,从0到平均频率的y值,但是当distplot停止时,让行停止。为什么没有一个简单的参数可以做到这一点?这将非常有用 我有一些代码可以让我几乎达到目的: plt.plot([x.mean(),x.mean()], [0, *what here?*]) 除了我想要的y值之外,这段代码按照我想要的方式绘制一条线。正确的数学方法是如何使y max停止在距离图中平均值的频率处?下面是我的一个DistPlot的示例,使用0.6作为y-max。如果有一些数学方法让它停在平

我有一个距离图,我想画一条平均线,从0到平均频率的y值,但是当distplot停止时,让行停止。为什么没有一个简单的参数可以做到这一点?这将非常有用

我有一些代码可以让我几乎达到目的:

plt.plot([x.mean(),x.mean()], [0, *what here?*])

除了我想要的y值之外,这段代码按照我想要的方式绘制一条线。正确的数学方法是如何使y max停止在距离图中平均值的频率处?下面是我的一个DistPlot的示例,使用0.6作为y-max。如果有一些数学方法让它停在平均值的y值上,那就太棒了。我试过用平均数除以计数等

使用可以获得当前绘图的限制:[底部,顶部]。
因此,在您的情况下,您可以提取实际限制并将其保存在
ylim
中,然后绘制线:

fig, ax = plt.subplots()

ylim = ax.get_ylim()
ax.plot([x.mean(),x.mean()], ax.get_ylim())
ax.set_ylim(ylim)

ax.plot
随后更改ylim时,您必须如上所述使用
ax.set_ylim
重新设置它们。

更新最新版本的matplotlib(
3.3.4
)和seaborn(
0.11.1
):具有
shade=True
的kdeplot现在不再创建线条对象。要获得与以前相同的结果,设置
shade=False
仍将创建线对象。然后可以用
ax.fill\u between()
填充曲线。下面的代码将相应地更改。(使用以查看旧版本。)

ax.lines[0]
获取kde的曲线,您可以从中提取x和y数据。
np.interp
然后可以找到给定x值的曲线高度:

将numpy导入为np
将matplotlib.pyplot作为plt导入
导入seaborn作为sns
x=np.随机.正常(np.平铺(np.随机.均匀(10,30,5,50),3)
ax=sns.kdeplot(x,shade=False,color='crimson')
kdeline=最大线[0]
平均值=x.平均值()
xs=kdeline.get_xdata()
ys=kdeline.get_ydata()
高度=np.INTP(平均值,xs,ys)
ax.V线(平均值,0,高度,颜色='深红色',ls=':')
(x,0,ys,facecolor='crimson',alpha=0.2)之间的最大填充量
plt.show()

同样的方法可以扩展到显示平均值和标准偏差,或中位数和四分位数:

导入matplotlib.pyplot作为plt
导入seaborn作为sns
将numpy作为np导入
x=np.随机.正常(np.平铺(np.随机.均匀(10,30,5,50),3)
图,轴=plt.子批次(ncols=2,figsize=(12,4))
对于轴中的ax:
sns.kdeplot(x,shade=False,color='crimson',ax=ax)
kdeline=最大线[0]
xs=kdeline.get_xdata()
ys=kdeline.get_ydata()
如果ax==轴[0]:
中间=x.平均值()
sdev=x.std()
左=中-sdev
右=中间+sdev
ax.集合标题(“显示平均值和sdev”)
其他:
左、中、右=百分位数(x,[25,50,75])
ax.集合标题(“显示中值和四分位数”)
ax.vline(中间,0,np.interp(中间,xs,ys),color='crimson',ls=':')
(x,0,ys,facecolor='crimson',alpha=0.2)之间的最大填充量

ax.fill_between(xs,0,ys,where=(左)“为什么没有一个简单的参数来实现这一点?”因为如果库试图构建一个处理每个域和用户特定用例的API,那么该API将非常臃肿,难以使用,并且是一个难以维护的负担。您能解释一下标题之间的区别吗“在y轴极限之间”和“从0到平均频率y值的一条线”?(顺便说一下,曲线显示的是频率,而不是频率。)为了考虑到您提到的缺点,我更新了我的答案,感谢您在
ylim
上发出了一些小的不推荐警告,并且不得不从
ax.vlines
中删除参数
ls
,但总体上回答得很好谢谢您的反馈。我无法重现
ylim
ls=/code>的问题>ax.vlines
。我现在使用seaborn 0.11.1和matplotlib 3.3.4进行了测试,发现
shade=True
不再创建线条对象存在问题。更新的代码现在应该适用于这些版本。我还注意到
ax.set_ylim()
不再需要,所以我忽略了它。
    mode_idx = np.argmax(ys)
    ax.vlines(xs[mode_idx], 0, ys[mode_idx], color='lime', ls='--')