F1990
F1990

Reputation: 637

Good date format on x-axis matplotlib

I have the following dataframe:

Time    test
0:05    2
0:06    2
0:07    2
0:08    2
0:09    2
0:10    2
0:11    2

This datframe starts at 0:00 and ends at 11:59. I created the following graph with:

x = dftestgraph['Time']
y = dftestgraph['test']
plt.ylabel('Number of tasks')
plt.plot(x, y, color="#00a1e4", label="Number of Tasks")
plt.fill(x, y, '#00a1e4', alpha=0.8)
plt.show()

Graph

Why is there a line in the bottom of the graph, that splits my filled graph in half? And I would like to format my x-axis as ( 0:00, 0:30, 1:00 etc.) I tried:

plt.xticks(0:00, 11:59, 30:00))

However this does not work. My question is:

Upvotes: 3

Views: 4244

Answers (1)

Jean-Sébastien
Jean-Sébastien

Reputation: 2717

plt.fill basically links the first and last point of the time series to build its polygon. I would use fill_between instead.

I've put together a MWE below that shows how it can be done. It also show a way to format the xaxis labels as you wanted, derived from the following posts: Creating graph with date and time in axis labels with matplotlib and Plotting time in Python with Matplotlib.

import matplotlib.pyplot as plt
import numpy as np
from matplotlib import dates
import datetime

plt.close('all')

#---- generate some data ----

t = [datetime.datetime(2015, 1, 1, 0) + 
     datetime.timedelta(hours=i) for i in np.arange(0,12.1,0.5)]
x = np.random.rand(len(t))

#---- create figure and axe ----

fig = plt.figure()

ax = fig.add_axes([0.1, 0.2, 0.85, 0.75])

#---- format xaxis ----

# position of the labels
xtk_loc = [datetime.datetime(2015, 1, 1, 0) + 
           datetime.timedelta(hours=i) for i in np.arange(0,12.1,0.5)]
ax.set_xticks(xtk_loc)
ax.tick_params(axis='both', direction='out', top='off', right='off')

# format of the labels
hfmt = dates.DateFormatter('%H:%M')
ax.xaxis.set_major_formatter(hfmt)
fig.autofmt_xdate(rotation=90, ha='center')

#---- set axes labels ----

ax.set_ylabel('Number of tasks', labelpad=10, fontsize=14)
ax.set_xlabel('Time', labelpad=20, fontsize=14)

#---- plot data ----

ax.plot(t, x, color="#004c99", label="Number of Tasks")
ax.fill_between(t, x, 0, facecolor='#00a1e4', alpha=0.5, lw=0.5)

#---- set axis limits ----

timemin = datetime.datetime(2015, 1, 1, 0)
timemax = datetime.datetime(2015, 1, 1, 12)

ax.axis(xmin=timemin, xmax=timemax)

plt.show()  

which results in:

enter image description here

Upvotes: 7

Related Questions