Le ticker matplotlib FuncFormatter

voix
0

Je suis en train de régler manuellement le symbole pour une parcelle de bar. J'utilise la fonction FunFormatter. Pourtant, je trouve que le comportement du FunFormmater est trop étrange. Pour la gamme axe X 0-91, je trouve que le FunFormmater renvoie les éléments suivants ... Toute idée de comment ça marche. Voici le lien pour le fichier de données Merci d'avance

0,0 10,0 20,0 -10,0 30,0 40,0 50,0 60,0 70,0 80,0 90,0 100,0 28,805725806451605 38,374395161290316 41,22463709677419 47,128709677419344 48,55383064516128 49,36818548387095 51,20048387096774 52,42201612903225 53,439959677419345 53,439959677419345 53,03278225806451 53,643548387096764 56,08661290322579 59,75120967741935 64,63733870967741 70,54141129032257 76,85266129032257 83,16391129032257 95,58282258064514

import numpy as np
import matplotlib.pyplot as plt
import pandas as p
import matplotlib.mlab as m
import matplotlib
import matplotlib.ticker as ticker

file1=np.load('numofdays.npz')
fig,axes=plt.subplots(ncols=1)
ax=axes
x=np.arange(len(file1['arr_0']))
y=np.array(file1['arr_0'])
ax.bar(x,y)
mydates=p.DatetimeIndex(file1['arr_1'])

def mme(xx,pos=None):
    print(xx)
#    print(mydates[int(xx-9)].strftime('%Y-%m-%d'))
    return mydates[int(xx-9)].strftime('%Y-%m-%d')

ax.xaxis.set_major_locator(ticker.MultipleLocator(10))
ax.xaxis.set_major_formatter(ticker.FuncFormatter(mme))
fig.autofmt_xdate()
Créé 20/10/2018 à 02:39
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
2

Il est un peu dangereux pour montrer que chaque étiquette dixième pour l' ONU des données équidistants, parce que vous ne savez pas ce qui se passe entre les deux.

Toutefois , pour obtenir votre script en cours d' exécution, vous aurez bien sûr besoin de se assurer la position xxest un indice valide du tableau. Par exemple , la position 100n'est pas valide, parce que votre tableau a seulement 92 éléments. À cette fin , vous pouvez simplement introduire une condition.

import numpy as np
import matplotlib.pyplot as plt
import pandas as p

import matplotlib.ticker as ticker

file1=np.load('data/numofdays.npz')

fig,ax=plt.subplots(ncols=1)

x=np.arange(len(file1['arr_0']))
y=np.array(file1['arr_0'])
ax.bar(x,y)
mydates=p.DatetimeIndex(file1['arr_1'])

def mme(xx,pos=None):
    if int(xx) in x:
        return mydates[int(xx)].strftime('%Y-%m-%d')
    else:
        return ""

ax.xaxis.set_major_locator(ticker.MultipleLocator(10))
ax.xaxis.set_major_formatter(ticker.FuncFormatter(mme))
fig.autofmt_xdate()
plt.show()

entrez la description d'image ici

Comme alternative, je pense bien tracer les dates réelles.

import numpy as np
import matplotlib.pyplot as plt
import pandas as p

file1=np.load('data/numofdays.npz')

fig,ax=plt.subplots(ncols=1)

y=np.array(file1['arr_0'])

mydates = p.DatetimeIndex(file1['arr_1'])

ax.bar(mydates,y, width=60)

fig.autofmt_xdate()
plt.show()

entrez la description d'image ici

Créé 20/10/2018 à 04:02
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more