Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Accidental overlay of graphs in matplotlib

enter image description here enter image description here

It looks like the datapoints in the first graph accidentally overlays the second graph. The code I'm running is being run several times and it when I first have a short period and the second time I run it I have a longer period while the datapoints in the short period is also part of the longer period.

So is there a way to clean the plot before you start building a graph?

You can see the code for building the graph here:

def create_graph(self, device):

    # 800 and 355 pixels.
    ticks = 5
    width = 8
    height = 3.55

    dpi = 100
    bgcolor = '#f3f6f6'

    font = {
        'size': 16,
        'family': 'Arial'
    }
    plt.rc('font', **font)

    # size of figure and setting background color
    fig = plt.gcf()
    fig.set_size_inches(width, height)
    fig.set_facecolor(bgcolor)

    # axis color, no ticks and bottom line in grey color.
    ax = plt.axes(axisbg=bgcolor, frameon=True)
    ax.xaxis.set_ticks_position('none')
    ax.spines['bottom'].set_color('#aabcc2')
    ax.yaxis.set_ticks_position('none')

    # removing all but bottom spines
    for key, sp in ax.spines.items():
        if key != 'bottom':
            sp.set_visible(False)

    # setting amounts of ticks on y axis
    yloc = plt.MaxNLocator(ticks)
    ax.yaxis.set_major_locator(yloc)


    x_no_ticks = 8
    # Deciding how many ticks we want on the graph
    locator = AutoDateLocator(maxticks=x_no_ticks)
    formatter = AutoDateFormatter(locator)
    # Formatter always chooses the most granular since we have granular dates
    # either change format or round dates depending on how granular
    # we want them to be for different date ranges.
    formatter.scaled[1/(24.*60.)] = '%d/%m %H:%M'

    ax.xaxis.set_major_locator(locator)
    ax.xaxis.set_major_formatter(formatter)

    # turns off small ticks
    plt.tick_params(axis='x',
                    which='both',
                    bottom='on',
                    top='off',
                    pad=10)
    # Can't seem to set label color differently, changing tick_params color changes labels.
    ax.xaxis.label.set_color('#FFFFFF')

    # setting dates in x-axis automatically triggers use of AutoDateLocator
    x = [datetime.fromtimestamp(point['x']) for point in device['data']]
    y = [point['y'] for point in device['data']]
    plt.plot(x, y, color='#53b4d4', linewidth=2)

    # pick values for y-axis
    y_ticks_values = np.array([point['y'] for point in device['data']])
    y_ticks = np.linspace(y_ticks_values.min(), y_ticks_values.max(), ticks)
    y_ticks = np.round(y_ticks, decimals=2)
    plt.yticks(y_ticks, [str(val) + self.extract_unit(device) for val in y_ticks])
    # plt.ylim(ymin=0.1)  # Only show values of a certain threshold.

    plt.tight_layout()
    buf = io.BytesIO()
    plt.savefig(buf,
                format='png',
                facecolor=fig.get_facecolor(),
                dpi=dpi)
like image 245
Jonathan Avatar asked Nov 23 '25 17:11

Jonathan


1 Answers

You have to add plt.close() after plt.savefig(). So the figure won't be caught by the next plt.gcf() call.

like image 148
jrjc Avatar answered Nov 25 '25 07:11

jrjc