analysis.ringPlot
module
Make a plot of an encountering with rings (fig 1, fig 3) and colour each ring according to the initial distance. It plots a prograde equalmass encounter by default.
Source code
"""Make a plot of an encountering with rings (fig 1, fig 3) and
colour each ring according to the initial distance. It plots a
prograde equalmass encounter by default.
"""
import matplotlib.pyplot as plt
from scipy.interpolate import splprep, splev, interp1d
from matplotlib import markers
import numpy as np
from analysis.colormaps import parula_map
from analysis import utils
def plotRings(ax, data, n):
"""Make a ring plot of the data.
Parameters:
ax: the matplotlib axis where the data should be plotted
data: a data dictionary in the format saved by the simulation
n (int): the number of particles to plot. These will be interpolated
and can be much higher than those originally in the simulation.
"""
# Identify all the rings
rings = np.unique(data['type'][:,1])
rings = rings[rings!='0']
# Plot each ring
for ring, color, in zip(rings,
parula_map(np.linspace(1.0, 0., len(rings)))):
xy = data['r_vec'][data['type'][:,1]==ring] #data for this ring
# Interpolate data (to use opacity to plot local density)
tck, u = splprep(xy[:,:2].T, u=None, s=0.0, per=1)
f = interp1d(np.linspace(0,1,len(u)), u, kind='cubic')
x_new, y_new = splev(f(np.linspace(0,1,n)), tck, der=0)
#Plot data
ax.scatter(x_new, y_new, s=2, c=[color], alpha=0.01)
utils.plotCOM(ax)
utils.plotCenterMasses(ax, data)
utils.plotTracks(ax, data['tracks'])
# Styling
utils.setAxes(ax, mode='hide')
####################################
####################################
# List of times to plot
ts = [2000, 3000, 3500, 4000, 4900]
figsize = (12, 4)
fileName = 'prograde_equalmass'
f, axs = plt.subplots(1, len(ts), figsize=figsize, sharey=False)
for t, ax in zip(ts, axs):
data = utils.loadData(fileName, t)
plotRings(ax, data, n=10000)
height, width = 3.0, 3 * 1/len(ts) * figsize[0]/figsize[1]
utils.setSize(ax, x=(-width, width), y=(-height, height), mode='square')
f.subplots_adjust(hspace=0, wspace=0)
plt.show()
Functions
def plotRings(ax, data, n)
-
Make a ring plot of the data.
Parameters
ax
- the matplotlib axis where the data should be plotted
data
- a data dictionary in the format saved by the simulation
n
:int
- the number of particles to plot. These will be interpolated and can be much higher than those originally in the simulation.
Source code
def plotRings(ax, data, n): """Make a ring plot of the data. Parameters: ax: the matplotlib axis where the data should be plotted data: a data dictionary in the format saved by the simulation n (int): the number of particles to plot. These will be interpolated and can be much higher than those originally in the simulation. """ # Identify all the rings rings = np.unique(data['type'][:,1]) rings = rings[rings!='0'] # Plot each ring for ring, color, in zip(rings, parula_map(np.linspace(1.0, 0., len(rings)))): xy = data['r_vec'][data['type'][:,1]==ring] #data for this ring # Interpolate data (to use opacity to plot local density) tck, u = splprep(xy[:,:2].T, u=None, s=0.0, per=1) f = interp1d(np.linspace(0,1,len(u)), u, kind='cubic') x_new, y_new = splev(f(np.linspace(0,1,n)), tck, der=0) #Plot data ax.scatter(x_new, y_new, s=2, c=[color], alpha=0.01) utils.plotCOM(ax) utils.plotCenterMasses(ax, data) utils.plotTracks(ax, data['tracks']) # Styling utils.setAxes(ax, mode='hide')