Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Suggested fixes for timeseries plots in PlotData module #88

Open
KayShelton opened this issue Apr 29, 2020 · 0 comments
Open

Suggested fixes for timeseries plots in PlotData module #88

KayShelton opened this issue Apr 29, 2020 · 0 comments

Comments

@KayShelton
Copy link

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants