web-dev-qa-db-fra.com

ensemble de parcelles matplotlib x_ticks

Comment pourrais-je définir les étiquettes x_axis aux indices 1,2,3 .... n pour être quelque chose de différent.

lam_beta = [(lam1,beta1),(lam1,beta2),(lam1,beta3),....(lam_n,beta_n)]
chunks = [chunk1,chunk2,...chunk_n]
ht_values_per_chunk = {chunk1:[val1,val2,...],chunk2:[val1,val2,val3,.....]...}
color='rgbycmk'
     j=0
     for chunk in chunks:
        plt.plot([hr_values_per_chunk[chunk][i] for i,item in enumerate(lam_beta)],[i for i,item in enumerate(lam_beta)],color=j%len(color))
        j+=1

     plt.set_xticks([i for i,item in enumerate(lam_beta)])
     plt.set_xticklabels([item for item in lam_beta],rotation='vertical')
     plt.show()

Erreur:

AttributeError: l'objet 'module' n'a pas d'attribut 'set_xticks'

Ici, je ne peux pas définir les valeurs du lambda_beta Tuple comme étant les valeurs de chacun des ticks sur l'axe des x car il dit que plt n'a pas une telle méthode. Comment pourrais-je y parvenir pour plt? J'ai utilisé des xticks car c'est ainsi que je l'avais fait en générant un histogramme dans matplotlib. Toute aide serait appréciée. Merci d'avance!

11
anonuser0428

set_xticks et set_xticklabels sont des méthodes d'axes, pas des fonctions dans l'espace de noms du module plt. C'est la signification du message d'erreur, 'module' object has no attribute 'set_xticks'.

De plus,

[i for i,item in enumerate(lam_beta)]

peut être simplifié en

range(len(lam_beta))

et

[item for item in lam_beta]

peut être simplifié en

lam_beta

Un moyen pratique de mettre la main sur le axes est d'appeler plt.subplots :

Alors:

fig, ax = plt.subplots()
...
ax.set_xticks(range(len(lam_beta)))
ax.set_xticklabels(lam_beta, rotation='vertical')

ax est un objet Axes. L'appel des méthodes Axes est l'approche orientée objet de l'utilisation de matplotlib.


Vous pouvez également utiliser l'interface pylab de style Matlab en appelant plt.xticks . Si nous définissons

loc = range(len(lam_beta))
labels = lam_beta

puis

plt.xticks(loc, labels, rotation='vertical')

est équivalent à

fig, ax = plt.subplots()
ax.set_xticks(loc)
ax.set_xticklabels(labels, rotation='vertical')

plt.xticks définit les emplacements et les étiquettes des graduations sur les axes actuels.


La compréhension de la liste

[hr_values_per_chunk[chunk][i] for i,item in enumerate(lam_beta)]

pourrait être simplifié

hr_values_per_chunk[chunk][:len(lam_beta)]

Et vous pouvez éviter de définir le paramètre color pour chaque appel à ax.plot en utilisant ax.set_color_cycle :

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
lam_beta = [(lam1,beta1),(lam1,beta2),(lam1,beta3),....(lam_n,beta_n)]
chunks = [chunk1,chunk2,...chunk_n]
ht_values_per_chunk = {chunk1:[val1,val2,...],chunk2:[val1,val2,val3,.....]...}
color='rgbycmk'
ax.set_color_cycle(colors)

for chunk in chunks:
    vals = hr_values_per_chunk[chunk][:len(lam_beta)]
    ax.plot(vals, range(len(lam_beta)))

ax.set_xticks(range(len(lam_beta)))
ax.set_xticklabels(lam_beta, rotation='vertical')
plt.show()
20
unutbu