问题描述
基本上,我想绘制具有不同百分比的两个变量之间的散点图,我已经使用以下玩具代码绘制了散点图,但我无法绘制不同百分比(分位数)的散点图。
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)):
解决方法
正如@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()
编辑: 一些解释。我不确定我的代码中有什么不正确,但是如果您能告诉我,我会很高兴 - 总有改进的方法(再次感谢 @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')
我生成了一些随机数据来查看发生了什么。线 plt.fill_between(X,alpha = alpha)
仅绘制从 Y
下方的第 60 个百分位到 Y
的填充。另外两条线总是从 Y
的两侧覆盖空间(因此是 +-)。您可以看到百分位数重叠,当然它们会重叠,它们必须——90 个百分点也包括 60 个。所以你只能看到它们之间的差异。您可以以相反的顺序绘制数据(或更改 z 因子),但所有数据都将被最高百分位数覆盖。我希望这能澄清答案。另外,您的问题非常好,如果我的回答感觉不中立,我很抱歉。如果您还有图表的数据而不仅仅是图片,我/其他人的答案就可以更加量身定制:)