2017-08-08 4 views
1

Ich möchte eine Handlung mit matplotlib.pyplot mit den Xticks in zwei Reihen für Monate und Jahre wie das Bild folgen haben. Ich habe diese Handlung gemacht, indem ich einfach dataframe.plot() verwendet habe, d.h. die einfachste Handlung von Pandas. enter image description herePlot mit zwei Zeilen Label Sticks mit Matplotlib

Wenn ich den Plot mit diesem Code (weil ich einen anderen Nebenhandlungen hinzufügen müssen, und das ist der Grund, nicht dataframe.plot() zu verwenden), wie ich das vor Einstellungen für die xticks Etiketten bekommen?

import matplotlib.pyplot as plt 
figure, ax = plt.subplots() 
ax.plot(xdata, ydata) 

ich dieses xticks Etiketten für den Plot enter image description here

ich versucht, mit matplotlib.dates.DateFormatter und matplotlib.ticker aber ich kann die richtigen Einstellungen nicht finden

Antwort

1

Sie erhalten können in der Nähe, was Sie wollen mit der Dur- und Moll-Locators und ein DateFormatter wie folgt aus:

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 
import matplotlib.dates 

dr= pd.date_range("2014-01-01", "2017-06-30", freq="D") 
df = pd.DataFrame({"dates":dr, "num":np.cumsum(np.random.randn(len(dr)))}) 
df["dates"] = pd.to_datetime(df["dates"]) 

fig, ax = plt.subplots() 
ax.plot(df.dates, df.num) 

ax.xaxis.set_minor_locator(matplotlib.dates.MonthLocator()) 
ax.xaxis.set_major_locator(matplotlib.dates.MonthLocator([1,7])) 
ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter("%b\n%Y")) 
plt.show() 

enter image description here

Um nur die Jahre für den Monat Januar, aber nicht für andere Monate, können Sie dann brauchen die DateFormatter

class MyMonthFormatter(matplotlib.dates.DateFormatter): 
    def __init__(self, fmt="%b\n%Y", fmt2="%b", major=[1], tz=None): 
     self.fmt2 = fmt2 
     self.major=major 
     matplotlib.dates.DateFormatter.__init__(self, fmt, tz=tz) 
    def __call__(self, x, pos=0): 
     if x == 0: raise ValueError('Error') 
     dt = matplotlib.dates.num2date(x, self.tz) 
     if dt.month in self.major: 
      return self.strftime(dt, self.fmt) 
     else: 
      return self.strftime(dt, self.fmt2) 

ax.xaxis.set_minor_locator(matplotlib.dates.MonthLocator()) 
ax.xaxis.set_major_locator(matplotlib.dates.MonthLocator([1,7])) 
ax.xaxis.set_major_formatter(MyMonthFormatter()) 
plt.show() 

enter image description here

Unterklasse
Verwandte Themen