How to plot data against specific dates on the x-axis using matplotlib
date, matplotlib, python
Solution
What you're doing is simple enough that it's easiest to just using plot, rather than plot_date. plot_date is great for more complex cases, but setting up what you need can be easily accomplished without it.
e.g., Based on your example above:
import datetime as DT
from matplotlib import pyplot as plt
from matplotlib.dates import date2num
data = [(DT.datetime.strptime('2010-02-05', "%Y-%m-%d"), 123),
(DT.datetime.strptime('2010-02-19', "%Y-%m-%d"), 678),
(DT.datetime.strptime('2010-03-05', "%Y-%m-%d"), 987),
(DT.datetime.strptime('2010-03-19', "%Y-%m-%d"), 345)]
x = [date2num(date) for (date, value) in data]
y = [value for (date, value) in data]
fig = plt.figure()
graph = fig.add_subplot(111)
# Plot the data as a red line with round markers
graph.plot(x,y,'r-o')
# Set the xtick locations to correspond to just the dates you entered.
graph.set_xticks(x)
# Set the xtick labels to correspond to just the dates you entered.
graph.set_xticklabels(
[date.strftime("%Y-%m-%d") for (date, value) in data]
)
plt.show()
If you'd prefer a bar plot, just use `plt.bar()`. To understand how to set the line and marker styles, see `plt.plot()` Plot with date labels at marker locations http://www.geology.wisc.edu/~jkington/matplotlib_date_labels.png
Problem
I have a dataset consisting of date-value pairs. I want to plot them in a bar graph with the specific dates in the x-axis. My problem is that `matplotlib` distributes the `xticks` over the entire date range; and also plots the data using points. The dates are all `datetime` objects. Here's a sample of the dataset: ``` data = [(DT.datetime.strptime('2010-02-05', "%Y-%m-%d"), 123), (DT.datetime.strptime('2010-02-19', "%Y-%m-%d"), 678), (DT.datetime.strptime('2010-03-05', "%Y-%m-%d"), 987), (DT.datetime.strptime('2010-03-19', "%Y-%m-%d"), 345)] ``` Here is a runnable code sample using `pyplot` ``` import datetime as DT from matplotlib import pyplot as plt data = [(DT.datetime.strptime('2010-02-05', "%Y-%m-%d"), 123), (DT.datetime.strptime('2010-02-19', "%Y-%m-%d"), 678), (DT.datetime.strptime('2010-03-05', "%Y-%m-%d"), 987), (DT.datetime.strptime('2010-03-19', "%Y-%m-%d"), 345)] x = [date for (date, value) in data] y = [value for (date, value) in data] fig = plt.figure() graph = fig.add_subplot(111) graph.plot_date(x,y) plt.show() ``` QUESTION SUMMARY: My situation is more like I have an `Axes` instance ready (referenced by `graph` in the code above) and I want to do the following: - Make the `xticks` correspond to the exact date values. I have heard of `matplotlib.dates.DateLocator` but I have no idea how create one and then associate it with a specific `Axes` object. - Get tighter control over the type of graph being used (bar, line, points, etc.)