hi all
has anyone ever tried to make a quantile-quantile plot with pylab?
is there any build in function named say "qqplot" available ?
thanks
Thierry
hi all
has anyone ever tried to make a quantile-quantile plot with pylab?
is there any build in function named say "qqplot" available ?
thanks
Thierry
Thierry,
You need either scipy or rpy2 (and R) to do this. I've attached some code below. Please keep in mind that I've written for the general case of having a censored data set, therefore I rely on masked arrays from numpy.ma and scipy.stats.mstats -- but I have apply the mask midway through the process, which is different than the numpy's standard operating procedure. Let me know if any of this isn't clear.
I also have code that generates a quick comparison of the results from scipy.stats.mstats and ryp2+R, if you're interested.
HTH,
-paul
# code...
import matplotlib.pyplot as pl
import scipy.stats as st
import numpy as np
def censoredProbPlot(data, mask):
ppos = st.mstats.plotting_positions(data)
qntl = st.distributions.norm.ppf(ppos)
qntlMask = np.ma.MaskedArray(qntl, mask=mask)
dataMask = np.ma.MaskedArray(data, mask=mask)
fit = st.mstats.linregress(dataMask, qntlMask)
mu = -fit[1]
sigma = fit[0]
d_ = np.linspace(np.min(data),np.max(data))
q_ = sigma * d_ - mu
maskedProbPlot = {"mskData" : dataMask,
"mskQntl" : qntlMask,
"unmskData" : data,
"unmskQntl" : qntl,
"bestFitD" : d_,
"bestFitQ" : q_,
"mu" : mu,
"sigma" : sigma}
return maskedProbPlot
if 1:
#~~ you need to put your data here:
#data = np.array()
#mask = np.array(,dtype=bool)
mpp = censoredProbPlot(data, mask)
fig = pl.figure()
ax1 = fig.add_subplot(111)
ax1.plot(mpp['mskQntl'], mpp['mskData'], 'ko', ms=6, label='Detected Samples')
ax1.plot(mpp['unmskQntl'], mpp['unmskData'], 'r.', ms=6, label='Raw Samples')
ax1.plot(mpp['bestFitQ'], mpp['bestFitD'], 'b-', lw=2)
fig.savefig('example_censoredProbPlot.png')
-----Original Message-----
From: MONTAGU Thierry [mailto:thierry.montagu@…3117…]
Sent: Friday, May 21, 2010 6:37 AM
To: matplotlib-users@lists.sourceforge.net
Subject: [Matplotlib-users] qqplothi all
has anyone ever tried to make a quantile-quantile plot with pylab?
is there any build in function named say "qqplot" available ?thanks
Thierry-------------------------------------------------------------------------
-----_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
matplotlib-users List Signup and Options
From: MONTAGU Thierry [mailto:thierry.montagu@…3117…]
Sent: Friday, May 21, 2010 09:37has anyone ever tried to make a quantile-quantile plot with pylab?
is there any build in function named say "qqplot" available ?
For a plot comparing samples to a theoretical distribution (and if you don't
need masking as in Paul's example), you might be able to use
scipy.stats.probplot, as follows:
import matplotlib.pyplot as plt
import scipy.stats as st
values = st.norm.rvs(size=(100,)) # example data
fig = plt.figure() # set up plot
ax = fig.add_subplot(1, 1, 1)
osm, osr = st.probplot(values, fit=0, dist='norm') # compute
ax.plot(osm, osr, '.') # plot
One way to include the fit line is
(osm, osr), (m, b, r) = st.probplot(values, dist='norm') # compute
osmf = osm.take([0, -1]) # endpoints
osrf = m * osmf + b # fit line
ax.plot(osm, osr, '.', osmf, osrf, '-')