Skip to content

Suggested fixes for timeseries plots in PlotData module #88

@KayShelton

Description

@KayShelton

I have some suggestions for fixing the frequency and julian_day plots created for the historical data using the PlotData module.

The frequency plot had overlapping year labels. The julian_day plot did not show any data for me, I think this is related to the use of seaborn.barplot but not entirely sure what the issue was. The julian_day plot also did not fit into the plot correctly, with y-labels cut off.

Change for frequency plot (apologies, I can't seem to get the code indentation to behave for the first line):
class PlotFrequency(PlotData):

def plotFrequency(self, years, frequency):
    """
    Plot annual count of events within the domain.

    TODO: Automatically adjust the x-tickmarks to be spaced
          nicely (i.e. no overlap of labels).
          Offer option of drawing the mean value (using
          `axes.axhline`) or a linear trend line.
    """
    """
    Bar plot, with added trend line or mean line

    :param x: `numpy.ndarray` of x-values.
    :param y: `numpy.ndarray` of y-values.
    :param str name: Name of the parameter, which will be used
                     in the filename.
    :param list labels: A list of the x- and y-axis labels to apply.
    """

    labels = ["Year", "Number"]

    fig, ax = plt.subplots(1, 1)
    sns.barplot(years.astype(int), frequency, ax=ax)
    ax.set_xlabel(labels[0])
    ax.set_ylabel(labels[1])
    
    for label in ax.get_xticklabels():
        if np.int(label.get_text()) % 10 == 0:  # every 10th label is kept
            label.set_visible(True)
        else:
            label.set_visible(False)

    ax.axhline(np.mean(frequency))
    sns.despine()
    fig.tight_layout()
    self.savefig("frequency")

Resulting plot:
frequency

Update to julian_day plot (apologies, I can't seem to get the code indentation to behave for the first line):
class PlotDays(PlotData):

def plotJulianDays(self, julianDayObs, julianDayGenesis):
    """
    Plot bar graphs of the number of TC observations per day of year
    and genesis events per day of year.

    TODO: Format the tick marks to represent monthly intervals.
          Add a KDE over both bar plots, remembering this is cyclic
          data (so KDE[-1] ~ KDE[0]).
    """
    dateLocator = mdates.MonthLocator(bymonthday=15, interval=1)
    dateFormat = mdates.DateFormatter("%b")
    dates = mdates.num2date(julianDayObs[:, 0])

    with plt.rc_context(dict(sns.axes_style(rc={'patch.edgecolor': "white",'patch.force_edgecolor': True}), **sns.plotting_context(rc={'patch.linewidth':.25}))):
        f, (ax1, ax2) = plt.subplots(2, 1, sharex=True)
        sns.barplot(julianDayObs[:, 0], julianDayObs[:, 1], ax=ax1)
        ax1.set_xlim((1, 365))
        ax1.set_ylabel('Observations')

        sns.barplot(julianDayGenesis[:, 0], julianDayGenesis[:, 1], ax=ax2)
        ax2.set_xlim((1, 365))
        ax2.set_xlabel('Month')
        ax2.set_ylabel('Genesis events')

        ax2.xaxis.set_major_locator(MONTH_LOCATOR)
        ax2.xaxis.set_major_formatter(MONTH_FORMATTER)

    sns.despine()
    f.tight_layout()
    self.savefig("julian_day")

Resulting plot:
julian_day

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions