我需要在一个与某些X值对应的Seaborn distplot上绘制点,这样它们要么落在密度曲线上,要么落在密度曲线下。下面是来自以下URL的distplot:
From the Seaborn site - distplot examples
这是一个带有代码的图像:
因此,例如,在上面所示的图中,我需要编程地确定y轴值对应于在密度曲线上的x值的0。从这个数字来看,似乎在0.37左右。我怎样才能在我的程序中得到它呢?
假设可以做到这一点,那么我如何在所示的绘图中显示它,即哪行代码将显示它。我正在将一组R可视化转换为Python。R中的下图显示了我正在努力实现的目标:
看到曲线上显示的点了吗?有许多点值要画,但如果你帮我画一个,我可以试着画其余的。我是Matplotlib和Seaborn包的初始用户。
最佳答案
为了获得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曲线的某个点上画一个点。
看看文档;distplot函数是否有一个参数可以满足我们的要求?不幸的是没有。
函数是否返回对象?对。是曲线吗?不幸的是没有。而是matplotlib轴。(通过
type()
发现这一点)找出matplotlib轴是什么;读取the documentation。Uff,它相当重,但是我们偶然发现了一个方法;因为曲线应该是一条线,所以应该会有帮助。
找出那些线是什么:它们是
axes.get_lines()
对象。再次查看文档,我们发现有一个方法Line2D
。现在我们有了曲线的数据。伟大的!在这一点上,如果我们有一个函数,我们可以调用我们的x值来接收相应的y值,那就更好了。现在看来,我们需要自己找到这个功能。
那么给定曲线的
get_data
和x
数据,我们如何找到给定x值的y值?由于数据是离散的,我们需要插值。四处寻找“interpolate”和“python”最终会让我们找到y
。这就为我们提供了画一个点所需的坐标。找出如何画一个点。那很简单。很多这样的例子。
就这样。