# Probability-Probability Plots (`ligo.skymap.plot.pp`)¶

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

## Example¶

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

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)
```
class ligo.skymap.plot.pp.PPPlot(*args, **kwargs)[source] [edit on github]

Bases: `Axes`

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

Build an Axes in a figure.

Parameters:
fig`Figure`

The Axes is built in the `Figure` fig.

*args

`*args` can be a single `(left, bottom, width, height)` rectangle or a single `Bbox`. This specifies the rectangle (in figure coordinates) where the Axes is positioned.

`*args` can also consist of three numbers or a single three-digit number; in the latter case, the digits are considered as independent numbers. The numbers are interpreted as ```(nrows, ncols, index)```: `(nrows, ncols)` specifies the size of an array of subplots, and `index` is the 1-based index of the subplot being created. Finally, `*args` can also directly be a `SubplotSpec` instance.

sharex, sharey`Axes`, 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_aspectfloat, optional

Set a fixed aspect for the Axes box, i.e. the ratio of height to width. See `set_box_aspect` for details.

**kwargs

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 and two offsets from the bottom left corner of the image alpha: scalar or None anchor: (float, float) or {‘C’, ‘SW’, ‘S’, ‘SE’, ‘E’, ‘NE’, …} animated: bool aspect: {‘auto’, ‘equal’} or float autoscale_on: bool autoscalex_on: unknown autoscaley_on: unknown axes_locator: Callable[[Axes, Renderer], Bbox] axisbelow: bool or ‘line’ box_aspect: float or None clip_box: `BboxBase` or None clip_on: bool clip_path: Patch or (Path, Transform) or None facecolor or fc: color figure: `Figure` frame_on: bool gid: str in_layout: bool label: object mouseover: bool navigate: bool navigate_mode: unknown path_effects: list of `AbstractPathEffect` picker: None or bool or float or callable position: [left, bottom, width, height] or `Bbox` prop_cycle: `Cycler` rasterization_zorder: float or None rasterized: bool sketch_params: (scale: float, length: float, randomness: float) snap: bool or None subplotspec: unknown title: str transform: `Transform` url: str visible: bool xbound: (lower: float, upper: float) xlabel: str xlim: (left: float, right: float) xmargin: float greater than -0.5 xscale: unknown xticklabels: unknown xticks: unknown ybound: (lower: float, upper: float) ylabel: str ylim: (bottom: float, top: float) ymargin: float greater than -0.5 yscale: unknown yticklabels: unknown yticks: unknown zorder: float

Returns:
`Axes`

The new `Axes` object.

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

Parameters:
nsamplesint

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 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.

Parameters:
nsamplesint

Number of P-values in each trial

ntrialsint

Number of line series to draw.

Other Parameters:
kwargs

optional extra arguments to `matplotlib.axes.Axes.plot`

Add a series of P-values to the plot.

Parameters:
p_values`numpy.ndarray`

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`

Mark the point at which the deviation is largest.

Parameters:
p_values`numpy.ndarray`

Same as in `add_series`.

set(*, adjustable=<UNSET>, agg_filter=<UNSET>, alpha=<UNSET>, anchor=<UNSET>, animated=<UNSET>, aspect=<UNSET>, autoscale_on=<UNSET>, autoscalex_on=<UNSET>, autoscaley_on=<UNSET>, axes_locator=<UNSET>, axisbelow=<UNSET>, box_aspect=<UNSET>, clip_box=<UNSET>, clip_on=<UNSET>, clip_path=<UNSET>, facecolor=<UNSET>, frame_on=<UNSET>, gid=<UNSET>, in_layout=<UNSET>, label=<UNSET>, mouseover=<UNSET>, navigate=<UNSET>, path_effects=<UNSET>, picker=<UNSET>, position=<UNSET>, prop_cycle=<UNSET>, rasterization_zorder=<UNSET>, rasterized=<UNSET>, sketch_params=<UNSET>, snap=<UNSET>, subplotspec=<UNSET>, title=<UNSET>, transform=<UNSET>, url=<UNSET>, visible=<UNSET>, xbound=<UNSET>, xlabel=<UNSET>, xlim=<UNSET>, xmargin=<UNSET>, xscale=<UNSET>, xticklabels=<UNSET>, xticks=<UNSET>, ybound=<UNSET>, ylabel=<UNSET>, ylim=<UNSET>, ymargin=<UNSET>, yscale=<UNSET>, yticklabels=<UNSET>, yticks=<UNSET>, zorder=<UNSET>) [edit on github]

Set multiple properties at once.

Supported properties are

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 and two offsets from the bottom left corner of the image alpha: scalar or None anchor: (float, float) or {‘C’, ‘SW’, ‘S’, ‘SE’, ‘E’, ‘NE’, …} animated: bool aspect: {‘auto’, ‘equal’} or float autoscale_on: bool autoscalex_on: unknown autoscaley_on: unknown axes_locator: Callable[[Axes, Renderer], Bbox] axisbelow: bool or ‘line’ box_aspect: float or None clip_box: `BboxBase` or None clip_on: bool clip_path: Patch or (Path, Transform) or None facecolor or fc: color figure: `Figure` frame_on: bool gid: str in_layout: bool label: object mouseover: bool navigate: bool navigate_mode: unknown path_effects: list of `AbstractPathEffect` picker: None or bool or float or callable position: [left, bottom, width, height] or `Bbox` prop_cycle: `Cycler` rasterization_zorder: float or None rasterized: bool sketch_params: (scale: float, length: float, randomness: float) snap: bool or None subplotspec: unknown title: str transform: `Transform` url: str visible: bool xbound: (lower: float, upper: float) xlabel: str xlim: (left: float, right: float) xmargin: float greater than -0.5 xscale: unknown xticklabels: unknown xticks: unknown ybound: (lower: float, upper: float) ylabel: str ylim: (bottom: float, top: float) ymargin: float greater than -0.5 yscale: unknown yticklabels: unknown yticks: unknown zorder: float