Как построить медианные значения в каждой ячейке и показать значения 25 и 75 процентов

Я хотел бы построить свои данные, подобные следующему рисунку, с отображением медианы в каждой ячейке и значений 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 процентов, как на предыдущем рисунке.


person John Singh    schedule 17.12.2020    source источник
comment
Думаю, проблема в ваших обычных корзинах. Взгляните на stackoverflow.com/questions/6855710/, это решит проблему смещения.   -  person GrimTrigger    schedule 17.12.2020


Ответы (1)


Чтобы также ответить на другой вопрос: вы можете использовать np.percentile. Мне пришлось уменьшить номер ячейки (была ячейка без данных, это приводит к проблемам с процентилем). О логарифмических ячейках см. Мой комментарий выше:

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()

который производит

введите описание изображения здесь

РЕДАКТИРОВАТЬ:

Чтобы показать заполненный график, вы можете попробовать (показан только соответствующий раздел):

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')

который производит

введите описание изображения здесь

person GrimTrigger    schedule 17.12.2020
comment
Как узнать размер корзины по данным. Предположим, у меня есть другая плотность, минимальное значение которой составляет 0,010651032198077923, а максимальное значение - 6,182012487319087. Я не могу применить эти бункеры. Какие для этого будут подходящие бункеры. И как узнать, какой будет хороший размер. Спасибо - person John Singh; 17.12.2020
comment
Хороший вопрос: np.logspace позволяет вам установить нижнюю и верхнюю границу интервалов. Я просто оценил это, посмотрев на график, но вы можете просто установить np.log10 (lower_limit) на np.log10 (upper_limit). Что касается размера, то для меня это зависит от исходных данных и от того, имеет ли смысл то, что вы показываете. Я бы начал с размера бункера, посмотрите, сколько точек данных находится в каждом бункере (сложно рекомендовать общий подход, но, поскольку вы хотите медианы и процентили, их должно быть 10 или более на бункер). Глядя на график, я бы интерпретировал только диапазон от 10 ^ -4 до, может быть, 3 * 10 ^ -3. - person GrimTrigger; 17.12.2020
comment
чтобы продолжить: и, может быть, просто нарисуйте кривую там. График, который вы показали в начале, сделал то же самое: он показывает только кривую в среднем диапазоне, где достаточно точек данных. - person GrimTrigger; 17.12.2020
comment
Как построить заливку между двумя процентилями - person John Singh; 01.02.2021
comment
вы можете попробовать что-то вроде ax.fill_between(bins-delta/2,running_prc25,running_median) и ax.fill_between(bins-delta/2,running_prc75,running_median) (если я правильно понимаю вопрос). Просто добавьте fig, ax = plt.subplots() раньше. - person GrimTrigger; 01.02.2021
comment
добавлен в вопрос - person GrimTrigger; 01.02.2021
comment
Не за что! - person GrimTrigger; 01.02.2021
comment
Я попытался построить планку ошибок в каждой средней ячейке, но у меня это не получилось. Пожалуйста, помогите. Большое спасибо - person John Singh; 16.02.2021
comment
Думаю, вы могли бы добавить running_std = [np.std(Y[idx==k]) for k in range(total_bins)] plt.errorbar(bins-delta/2,running_median, running_std) перед ax_fill... - person GrimTrigger; 16.02.2021