Source code for pynbody.plot.gas

"""
Functions for plotting gas quantities

.. versionchanged :: 2.0

    ``temp_profile`` has been removed. Use the :mod:`pynbody.analysis.profile` module instead.
    For examples, see the :ref:`profile` tutorial.

"""

import logging

import matplotlib.pyplot as plt
import numpy as np

from ..analysis import angmom, profile
from ..transformation import NullTransformation
from ..units import Unit
from .generic import hist2d

logger = logging.getLogger('pynbody.plot.gas')


[docs] def rho_T(sim, rho_units=None, rho_range=None, t_range=None, two_phase='split', **kwargs): """ Plot a 2d histogram of temperature vs density for the gas in the snapshot Parameters ---------- sim: pynbody.snapshot.simsnap.SimSnap The snapshot or subsnap to plot rho_units: str | pynbody.units.Unit | None The units to use for the density. If None, the current snapshot units are used. rho_range: tuple | None The range of densities to plot, in the same units as rho_units. If None, the full range is used. t_range: tuple | None The range of temperatures to plot. If None, the full range is used. two_phase: str If two-phase particles are detected, either plot each phase separately ('split'), or merge them ('merge'). Default is 'split'. **kwargs: Additional keyword arguments are passed to :func:`~pynbody.plot.generic.hist2d` """ if rho_units is None: rho_units = sim.gas['rho'].units if t_range is not None: kwargs['y_range'] = t_range assert len(kwargs['y_range']) == 2 if rho_range is not None: kwargs['x_range'] = rho_range assert len(kwargs['x_range']) == 2 else: rho_range = False if 'xlabel' in kwargs: xlabel = kwargs['xlabel'] del kwargs['xlabel'] else: xlabel = r'log$_{10}$($\rho$/$' + Unit(rho_units).latex() + '$)' if 'ylabel' in kwargs: ylabel = kwargs['ylabel'] del kwargs['ylabel'] else: ylabel = r'log$_{10}$(T/$' + sim.gas['temp'].units.latex() + '$)' if 'Tinc' in sim.loadable_keys() and two_phase == 'merge': return hist2d(sim.gas['rho'].in_units(rho_units),sim.gas['Tinc'], xlogrange=True,ylogrange=True,xlabel=xlabel, ylabel=ylabel, **kwargs) if 'uHot' in sim.loadable_keys() and 'MassHot' in sim.loadable_keys() and two_phase == 'split': E = sim.g['uHot']*sim.g['MassHot']+sim.g['u']*(sim.g['mass']-sim.g['MassHot']) rho = np.concatenate((np.array(sim.g['rho'].in_units(rho_units)*E/(sim.g['mass']*sim.g['u'])), np.array(sim.g['rho'].in_units(rho_units)*E/(sim.g['mass']*sim.g['uHot'])))) temp = np.concatenate((np.array(sim.g['temp']), np.array(sim.g['temp']/sim.g['u']*sim.g['uHot']))) temp = temp[np.where(np.isfinite(rho))] rho = rho[np.where(np.isfinite(rho))] return hist2d(rho, temp, xlogrange=True,ylogrange=True,xlabel=xlabel, ylabel=ylabel, **kwargs) return hist2d(sim.gas['rho'].in_units(rho_units),sim.gas['temp'], xlogrange=True,ylogrange=True,xlabel=xlabel, ylabel=ylabel, **kwargs)