Issue
I am using a program to make a plot of a pandas dataframe with date and time on the x axis and a variable on the y axis. I would like the plot to show the date and time for each tick on the x axis in yyyy-mm-dd hh:mm format.
Here is the code that I am using (I have hardcoded a simple dataframe to make this code easily reproducible). The below code displays this figure, which has the date and time format that I want.
import pandas as pd
from matplotlib import pyplot as plt
from matplotlib import dates as mdates
df = pd.DataFrame(
[['2022-01-01 01:01', 5],
['2022-01-01 07:01', 10],
['2022-01-01 13:01', 15],
['2022-01-01 19:01', 10]], columns=['Time', 'Variable'])
df['Time'] = pd.to_datetime(df['Time'])
df = df.set_index('Time')
fig, ax = plt.subplots()
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d %H:%M'))
ax.xaxis.set_minor_formatter(mdates.DateFormatter('%Y-%m-%d %H:%M'))
df.plot(ax=ax)
ax.tick_params(axis='x', labelrotation=45)
plt.show()
If I subtract one minute from each of the times and run the below code, I get this figure, which has a completely different date and time format.
import pandas as pd
from matplotlib import pyplot as plt
from matplotlib import dates as mdates
df = pd.DataFrame(
[['2022-01-01 01:00', 5],
['2022-01-01 07:00', 10],
['2022-01-01 13:00', 15],
['2022-01-01 19:00', 10]], columns=['Time', 'Variable'])
df['Time'] = pd.to_datetime(df['Time'])
df = df.set_index('Time')
fig, ax = plt.subplots()
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d %H:%M'))
ax.xaxis.set_minor_formatter(mdates.DateFormatter('%Y-%m-%d %H:%M'))
df.plot(ax=ax)
ax.tick_params(axis='x', labelrotation=45)
plt.show()
I have changed nothing about the code except subtract one minute from each time, but the formatting of the ticks changes, even though I have used the set_major_formatter and set_minor_formatter methods to specify a format for each tick.
Is there a way to make sure the format for the ticks stays the same regardless of the dataset that is being plotted?
Solution
The code below side steps the issue by avoiding the pandas plotting defaults. You get the same x-axis format for all cases.
import pandas as pd
from matplotlib import pyplot as plt
from matplotlib import dates as mdates
df = pd.DataFrame(
[['2022-01-01 01:00', 5 ],
['2022-01-01 07:00', 10],
['2022-01-01 13:00', 15],
['2022-01-01 19:00', 10]], columns=['Time', 'Variable'])
df['Time'] = pd.to_datetime(df['Time'])
fig, ax = plt.subplots()
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d %H:%M'))
ax.xaxis.set_minor_formatter(mdates.DateFormatter('%Y-%m-%d %H:%M'))
ax.plot('Time','Variable',data=df)
ax.tick_params(axis='x', labelrotation=45)
Answered By - Chris Seeling
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.