def plot_durations(stream, durations, axes=None, axis_index=None, figsize=None, file=None, minfontsize=14, show=False, title=None, xlabel=None, ylabel=None): """ Create plots of durations. Args: stream (obspy.core.stream.Stream): Set of acceleration data with units of gal (cm/s/s). durations (list): List of percentage minimum and maximums (tuple). axes (ndarray): Array of subplots. Default is None. axis_index (int): First index of axes array to plot the traces. Default is None. Required if axes is not None. figsize (tuple): Tuple of height and width. Default is None. file (str): File where the image will be saved. Default is None. show (bool): Plot the figure. Default is False. title (str): Title for plot. Default is None. xlabel (str): Label for x axis. Default is None. ylabel (str): Label for y axis. Default is None. Returns: numpy.ndarray: Array of matplotlib.axes._subplots.AxesSubplot. """ if len(stream) < 1: raise Exception('No traces contained within the provided stream.') arias = Arias(stream) Ia = arias.arias_stream NIa = Ia.normalize(False) starttime = stream[0].stats.starttime if title is None: title = ('Event on ' + str(starttime.month) + '/' + str(starttime.day) + '/' + str(starttime.year)) if xlabel is None: xlabel = 'Time (s)' if ylabel is None: ylabel = 'NIa (m/s)' if figsize is None: figsize = (6.5, 7.5) if axes is None: fig, axs = plt.subplots(len(NIa), 1, figsize=figsize) axis_numbers = np.linspace(0, len(NIa) - 1, len(NIa)) elif axis_index is not None: axs = axes axis_numbers = np.linspace(axis_index, axis_index + len(NIa) - 1, len(NIa)) for idx, trace in zip(axis_numbers.astype(int), NIa): ax = axs[idx] dt = trace.stats['delta'] npts = len(trace.data) t = np.linspace(0, (npts - 1) * dt, num=npts) network = trace.stats['network'] station = trace.stats['station'] channel = trace.stats['channel'] trace_label = network + '.' + station + '.' + channel ax.set_title(trace_label, fontsize=minfontsize) ax.plot(t, trace.data) if xlabel: ax.set_xlabel(xlabel) if xlabel: ax.set_ylabel(ylabel) for i, duration in enumerate(durations): first_percentile = duration[0] second_percentile = duration[1] t1 = get_time_from_percent(trace.data, first_percentile, dt) t2 = get_time_from_percent(trace.data, second_percentile, dt) height = (1 / (len(durations) + 1) * i) + 1 / (len(durations) + 1) ax.plot(t1, first_percentile, 'ok') ax.plot(t2, second_percentile, 'ok') ax.annotate('', xy=(t1, height), xytext=(t2, height), arrowprops=dict(arrowstyle='<->')) label = '$D_{%i{-}%i}$' % (100 * duration[0], 100 * duration[1]) ax.text(t2, height, label, style='italic', horizontalalignment='left', verticalalignment='center') ax.set_xlabel(xlabel, fontsize=minfontsize) ax.set_ylabel(ylabel, fontsize=minfontsize) ax.xaxis.set_tick_params(labelsize=minfontsize - 2) ax.yaxis.set_tick_params(labelsize=minfontsize - 2) plt.suptitle(title, y=1.01, fontsize=minfontsize + 4) plt.tight_layout() if show and axes is None: plt.show() if file is not None and axes is None: if not file.endswith(".png"): file += ".png" fig.savefig(file) return axs
def plot_arias(stream, axes=None, axis_index=None, figsize=None, file=None, minfontsize=14, show=False, show_maximum=True, title=None, xlabel=None, ylabel=None): """ Create plots of arias intensity. Args: stream (obspy.core.stream.Stream): Set of acceleration data with units of gal (cm/s/s). axes (ndarray): Array of subplots. Default is None. axis_index (int): First index of axes array to plot the traces. Default is None. Required if axes is not None. figsize (tuple): Tuple of height and width. Default is None. file (str): File where the image will be saved. Default is None. minfontsize (int): Minimum font size. Default is 14. show (bool): Plot the figure. Default is False. show_maximum (bool): Show the maximum value. title (str): Title for plot. Default is None. xlabel (str): Label for x axis. Default is None. ylabel (str): Label for y axis. Default is None. Returns: numpy.ndarray: Array of matplotlib.axes._subplots.AxesSubplot. """ if len(stream) < 1: raise Exception('No traces contained within the provided stream.') arias = Arias(stream) Ia = arias.arias_stream starttime = stream[0].stats.starttime if title is None: title = ('Event on ' + str(starttime.month) + '/' + str(starttime.day) + '/' + str(starttime.year)) if xlabel is None: xlabel = 'Time (s)' if ylabel is None: ylabel = 'Ia (m/s)' if figsize is None: figsize = (6.5, 7.5) if axes is None: fig, axs = plt.subplots(len(Ia), 1, figsize=figsize) axis_numbers = np.linspace(0, len(Ia) - 1, len(Ia)) elif axis_index is not None: axs = axes axis_numbers = np.linspace(axis_index, axis_index + len(Ia) - 1, len(Ia)) for idx, trace in zip(axis_numbers.astype(int), Ia): ax = axs[idx] dt = trace.stats['delta'] npts = len(trace.data) t = np.linspace(0, (npts - 1) * dt, num=npts) network = trace.stats['network'] station = trace.stats['station'] channel = trace.stats['channel'] trace_label = network + '.' + station + '.' + channel ax.set_title(trace_label, fontsize=minfontsize) ax.plot(t, trace.data) if show_maximum: abs_arr = np.abs(trace.data.copy()) idx = np.argmax(abs_arr) max_value = abs_arr[idx] ax.plot([t[idx]], [trace.data[idx]], marker='o', color="red") ax.annotate('%.2E' % max_value, (t[idx], trace.data[idx]), xycoords='data', xytext=(.85, 0.25), textcoords='axes fraction', arrowprops=dict(facecolor='black', shrink=0.05, width=1, headwidth=4), horizontalalignment='right', verticalalignment='top') ax.set_xlabel(xlabel, fontsize=minfontsize) ax.set_ylabel(ylabel, fontsize=minfontsize) ax.xaxis.set_tick_params(labelsize=minfontsize - 2) ax.yaxis.set_tick_params(labelsize=minfontsize - 2) plt.suptitle(title, y=1.01, fontsize=minfontsize + 4) plt.tight_layout() if show and axes is None: plt.show() if file is not None and axes is None: fig.savefig(file, format='png') return axs