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

Posted

技术标签:

【中文标题】Python Seaborn Distplot Y 值对应于给定的 X 值【英文标题】:Python Seaborn Distplot Y value corresponding to a given X value 【发布时间】:2017-09-19 19:47:37 【问题描述】:

我需要在 Seaborn distplot 上绘制与某些 X 值相对应的点,以便它们落在密度曲线上或低于它。这是来自以下 URL 的 distplot: From the Seaborn site - distplot examples

这是带有代码的图像:

例如,在上面显示的图中,我需要以编程方式确定与落在密度曲线上的 X 值 0 对应的 Y 轴值是多少。从图中,它似乎在 0.37 左右。我怎样才能在我的程序中得到它?

假设可以做到,那么我如何在显示的图中显示它,即哪一行代码将显示它。我正在将一组 R 可视化转换为 Python。 R中的以下图显示了我想要实现的目标:

看到曲线上显示的点了吗?有很多点值要画,但如果你帮我画一个,我可以试着做剩下的。我是 Matplotlib 和 Seaborn 软件包的初学者。

【问题讨论】:

【参考方案1】:

为了获得 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()


在 cmets 中被问及如何获得此解决方案:

从问题开始。我们有一个 distplot,我们想在它的 kde 曲线上的某个点上画一个点。

    查看文档; distplot 函数是否有一个参数可以满足我们的要求?不幸的是没有。 函数是否返回一个对象?是的。是曲线吗?不幸的是没有。相反,它是一个 matplotlib 轴。 (通过type() 找出答案) 找出matplotlib轴是什么;阅读the documentation。呃,它很重,但我们偶然发现了一个方法axes.get_lines();因为曲线应该是一条线,这应该会有所帮助。 找出这些行是什么:它们是Line2D 对象。再次查看文档我们发现有一个方法get_data。所以现在我们有了曲线的数据。太好了! 此时,如果我们有一个可以使用 x 值调用的函数来接收相应的 y 值,那就更好了。现在看来,我们需要自己找到那个函数。 那么给定曲线的xy数据,我们如何找到给定x值的y值呢?由于数据是离散的,我们需要进行插值。寻找“interpolate”和“python”最终将我们带到numpy.interp。所以这为我们提供了绘制点所需的坐标。 了解如何绘制点。那很容易。周围有很多例子。

就是这样。

【讨论】:

这很好用。我有一个后续问题。如何知道这一点?或者,你是怎么知道的?您是否遵循了一条结构化的路径,或者这是通过经验获得的来之不易的知识?我是一位经验丰富的程序员,刚接触 Python 和新接触 Seaborn,但现在已经编程了一段时间。有没有获取这些知识的方法? 我更新了答案,包括从问题描述开始如何获得解决方案。了解这个过程可能会有所帮助。 感谢您对流程的出色解释。亲切的问候。巴拉特 谢谢,您的回答帮助我解决了我的问题。如果有人对ax.lines[0].get_data() 有任何问题,请尝试ax.get_lines()[0].get_data()

以上是关于Python Seaborn Distplot Y 值对应于给定的 X 值的主要内容,如果未能解决你的问题,请参考以下文章

Seaborn:具有相对频率的 distplot()

Python可视化 | Seaborn包—kdeplot和distplot

Python Seaborn:在 Facetgrid 中绘制多个 distplot

无法在 seaborn distplot 中显示图例

如何在 seaborn distplot 的 bin 中心标记 xticks?

如何规范seaborn distplot?