Probability-Probability Plots (ligo.skymap.plot.pp)

Axes subclass for making probability–probability (P–P) plots.


You can create new P–P plot axes by passing the keyword argument projection='pp_plot' when creating new Matplotlib axes.

import ligo.skymap.plot
from matplotlib import pyplot as plt
import numpy as np

n = 100
p_values_1 = np.random.uniform(size=n) # One experiment
p_values_2 = np.random.uniform(size=n) # Another experiment
p_values_3 = np.random.uniform(size=n) # Yet another experiment

fig = plt.figure(figsize=(5, 5))
ax = fig.add_subplot(111, projection='pp_plot')
ax.add_confidence_band(n, alpha=0.95) # Add 95% confidence band
ax.add_diagonal() # Add diagonal line
ax.add_lightning(n, 20) # Add some random realizations of n samples
ax.add_series(p_values_1, p_values_2, p_values_3) # Add our data

(Source code, png, hires.png, pdf)


Or, you can call the constructor of PPPlot directly.

from ligo.skymap.plot import PPPlot
from matplotlib import pyplot as plt
import numpy as np

n = 100

rect = [0.1, 0.1, 0.8, 0.8] # Where to place axes in figure
fig = plt.figure(figsize=(5, 5))
ax = PPPlot(fig, rect)
ax.add_confidence_band(n, alpha=0.95)
ax.add_lightning(n, 20)

(Source code, png, hires.png, pdf)

class ligo.skymap.plot.pp.PPPlot(*args, **kwargs)[source] [edit on github]

Bases: matplotlib.axes.Axes

Construct a probability–probability (P–P) plot.

Build an axes in a figure.


The axes is build in the Figure fig.

rect[left, bottom, width, height]

The axes is build in the rectangle rect. rect is in Figure coordinates.

sharex, shareyAxes, optional

The x or y axis is shared with the x or y axis in the input Axes.

frameonbool, default: True

Whether the axes frame is visible.

box_aspectNone, or a number, optional

Sets the aspect of the axes box. See set_box_aspect for details.


Other optional keyword arguments:

Properties: adjustable: {‘box’, ‘datalim’} agg_filter: a filter function, which takes a (m, n, 3) float array and a dpi value, and returns a (m, n, 3) array alpha: float or None anchor: 2-tuple of floats or {‘C’, ‘SW’, ‘S’, ‘SE’, …} animated: bool aspect: {‘auto’} or num autoscale_on: bool autoscalex_on: bool autoscaley_on: bool axes_locator: Callable[[Axes, Renderer], Bbox] axisbelow: bool or ‘line’ box_aspect: None, or a number clip_box: Bbox clip_on: bool clip_path: Patch or (Path, Transform) or None contains: unknown facecolor or fc: color figure: Figure frame_on: bool gid: str in_layout: bool label: object navigate: bool navigate_mode: unknown path_effects: AbstractPathEffect picker: None or bool or callable position: [left, bottom, width, height] or Bbox prop_cycle: unknown rasterization_zorder: float or None rasterized: bool or None sketch_params: (scale: float, length: float, randomness: float) snap: bool or None title: str transform: Transform url: str visible: bool xbound: unknown xlabel: str xlim: (bottom: float, top: float) xmargin: float greater than -0.5 xscale: {“linear”, “log”, “symlog”, “logit”, …} xticklabels: unknown xticks: unknown ybound: unknown ylabel: str ylim: (bottom: float, top: float) ymargin: float greater than -0.5 yscale: {“linear”, “log”, “symlog”, “logit”, …} yticklabels: unknown yticks: unknown zorder: float


The new Axes object.

add_confidence_band(nsamples, alpha=0.95, annotate=True, **kwargs)[source] [edit on github]

Add a target confidence band.


Number of P-values

alphafloat, default: 0.95

Confidence level

annotatebool, optional, default: True

If True, then label the confidence band.

Other Parameters
**kwargs :

optional extra arguments to matplotlib.axes.Axes.fill_betweenx

add_diagonal(*args, **kwargs)[source] [edit on github]

Add a diagonal line to the plot, running from (0, 0) to (1, 1).

Other Parameters
kwargs :

optional extra arguments to matplotlib.axes.Axes.plot

add_lightning(nsamples, ntrials, **kwargs)[source] [edit on github]

Add P-values drawn from a random uniform distribution, as a visual representation of the acceptable scatter about the diagonal.


Number of P-values in each trial


Number of line series to draw.

Other Parameters
kwargs :

optional extra arguments to matplotlib.axes.Axes.plot

add_series(*p_values, **kwargs)[source] [edit on github]

Add a series of P-values to the plot.


One or more lists of P-values.

If an entry in the list is one-dimensional, then it is interpreted as an unordered list of P-values. The ranked values will be plotted on the horizontal axis, and the cumulative fraction will be plotted on the vertical axis.

If an entry in the list is two-dimensional, then the first subarray is plotted on the horizontal axis and the second subarray is plotted on the vertical axis.

drawstyle{‘steps’, ‘lines’, ‘default’}

Plotting style. If steps, then plot steps to represent a piecewise constant function. If lines, then connect points with straight lines. If default then use steps if there are more than 2 pixels per data point, or else lines.

Other Parameters
kwargs :

optional extra arguments to matplotlib.axes.Axes.plot

add_worst(*p_values)[source] [edit on github]

Mark the point at which the deviation is largest.


Same as in add_series.