Python эквивалент для нормплота MATLAB? - PullRequest
7 голосов
/ 17 июня 2011

Есть ли Python-эквивалентная функция, аналогичная normplot из MATLAB? Возможно в matplotlib?

Синтаксис MATLAB:

x = normrnd(10,1,25,1);
normplot(x)

Дает:

enter image description here

Я пытался использовать модуль matplotlib & numpy для определения вероятности / процентиля значений в массиве, но масштаб выходного графика по оси Y линейный по сравнению с графиком из MATLAB.

import numpy as np
import matplotlib.pyplot as plt

data =[-11.83,-8.53,-2.86,-6.49,-7.53,-9.74,-9.44,-3.58,-6.68,-13.26,-4.52]
plot_percentiles = range(0, 110, 10) 

x = np.percentile(data, plot_percentiles)
plt.plot(x, plot_percentiles, 'ro-')
plt.xlabel('Value')
plt.ylabel('Probability')  
plt.show() 

Дает: enter image description here

Иначе, как настроить шкалы, как на первом графике?

Спасибо.

Ответы [ 4 ]

6 голосов
/ 14 февраля 2015

Поздний ответ, но я только столкнулся с той же проблемой и нашел решение, которым стоит поделиться.Я думаю.

Как указывал Джорис, функция пробплота эквивалентна нормплоту, но полученное в результате распределение имеет вид кумулятивной функции плотности.Scipy.stats также предлагает функцию для преобразования этих значений.

cdf -> процентиль

stats.'distribution function'.cdf(cdf_value)

процентиль -> cdf

stats.'distribution function'.ppf(percentile_value)

например:

stats.norm.ppf(percentile)

Чтобы получить эквивалентный y-ось, как и normplot, можно заменить cdf-галочками:

from scipy import stats
import matplotlib.pyplot as plt

nsample=500

#create list of random variables
x=stats.t.rvs(100, size=nsample)

# Calculate quantiles and least-square-fit curve
(quantiles, values), (slope, intercept, r) = stats.probplot(x, dist='norm')

#plot results
plt.plot(values, quantiles,'ob')
plt.plot(quantiles * slope + intercept, quantiles, 'r')

#define ticks
ticks_perc=[1, 5, 10, 20, 50, 80, 90, 95, 99]

#transfrom them from precentile to cumulative density
ticks_quan=[stats.norm.ppf(i/100.) for i in ticks_perc]

#assign new ticks
plt.yticks(ticks_quan,ticks_perc)

#show plot
plt.grid()
plt.show()

Результат:

probability plot with matplotlib

2 голосов
/ 17 июня 2011

Может быть, вы можете использовать функцию probplot scipy (scipy.stats), это мне кажется эквивалентом для MATLABs normplot:

Рассчитать квантили для вероятности График выборки данных против указанное теоретическое распределение.

probplot опционально вычисляет наиболее подходящая линия для данных и графиков результаты с использованием Matplotlib или заданная сюжетная функция.

http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.probplot.html

Но это не решит вашу проблему с другим масштабом оси Y.

2 голосов
/ 17 июня 2011

Я вполне уверен, что matplotlib не предоставляет ничего подобного.

Конечно, это возможно, но вам придется либо изменить масштаб ваших данных и изменить метки / метки оси y, чтобы они соответствовали, либо, если вы планируете делать это часто, возможно, кодироватьновая шкала, которая может быть применена к осям matplotlib, как в этом примере: http://matplotlib.sourceforge.net/examples/api/custom_scale_example.html.

1 голос
/ 17 июня 2011

Использование matplotlib.semilogy приблизит выход к Matlab.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...