Python Seaborn Distplot Y值对应于给定的X值

3
我需要在Seaborn distplot上绘制点,这些点对应于某些X值,使它们要么落在密度曲线上,要么落在密度曲线下方。以下是来自以下URL的distplot: 从Seaborn网站 - distplot示例 以下是带有代码的图像: enter image description here 例如,在上面显示的图中,我需要通过程序确定在密度曲线上落在X值为0处的Y轴值是多少。从图中可以看出,它大约在0.37左右。如何在我的程序中获取它?
假设可以完成这个任务,那么如何在所示的图中显示它,即哪一行代码将显示它。我正在将一组R可视化转换为Python。以下的R绘图显示了我想要实现的内容: enter image description here 看到图中显示的点了吗?有许多要绘制的点值,但如果您帮助我绘制一个,我可以尝试完成其余部分。我是Matplotlib和Seaborn软件包的初学者。
1个回答

11

enter image description here

为了获得distplot的kde曲线上某个点的y坐标,您可以使用该曲线的基础数据。您可以使用线条图中的get_data方法获取数据。然后,您可以使用例如numpy.interp对您感兴趣的点进行插值处理。
import seaborn.apionly as sns
import numpy as np; np.random.seed(0)
import matplotlib.pyplot as plt

x = np.random.randn(100)
ax = sns.distplot(x, hist_kws={"ec":"k"})
data_x, data_y = ax.lines[0].get_data()

xi = 0 # coordinate where to find the value of kde curve
yi = np.interp(xi,data_x, data_y)
print ("x={},y={}".format(xi, yi)) # prints x=0,y=0.3698
ax.plot([0],[yi], marker="o")
plt.show()

请问如何获得这个解决方案?
首先,我们要明确问题。我们有一个distplot并且想在kde曲线的某个点上画一个点。
  1. 查看文档;distplot函数是否有我们想要的参数?不幸的是没有。
  2. 该函数返回一个对象吗?是的。它是曲线吗?不幸的是不是。相反,它是一个matplotlib axes。(使用type()找出)
  3. 找出什么是matplotlib axes;阅读文档。唉,这很复杂,但我们偶然发现了一个方法axes.get_lines();由于曲线应该是一条直线,因此可以帮助找到。
  4. 找出那些线是什么:它们是Line2D对象。再次查看文档,我们发现有一个方法get_data。所以现在我们有了曲线的数据。太好了!
  5. 此时,如果我们有一个函数,可以调用x值来接收相应的y值,那就更好了。现在似乎需要自己找到那个函数。
  6. 因此,给定曲线的xy数据,如何找到给定x值的y值?由于数据是离散的,我们需要进行插值。寻找“插值”和“python”最终将我们带到numpy.interp。因此,这为我们提供了绘制点所需的坐标。
  7. 找出如何绘制一个点。那很容易。有很多这方面的例子。

就是这样。


1
这个很好用。我有一个后续问题。怎么知道这个呢?或者说,你是怎么知道的?是按照结构化路径学习的还是通过经验获得的宝贵知识?我是一名有经验的程序员,刚接触Python和Seaborn不久,但已经编程了一段时间。有没有获取这些知识的方法? - Bharat
1
我更新了答案,包括从问题描述开始如何获得解决方案。这可能有助于理解整个过程。 - ImportanceOfBeingErnest
感谢您对该过程进行的出色解释。此致敬礼。Bharat - Bharat
谢谢,你的回答帮助了我解决了问题。如果有人遇到ax.lines[0].get_data()的问题,请尝试使用ax.get_lines()[0].get_data() - Jakub Siwiec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接