Plotting

Plotting in Euphonic is contained in a separate euphonic.plot module, and most plotting functions return a matplotlib.figure.Figure, which can be tweaked, then viewed with matplotlib.figure.Figure.show()

Plotting Dispersion

Phonon dispersion can be plotted from any Euphonic object that contains q-points and frequencies. For example, from QpointPhononModes using QpointPhononModes.get_dispersion to convert the frequencies into a Spectrum1DCollection object, which is plotted with euphonic.plot.plot_1d(). Converting to Spectrum1DCollection creates a defined x-axis for the plot. Extra arguments get passed to plot_1d, for adding axis labels etc.:

from euphonic import QpointPhononModes
from euphonic.plot import plot_1d

phonons = QpointPhononModes.from_castep('quartz.phonon')
bands = phonons.get_dispersion()  # type: Spectrum1DCollection

fig = plot_1d(bands, ylabel='Energy (meV)')
fig.show()

Phonon dispersion plots often include large steps between discontinuous regions in reciprocal space. In order to accommodate this, a single Spectrum1D or Spectrum1DCollection can be split into a list of spectra with the euphonic.spectra.Spectrum1D.split() method. plot_1d will happily accept this list as input, plotting each region to a series of proportionally-spaced subplots.

A compact recipe to write a band-structure plot with discontinuities could be

from euphonic import QpointFrequencies
from euphonic.plot import plot_1d

phonon_frequencies = QpointFrequencies.from_castep('quartz.phonon')

fig = plot_1d(phonon_frequencies.get_dispersion().split())
fig.savefig('quartz-dispersion.pdf')

1D Plots

1D spectra are arranged in a matplotlib Figure with euphonic.plot.plot_1d(). For multiple lines on the same axes, use Spectrum1DCollection objects. A sequence of Spectrum1D or Spectrum1DCollection objects will be interpreted as a series of axis regions:

from euphonic import Spectrum1D, Spectrum1DCollection
from euphonic.plot import plot_1d

dos = Spectrum1D.from_json_file('dos.json')
dos_broaden = Spectrum1D.from_json_file('dos_broaden.json')

dos_collection = Spectrum1DCollection.from_spectra([dos, dos_broaden])

fig = plot_1d(dos_collection, xlabel='Energy (meV)', ymin=0,
              labels=['Density of states', 'Broadened'])
fig.show()

Plotting to a specific axis

This can be used to have multiple subplots in the same figure, or to plot multiple Spectrum1D objects on the same axis (for example if they have different x_data values, so using a Spectrum1DCollection is not possible). An example of plotting 2 DOS with different energy bins on the same axis:

import matplotlib.pyplot as plt
from euphonic import Spectrum1D
from euphonic.plot import plot_1d, plot_1d_to_axis

dos1 = Spectrum1D.from_json_file('dos_ebins1.json')
dos2 = Spectrum1D.from_json_file('dos_ebins2.json')

fig = plot_1d(dos1)
ax = fig.get_axes()[0]
plot_1d_to_axis(dos2, ax)
fig.show()

An example of plotting 2 DOS on different axes on the same figure:

import matplotlib.pyplot as plt
from euphonic import Spectrum1D
from euphonic.plot import plot_1d_to_axis

dos1 = Spectrum1D.from_json_file('dos_ebins1.json')
dos2 = Spectrum1D.from_json_file('dos_ebins2.json')
fig, axes = plt.subplots(1, 2)
plot_1d_to_axis(dos1, axes[0])
plot_1d_to_axis(dos2, axes[1])
fig.show()

Docstrings

plot_1d(spectra, *, title=None, xlabel='', ylabel='', ymin=None, ymax=None, labels=None, **line_kwargs)

Creates a Matplotlib figure for a Spectrum1D object, or multiple Spectrum1D objects to be plotted on the same axes

Parameters:
  • spectra (Spectrum1D | Spectrum1DCollection | Sequence[Spectrum1D] | Sequence[Spectrum1DCollection]) –

    1D data to plot. Spectrum1D objects contain a single line, while Spectrum1DCollection is suitable for plotting multiple lines simultaneously (e.g. band structures).

    Data split across several regions should be provided as a sequence of spectrum objects:

    [Spectrum1D, Spectrum1D, ...]
    

    or:

    [Spectrum1DCollection, Spectrum1DCollection, ...]
    

    Where each segment will be plotted on a separate subplot. (This approach is mainly used to handle discontinuities in Brillouin-zone band structures, so the subplot widths will be based on the x-axis ranges.)

  • title (str | None) – Plot title

  • xlabel (str) – X-axis label

  • ylabel (str) – Y-axis label

  • ymin (float | None) – Minimum value on the y-axis. Can be useful to set y-axis minimum to 0 for energy, for example.

  • ymax (float | None) – Maximum value on the y-axis.

  • labels (Sequence[str] | None) – A sequence of labels corresponding to the sequence of lines in spectra, used to label each line. If this is None, the label(s) contained in spectra.metadata[‘label’] (Spectrum1D) or spectra.metadata[‘line_data’][i][‘label’] (Spectrum1DCollection) will be used. To disable labelling for a specific line, pass an empty string.

  • **line_kwargs – matplotlib.line.Line2D properties, optional Used in the axes.plot command to specify properties like linewidth, linestyle

Returns:

fig (matplotlib.figure.Figure)

Return type:

Figure

plot_1d_to_axis(spectra, ax, *, labels=None, **mplargs)

Plot a (collection of) 1D spectrum lines to matplotlib axis

Where there are two identical x-values in a row, plotting will restart to avoid creating a vertical line

Parameters:
  • spectra (Spectrum1D | Spectrum1DCollection) – Spectrum1D or Spectrum1DCollection to plot

  • ax (Axes) – Matplotlib axes to which spectra will be drawn

  • labels (Sequence[str] | None) – A sequence of labels corresponding to the sequence of lines in spectra, used to label each line. If this is None, the label(s) contained in spectra.metadata[‘label’] (Spectrum1D) or spectra.metadata[‘line_data’][i][‘label’] (Spectrum1DCollection) will be used. To disable labelling for a specific line, pass an empty string.

  • **mplargs – Keyword arguments passed to Axes.plot

Return type:

None

2D Plots

2D spectra are arranged in a matplotlib Figure with euphonic.plot.plot_2d():

from euphonic import Spectrum2D
from euphonic.plot import plot_2d

sqw = Spectrum2D.from_json_file('sqw.json')
fig = plot_2d(sqw, cmap='bone')
fig.show()

Plotting to a specific axis

This can be used to multiple subplots showing Spectrum2D in the same figure. A matplotlib.colors.Normalize object can also be used to ensure both spectra are on the same colour scale. An example of this for 2 S(Q,w) is below:

import matplotlib.pyplot as plt
from matplotlib.colors import Normalize
from euphonic import Spectrum2D
from euphonic.plot import plot_2d_to_axis

sqw1 = Spectrum2D.from_json_file('sqw1.json')
sqw2 = Spectrum2D.from_json_file('sqw2.json')
norm = Normalize(vmin=0, vmax=1e-10)
fig, axes = plt.subplots(1, 2)
plot_2d_to_axis(sqw1, axes[0], norm=norm)
plot_2d_to_axis(sqw2, axes[1], norm=norm)
fig.show()

Docstrings

plot_2d(spectra, *, vmin=None, vmax=None, cmap=None, title=None, xlabel='', ylabel='')

Creates a Matplotlib figure for a Spectrum2D object

Parameters:
  • spectra (Spectrum2D | Sequence[Spectrum2D]) – Containing the 2D data to plot. If a sequence of Spectrum2D is given, they will be plotted from right-to-left as separate subplots. This is recommended for band structure/dispersion plots with discontinuous regions.

  • vmin (float | None) – Minimum of data range for colormap. See Matplotlib imshow docs

  • vmax (float | None) – Maximum of data range for colormap. See Matplotlib imshow docs

  • cmap (str | Colormap | None) – Which colormap to use, see Matplotlib docs

  • title (str | None) – Set a title for the Figure.

  • xlabel (str) – X-axis label

  • ylabel (str) – Y-axis label

Returns:

fig (matplotlib.figure.Figure) – The Figure instance

Return type:

Figure

plot_2d_to_axis(spectrum, ax, *, cmap=None, interpolation='nearest', norm=None)

Plot Spectrum2D object to Axes

Parameters:
  • spectrum (Spectrum2D) – 2D data object for plotting as NonUniformImage. The x_tick_labels attribute will be used to mark labelled points.

  • ax (Axes) – Matplotlib axes to which image will be drawn

  • cmap (str | Colormap | None) – Matplotlib colormap or registered colormap name

  • interpolation (str) – Interpolation method: ‘nearest’ or ‘bilinear’ for a pixellated or smooth result

  • norm (Normalize | None) – Matplotlib normalization object; set this in order to ensure separate plots are on the same colour scale.

Return type:

NonUniformImage

Styling

To produce consistent and beautiful plots, it is recommended to use Matplotlib style sheets. The cleanest way to apply this is using a context manager. Within the indented block, a user-provided combination of style sheets is applied to any new plots. These can be built-in themes, file paths or parameter dictionaries, e.g.:

import matplotlib.pyplot as plt
from euphonic import Spectrum1D
from euphonic.plot import plot_1d, plot_1d_to_axis

dos = Spectrum1D.from_json_file('dos.json')

with plt.style.context(['dark_background', {'lines.linewidth': 2.0}]):
    fig = plot_1d(dos)
fig.show()

This approach is used in the Euphonic command-line tools; for more information see Customising plots. The CLI defaults can be imitated by using the same style sheet euphonic.style.base_style.