【问题标题】:Python Seaborn Distplot Y value corresponding to a given X valuePython Seaborn Distplot Y 值对应于给定的 X 值
【发布时间】: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 软件包的初学者。

【问题讨论】:

    标签: python matplotlib plot point 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 曲线上的某个点上画一个点。

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

    就是这样。

    【讨论】:

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