微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python中具有不同分位数/百分位数的散点图

如何解决python中具有不同分位数/百分位数的散点图

基本上,我想绘制具有不同百分比的两个变量之间的散点图,我已经使用以下玩具代码绘制了散点图,但我无法绘制不同百分比(分位数)的散点图。

quantiles = [1,10,25,50,75,90,99]
grays = ["#DCDCDC","#A9A9A9","#2F4F4F","#DCDCDC"]
alpha = 0.3
data = df[['area_log','mr_ecdf']]
y = data['mr_ecdf']
x = data['area_log']
idx   = np.argsort(x)
x = np.array(x)[idx]
y = np.array(y)[idx]
for i in range(len(quantiles)//2):   
    plt.fill_between(x,y,color='black',alpha = alpha,label=f"{quantiles[i]}")
    lower_lim = np.percentile(y,quantiles[i])
    upper_lim = np.percentile(y,100-quantiles[i])
    data = data[data['mr_ecdf'] >= lower_lim]
    data = data[data['mr_ecdf'] <= upper_lim]   
    y = data['mr_ecdf']
    x = data['area_log']
    idx   = np.argsort(x)
    x = np.array(x)[idx]
    y = np.array(y)[idx]
data = df[['area_log','mr_ecdf']]
y = data['mr_ecdf']
x = data['area_log']
plt.scatter(x,s=1,color = 'r',label = 'data')
plt.legend()
# axes.set_ylim([0,1])

enter image description here 数据链接here

我想绘制这样的图 (First- (1,1)):

enter image description here

解决方法

正如@Mr 所提到的。 T,一种方法是自己计算 CI,然后使用 plt.fill_between 绘制它们。您显示的数据存在问题,因为没有足够的点和方差,因此您永远无法获得图片上的内容(而且我图中的分隔也不清楚,因此我在下面放了另一个示例来说明它是如何工作的) .如果你有这方面的数据,贴出来,我会更新。无论如何,您应该检查我在评论中提到的 post 以及以下操作方法:

import numpy as np
import matplotlib.pyplot as plt

x = np.array([5,7,8,2,17,9,4,11,12,6])
y = np.array([99,86,87,88,111,103,94,78,77,85,86])

idx   = np.argsort(x)

x = np.array(x)[idx]
y = np.array(y)[idx]

# Create a list of quantiles to calculate
quantiles = [0.05,0.25,0.75,0.95]
grays = ["#DCDCDC","#A9A9A9","#2F4F4F","#DCDCDC"]

alpha = 0.3

plt.fill_between(x,y-np.percentile(y,0.5),y+np.percentile(y,color=grays[2],alpha = alpha,label="0.50")

# if the percentiles are symmetrical and we want labels on both sides
for i in range(len(quantiles)//2):
    plt.fill_between(x,y,quantiles[i]),color=grays[i],label=f"{quantiles[i]}")
    plt.fill_between(x,quantiles[-(i+1)]),color=grays[-(i+1)],label=f"{quantiles[-(i+1)]}")

plt.scatter(x,color = 'r',label = 'data')
plt.legend()

enter image description here

编辑: 一些解释。我不确定我的代码中有什么不正确,但是如果您能告诉我,我会很高兴 - 总有改进的方法(再次感谢 @Mr T. 的捕获)。尽管如此,函数之间的填充会执行以下操作:

填充两条水平曲线之间的区域。 曲线由点 (x,y1) 和 (x,y2)

定义

因此,您通过 y1 和 y2 指定要在何处用颜色填充图形。再举一个例子:

X = np.linspace(120,50,71)
Y = X + 20*np.random.randn(71)
plt.fill_between(X,Y-np.percentile(Y,95),Y+np.percentile(Y,color="k",alpha = alpha)
plt.fill_between(X,80),color="r",60),Y,color="b",alpha = alpha)
plt.scatter(X,label = 'data')

enter image description here

我生成了一些随机数据来查看发生了什么。线 plt.fill_between(X,alpha = alpha) 仅绘制从 Y 下方的第 60 个百分位到 Y 的填充。另外两条线总是从 Y 的两侧覆盖空间(因此是 +-)。您可以看到百分位数重叠,当然它们会重叠,它们必须——90 个百分点也包括 60 个。所以你只能看到它们之间的差异。您可以以相反的顺序绘制数据(或更改 z 因子),但所有数据都将被最高百分位数覆盖。我希望这能澄清答案。另外,您的问题非常好,如果我的回答感觉不中立,我很抱歉。如果您还有图表的数据而不仅仅是图片,我/其他人的答案就可以更加量身定制:)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。