Matplotlib: ajouter des chaînes sous forme de x-ticks personnalisés, mais aussi conserver les étiquettes de tique existantes (numériques)? Solutions de rechange à matplotlib.pyplot.annoter?

j'essaie de produire un graphique et j'ai quelques problèmes à l'annoter.

mon graphique a une échelle logarithmique sur l'axe des abscisses, qui montre le temps. Ce que je veux être en mesure de faire est de garder les étiquettes de tique numérique existantes (mais pas prévisible) à 100 unités, 1000 unités, 10000 unités, etc mais aussi ajouter des étiquettes de tique personnalisées à l'axe des x qui le rendent clair où plus "lisible par l'homme" intervalles de temps se produisent---par exemple, je veux être en mesure d'étiqueter "une semaine", "un mois", "6 mois", etc.

je peux utiliser matplotlib.pyplot.Annoter () pour marquer les points mais il ne fait pas vraiment ce que je veux. Je ne veux pas vraiment de texte et de flèches en haut de mon graphique, je veux juste ajouter quelques marques de tique personnalisées supplémentaires. Des idées?

18
demandé sur Charles 2012-05-16 13:44:25

4 réponses

si vous voulez vraiment ajouter des tiques supplémentaires, vous pouvez utiliser axis.xaxis.get_majorticklocs(), ajouter ce que vous voulez ajouter, puis définissez les tiques à l'aide de axis.xaxis.set_ticks(<your updated array>).

Une autre solution serait d'ajouter des lignes verticales en utilisant axvline. L'avantage est que vous n'avez pas à vous soucier d'insérer votre TIC personnalisé dans le tableau existant, mais vous devrez annoter les lignes manuellement.

une autre solution serait d'ajouter un axe lié à votre personnalisé tiques.

16
répondu ev-br 2015-08-22 06:32:10

à Partir de http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.xticks:

# return locs, labels where locs is an array of tick locations and
# labels is an array of tick labels.
locs, labels = xticks()

Donc tout ce que vous devez faire est d'obtenir l' locs et labels puis modifier labels à votre goût (dummy exemple):

labels = ['{0} (1 day)','{0} (1 weak)', '{0} (1 year)']
new_labels = [x.format(locs[i]) for i,x  in enumerate(labels)]

puis exécuter:

xticks(locs, new_labels)
12
répondu deinonychusaur 2012-05-16 10:24:16

C'est ma solution. Les principaux avantages sont:

  • vous pouvez spécifier les axes (utile pour les axes jumeaux ou si vous travaillez avec plusieurs axes simultanément)
  • Vous pouvez spécifier l'axe (mettre les tiques sur l'axe x ou l'axe y)
  • vous pouvez facilement ajouter de nouvelles tiques tout en gardant les automatiques
  • Il remplace automatiquement si vous ajoutez une tique qui existe déjà.

Code:

#!/usr/bin/python
from __future__ import division
import matplotlib.pyplot as plt
import numpy as np

#Function to add ticks
def addticks(ax,newLocs,newLabels,pos='x'):
    # Draw to get ticks
    plt.draw()

    # Get existing ticks
    if pos=='x':
        locs = ax.get_xticks().tolist()
        labels=[x.get_text() for x in ax.get_xticklabels()]
    elif pos =='y':
        locs = ax.get_yticks().tolist()
        labels=[x.get_text() for x in ax.get_yticklabels()]
    else:
        print("WRONG pos. Use 'x' or 'y'")
        return

    # Build dictionary of ticks
    Dticks=dict(zip(locs,labels))

    # Add/Replace new ticks
    for Loc,Lab in zip(newLocs,newLabels):
        Dticks[Loc]=Lab

    # Get back tick lists
    locs=list(Dticks.keys())
    labels=list(Dticks.values())

    # Generate new ticks
    if pos=='x':
        ax.set_xticks(locs)
        ax.set_xticklabels(labels)
    elif pos =='y':
        ax.set_yticks(locs)
        ax.set_yticklabels(labels)


#Get numpy arrays
x=np.linspace(0,2)
y=np.sin(4*x)

#Start figure
fig = plt.figure()
ax=fig.add_subplot(111)

#Plot Arrays
ax.plot(x,y)
#Add a twin axes
axr=ax.twinx()

#Add more ticks
addticks(ax,[1/3,0.75,1.0],['1/3','3/4','Replaced'])
addticks(axr,[0.5],['Miguel'],'y')

#Save figure
plt.savefig('MWE.pdf')  
5
répondu Miguel 2015-04-09 22:26:01
# Get back tick lists
locs=Dticks.keys()
labels=Dticks.values()

doit être remplacé par

# Get back tick lists
locs=list(Dticks.keys())
labels=list(Dticks.values())
PEP 3106.

1
répondu Kreger51 2015-04-05 09:30:58