Source code for spacepy.plot.carrington
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Module for plotting data by Carrington or Bartels rotation
Authors: Steve Morley
Institution: Los Alamos National Laboratory
Contact: smorley@lanl.gov
Los Alamos National Laboratory
Copyright 2011-2015 Los Alamos National Security, LLC.
"""
import datetime as dt
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.dates import date2num
from matplotlib.colors import LogNorm
import spacepy.datamodel as dm
import spacepy.toolbox as tb
import spacepy.empiricals as emp
import spacepy.time as spt
__contact__ = 'Steve Morley, smorley@lanl.gov'
[docs]
def solarRotationPlot(ticks, data, targ_ax=None, rtype='bartels', nbins=27):
'''Plots a 1-D time series as a Carrington or Bartels plot
'''
SRlength = {'bartels': 27.0, 'carrington':27.2753}
if not targ_ax:
#setup axes
fig, targ_ax = plt.subplots()
#data are 1-D, get range of SR numbers for Y-axis
min_sr = emp.getSolarRotation(ticks[0], rtype=rtype)
max_sr = emp.getSolarRotation(ticks[-1], rtype=rtype)
n_sr = 1+max_sr-min_sr
sr_values = np.linspace(min_sr, max_sr, n_sr)
#get bin size in time
start_time = emp.getSolarRotation(min_sr, rtype=rtype, reverse=True)[0] #convert back from Solar Rotation to date, so we get the start time of the rotation
end_time = emp.getSolarRotation(max_sr+1, rtype=rtype, reverse=True)[0] #add 1 to last solar rotation number then convert back to date
binned_times = spt.tickrange(start_time, end_time, SRlength[rtype.lower()]/nbins)
#now bin data on new time grid -- TODO: use windowMean from toolbox??
digital = np.digitize(ticks.RDT, binned_times.RDT)
bin_means = np.zeros(len(binned_times)-1)
bin_means.fill(np.nan)
for i in range(1, len(binned_times)):
try:
bin_means[i] = data[digital == i].mean()
except (ZeroDivisionError, IndexError): #ZDE happens when no data for that bin, IE is when bins extend beyond data
pass
plot_view = np.array(bin_means).reshape((n_sr, nbins))
im = targ_ax.imshow(plot_view, interpolation='nearest', vmin=data.min(), vmax=data.max(), extent=[1,nbins, max_sr,min_sr], aspect=100)
plt.colorbar(im, ax=targ_ax)
targ_ax.set_xlabel('Day of Rotation')
targ_ax.set_ylabel('{0} Rotation number'.format(rtype.title()))
#targ_ax.pcolormesh(plot_view)
return