2015-11-16 10 views
7

Sto cercando di regolare la formattazione delle etichette del segno di spunta dell'asse x in modo che mostri solo i valori di anno e mese. Da quello che ho trovato online, devo usare mdates.DateFormatter, ma non ha alcun effetto con il mio codice attuale così com'è. Qualcuno vede dove si trova il problema? (Le date sono l'indice del dataframe panda)Matplotlib DateFormatter per etichetta dell'asse non funzionante

import matplotlib.dates as mdates 
import matplotlib.pyplot as plt 
import pandas as pd 

fig = plt.figure(figsize = (10,6)) 
ax = fig.add_subplot(111) 

ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m')) 

basicDF['some_column'].plot(ax=ax, kind='bar', rot=75) 

ax.xaxis_date() 

enter image description here

grazie ragazzi!

codice scenario riproducibile:

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

rng = pd.date_range('1/1/2014', periods=20, freq='m') 

blah = pd.DataFrame(data = np.random.randn(len(rng)), index=rng) 

fig = plt.figure(figsize = (10,6)) 
ax = fig.add_subplot(111) 

ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m')) 

blah.plot(ax=ax, kind='bar') 

ax.xaxis_date() 

Ancora non si può ottenere solo l'anno e il mese di presentarsi ...

+0

cosa succede se si imposta il formato dopo si disegna le barre? –

+0

@PaulH - se imposto il formato dopo .plot, ottieni un errore come questo: ValueError: DateFormatter ha trovato un valore di x = 0, che è una data non valida. Questo di solito si verifica perché non hai informato l'asse che sta registrando le date, ad es. Con ax.xaxis_date(). È lo stesso per se lo metto prima di ax.xaxis_date() o dopo. – SpicyClubSauce

+0

oof - questo è il motivo per cui odio complottare con i panda. puoi rendere riproducibile il tuo esempio (ad esempio, aggiungi un codice che crei 'basisDF' senza file esterni) e proverò a dare un'occhiata. –

risposta

4

panda semplicemente non funziona bene con i formati di data-ora personalizzati .

È necessario utilizzare solo matplotlib raw in casi come questo.

import numpy 
import matplotlib.pyplot as plt 
import matplotlib.dates as mdates 
import pandas 

N = 20 
numpy.random.seed(N) 

dates = pandas.date_range('1/1/2014', periods=N, freq='m') 
df = pandas.DataFrame(
    data=numpy.random.randn(N), 
    index=dates, 
    columns=['A'] 
) 

fig, ax = plt.subplots(figsize=(10, 6)) 
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m')) 
ax.bar(df.index, df['A'], width=25, align='center') 

E questo mi dà:

enter image description here

+0

ah getcha. grazie Paolo! – SpicyClubSauce

Problemi correlati