2016-05-24 1 views
1

J'espérais que vous pourriez m'aider à résoudre ce petit problème. Je suis en train de tracer trois ensembles de tableaux errorbars et je veux avoir un deuxième ensemble de ticks sur la partie supérieure de l'intrigue. Je crée donc un nouvel axe double auquel je donne les mêmes coordonnées pour les graduations, x. enter image description here La partie du code qui est censé le faire est la suivantetwiny() axe non alligned à l'axe inférieur - matplotlib

x = np.arange(len(Stars))*2 
fig = plt.figure() 
ax1 = fig.add_subplot(111) 
ax2 = ax1.twiny() 

ax1.errorbar(x-.5,[Jmin_IS[i] for i in Ind],yerr=[[J1sL_IS[i] for i in Ind],[J1sR_IS[i] for i in Ind]],fmt='o',ms=6) 
ax1.errorbar(x ,[Jmin_OM[i] for i in Ind],yerr=[[J1sL_OM[i] for i in Ind],[J1sR_OM[i] for i in Ind]],fmt='s',ms=6) 
ax1.errorbar(x+.5,[Jmin_CA[i] for i in Ind],yerr=[[J1sL_CA[i] for i in Ind],[J1sR_CA[i] for i in Ind]],fmt='^',ms=6) 
for xv in np.arange(len(Stars))*4: ax1.axvspan(xv-1, xv+1, color='grey',alpha=.5) 
x2labels = [str(r'N$_{\star}$=%i'%Stars[i]) for i in Ind] 
ax1.set_xticks(x) 
ax2.set_xticks(x) 
ax2.set_xticklabels(x2labels, rotation=90)  
ax1.set_ylim(15,21) 
ax1.set_xlim(-1,39) 
plt.tight_layout() 
plt.grid(ls='dotted',axis='y') 
plt.show() 

et les résultats est représenté sur la figure

Il y a deux problèmes: d'abord les tiques AX2 biaxial sont décalées (les numéros N_star sont désalignés avec respectés aux coches de l'axe x du bas) et aucune grille dans la direction y n'est affichée. Quelqu'un peut-il repérer une erreur? Est-ce une question de version des paquets python? Merci beaucoup

Répondre

0

Le problème où les graduations de l'axe y supérieur et de l'axe y inférieur ne s'alignent pas, c'est que vous avez modifié les valeurs x-datalimits des premiers axes. En d'autres termes, vous avez changé le "zoom x" d'un axe, mais pas le "zoom x" de l'autre, ce qui provoque un désalignement des graduations. Si vous écrivez également

ax2.set_xlim(-1,39) 

ce problème sera résolu.

Comme pour ne pas avoir les y-quadrillages apparaissant, qui peut être résolu en utilisant la méthode grid des premiers axes:

ax1.grid(ls='dotted',axis='y') 

Lorsque vous appelez plt.grid (ou toute autre méthode de pyplot), il fonctionnera sur les derniers axes actifs, qui dans ce cas est ax2. Je ne suis pas exactement sûr pourquoi ax2.grid(axis='y') ne montre pas le quadrillage, mais c'est une solution facile d'utiliser simplement la méthode sur les axes qui ont servi de base pour l'autre.

+0

magnifique! merci beaucoup Oliver – andrea