def _two_axis_timeseries(self, left_ts, right_ts, titles, colors): """Create a time series graph figure object with 2 time series plotted on the left and right y axes. """ fig = Figure((8, 3), facecolor='white') ax_left = fig.add_subplot(1, 1, 1) ax_left.set_position((0.125, 0.1, 0.775, 0.75)) fig.ax_left = ax_left ax_right = ax_left.twinx() ax_right.set_position(ax_left.get_position()) predicate = (left_ts['avg_forcing'].mpl_dates >= date2num( self.config.data_date)) for key in 'early_bloom_forcing late_bloom_forcing'.split(): ax_left.plot(left_ts[key].mpl_dates[predicate], left_ts[key].dep_data[predicate], color=colors[0]['bounds']) ax_right.plot(right_ts[key].mpl_dates[predicate], right_ts[key].dep_data[predicate], color=colors[1]['bounds']) ax_left.plot(left_ts['avg_forcing'].mpl_dates, left_ts['avg_forcing'].dep_data, color=colors[0]['avg']) ax_right.plot(right_ts['avg_forcing'].mpl_dates, right_ts['avg_forcing'].dep_data, color=colors[1]['avg']) ax_left.set_ylabel(titles[0], color=colors[0]['avg'], size='x-small') ax_right.set_ylabel(titles[1], color=colors[1]['avg'], size='x-small') # Add line to mark switch from actual to averaged forcing data fig.data_date_line = ax_left.axvline(date2num(self.config.data_date), color='black') # Format x-axis ax_left.xaxis.set_major_locator(MonthLocator()) ax_left.xaxis.set_major_formatter(DateFormatter('%j\n%b')) for axis in (ax_left, ax_right): for label in axis.get_xticklabels() + axis.get_yticklabels(): label.set_size('x-small') ax_left.set_xlim((int(left_ts['avg_forcing'].mpl_dates[0]), math.ceil(left_ts['avg_forcing'].mpl_dates[-1]))) ax_left.set_xlabel('Year-days in {0} and {1}'.format( self.config.run_start_date.year, self.config.run_start_date.year + 1), size='x-small') return fig