Source code for pyrfu.pyrf.histogram2d

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# 3rd party imports
import numpy as np
import xarray as xr

# Local imports
from .resample import resample

__author__ = "Louis Richard"
__email__ = "louisr@irfu.se"
__copyright__ = "Copyright 2020-2023"
__license__ = "MIT"
__version__ = "2.4.2"
__status__ = "Prototype"


[docs]def histogram2d(inp1, inp2, bins=100, y_range=None, weights=None, density=True): r"""Computes 2d histogram of inp2 vs inp1 with nbins number of bins. Parameters ---------- inp1 : xarray.DataArray Time series of the x coordinates of the points to be histogrammed. inp2 : xarray.DataArray Time series of the y coordinates of the points to be histogrammed. bins : str or int or tuple, Optional Number of bins. Default is ``bins=100``. y_range : array_like, shape(2,2), Optional The leftmost and rightmost edges of the bins along each dimension (if not specified explicitly in the `bins` parameters): ``[[xmin, xmax], [ymin, ymax]]``. All values outside of this range will be considered outliers and not tallied in the histogram. weights : array_like, shape(N,), Optional An array of values ``w_i`` weighing each sample ``(x_i, y_i)``. Weights are normalized to 1 if `normed` is True. If `normed` is False, the values of the returned histogram are equal to the sum of the weights belonging to the samples falling into each bin. density : bool, Optional If False, the default, returns the number of samples in each bin. If True, returns the probability *density* function at the bin, ``bin_count / sample_count / bin_area``. Returns ------- out : xarray.DataArray 2D map of the density of ``inp2`` vs ``inp1``. Examples -------- >>> import numpy as np >>> from pyrfu import mms, pyrf Time interval >>> tint = ["2019-09-14T07:54:00.000", "2019-09-14T08:11:00.000"] Spacecraft indices >>> mms_id = np.arange(1, 5) Load magnetic field and electric field >>> r_mms = [mms.get_data("r_gse", tint, i) for i in mms_id] >>> b_mms = [mms.get_data("b_gse_fgm_srvy_l2", tint, i) for i in mms_id] Compute current density, etc >>> j_xyz, _, b_xyz, _, _, _ = pyrf.c_4_j(r_mms, b_mms) Compute magnitude of B and J >>> b_mag = pyrf.norm(b_xyz) >>> j_mag = pyrf.norm(j_xyz) Histogram of J vs B >>> h2d_b_j = pyrf.histogram2d(b_mag, j_mag) """ # resample inp2 with respect to inp1 if len(inp2) != len(inp1): inp2 = resample(inp2, inp1) h2d, x_edges, y_edges = np.histogram2d( inp1.data, inp2.data, bins=bins, range=y_range, density=density, weights=weights, ) x_bins = x_edges[:-1] + np.median(np.diff(x_edges)) / 2 y_bins = y_edges[:-1] + np.median(np.diff(y_edges)) / 2 out = xr.DataArray( h2d, coords=[x_bins, y_bins], dims=["x_bins", "y_bins"], ) return out