Python 如何在每个箱子中绘制中值,并显示25%和75%的值

Python 如何在每个箱子中绘制中值,并显示25%和75%的值,python,matplotlib,statistics,median,percentile,Python,Matplotlib,Statistics,Median,Percentile,我想绘制与下图类似的数据,显示每个箱子的中值以及25%和75%的值。[实线和开放圆显示每个箱子的中值,虚线显示25%和75%的值。] 我有这个样品。我这样做是为了得到类似的情节 import numpy as np import matplotlib.pyplot as plt from astropy.table import Table data=Table.read('sample_data.fits') # Sample data X=data['density'] Y=data['l

我想绘制与下图类似的数据,显示每个箱子的中值以及25%和75%的值。[实线和开放圆显示每个箱子的中值,虚线显示25%和75%的值。]

我有这个样品。我这样做是为了得到类似的情节

import numpy as np
import matplotlib.pyplot as plt
from astropy.table import Table
data=Table.read('sample_data.fits')
# Sample data
X=data['density']
Y=data['lineflux']
total_bins = 15
bins = np.linspace(min(X),max(X), total_bins)
delta = bins[1]-bins[0]
idx  = np.digitize(X,bins)
running_median = [np.median(Y[idx==k]) for k in range(total_bins)]

plt.plot(X,Y,'.')
plt.plot(bins-delta/2,running_median,'--r',marker='o',fillstyle='none',markersize=20,alpha=1)
plt.xlabel('log $\delta_{5th}[Mpc^{-3}]$')
plt.ylabel('log OII[flux]')
plt.loglog()
plt.axis('tight')
plt.show()
我得到了这个阴谋。

有一个很大的偏移量。我也改变了垃圾箱的大小,但我还是得到了很大的偏移量。
如何以正确的方式绘图,以及如何像我的绘图中的上一个图一样包括25%和75%的值。还要回答另一个问题:您可以使用
np.percentile
。我不得不降低bin编号(有一个bin没有数据,这导致了百分位数的问题)。有关对数垃圾箱,请参见我上面的评论:

import numpy as np
import matplotlib.pyplot as plt
from astropy.table import Table

data=Table.read('sample_data.fits')
# Sample data
X=data['density']
Y=data['lineflux']
total_bins = 10
#bins = np.linspace(min(X), max(X), total_bins)
bins = np.logspace(np.log10(0.0001), np.log10(0.1), total_bins)
delta = bins[1]-bins[0]
idx  = np.digitize(X, bins)
running_median = [np.median(Y[idx==k]) for k in range(total_bins)]

running_prc25 = [np.percentile(Y[idx==k], 25) for k in range(total_bins)]
running_prc75 = [np.percentile(Y[idx==k], 75) for k in range(total_bins)]

plt.plot(X,Y,'.')
plt.plot(bins-delta/2,running_median,'-r',marker='o',fillstyle='none',markersize=20,alpha=1)

plt.plot(bins-delta/2,running_prc25,'--r',marker=None,fillstyle='none',markersize=20,alpha=1)
plt.plot(bins-delta/2,running_prc75,'--r',marker=None,fillstyle='none',markersize=20,alpha=1)

plt.xlabel('log $\delta_{5th}[Mpc^{-3}]$')
plt.ylabel('log OII[flux]')
plt.loglog()
plt.axis('tight')
plt.show()
产生

编辑:

要显示填充图,您可以尝试(仅显示相关部分):

产生


我认为你的普通垃圾箱就是问题所在。看一看,这将解决抵销问题。如何根据数据知道仓位的大小。假设我有另一个密度,最小值是0.010651032198077923,最大值是6.182012487319087。我不能使用这些垃圾箱。什么样的箱子才是合适的呢。以及如何知道哪个尺码合适。谢谢这是一个好问题:“np.logspace”允许您设置间隔的下限和上限。我只是通过查看图表来查看它,但是您可以将np.log10(下限)设置为np.log10(上限)。至于大小,这对我来说取决于基础数据,以及您显示的内容是否有意义。我会从一个binsize开始,看看每个bin中有多少数据点(很难推荐一个通用的方法,但因为你想要一个中位数和百分位数,每个bin应该有10个或更多)。看这张图,我只解释10^-4到3*10^-3之间的范围。继续:也许在那里画一条曲线。您在开始时所显示的图表做了同样的操作:它只显示了在足够的数据区域的中间范围内的曲线。您可以尝试类似于<代码> AX.FILIN(BIN Delta/2,RunnyPrc25,RunnIn中值)< /C>和 Ax.FILIN之间(BIN Delta/2,RunnyPrc75,RunnIn中值)< /Cord>(如果我理解问题的正确性)。只需在前面添加
fig,ax=plt.subplot()
。我想您可以在
ax\u填充之前添加
running\u std=[np.std(Y[idx==k])范围内的k(total\u bins)]plt.errorbar(bins delta/2,running\u median,running\u std)
fig, ax = plt.subplots()

plt.plot(X,Y,'.')
plt.plot(bins-delta/2,running_median,'-r',marker='o',fillstyle='none',markersize=20,alpha=1)

#plt.plot(bins-delta/2,running_prc25,'--r',marker=None,fillstyle='none',markersize=20,alpha=1)
#plt.plot(bins-delta/2,running_prc75,'--r',marker=None,fillstyle='none',markersize=20,alpha=1)

ax.fill_between(bins-delta/2,running_prc25,running_median, facecolor='orange')
ax.fill_between(bins-delta/2,running_prc75,running_median, facecolor='orange')