2010-06-28 5 views
12

J'ai une variable y, que j'essaie de tracer contre deux axes x liés, en haut et en bas de la figure (par exemple y = "nombre de choses dans le cube", x1 = "longueur du cube", x2 = "volume de cube"). J'ai y, x1, x2 dans des tableaux numpy. La relation entre mon x1 et x2 est un-à-un et monotone, mais pas simple, et ils augmentent dans des directions différentes, comme "longueur de côté" et "volume inverse". J'ai essayé d'utiliser twiny() et twin(), mais ceux-ci semblent être conçus pour tracer différentes variables y. Des idées? Merci tout le monde! Voici un exemple du genre de chose que j'essaie de faire, sauf avec une seule ligne plutôt qu'avec des symboles. L'idée est que, disons, sigma = 0,4 et M = 2e15 sont des étiquettes équivalentes et interchangeables pour un point.Matplotlib: une ligne, tracée contre deux axes x liés dans des unités différentes?

alt text http://img580.imageshack.us/img580/4554/screenshotuy.png

Répondre

8

Pour différentes échelles x utiliser twiny() (penser à cela comme "axes y partagés"). Un exemple légèrement adapté de la matplotlib documentation:

import numpy as np 
import matplotlib.pyplot as plt 

# plot f(x)=x for two different x ranges 
x1 = np.linspace(0, 1, 50) 
x2 = np.linspace(0, 2, 50) 
fig = plt.figure() 

ax1 = fig.add_subplot(111) 
ax1.plot(x1, x1,'b--') 

ax2 = ax1.twiny() 
ax2.plot(x2, x2, 'go') 

plt.show() 

Si vous vouliez juste une seconde parcelle de l'axe des secondes données définies comme invisibles.

ax2.plot(x2, x2, alpha=0) 
+1

Ceci trace deux lignes dans la même figure, mises à l'échelle par rapport aux différents axes x. J'essaie de tracer une ligne, mise à l'échelle par rapport à l'axe x inférieur, tandis que l'axe x supérieur est juste pour indiquer cette même ligne dans différentes unités. Je vais ajouter un exemple à ma question, qui est très similaire à ce que j'ai besoin de faire --- la variance sur le fond, la masse sur le dessus, où la variance (masse) et vice versa. Merci encore. – Kyle

+0

@Kyle J'ai mis à jour la réponse pour ce cas. –

+1

Merci. Ok ... c'est plus proche, mais le problème est que le deuxième axe est effectivement un nouveau tracé juste superposé sur le premier. Mon axe supérieur doit connaître l'axe du bas pour que la relation entre les deux soit correcte. Dans mon exemple, la relation entre M et sigma peut être compliquée, donc vous ne pouvez pas avoir les tics sur les deux linéairement divisé entre leur min et max. Il n'y a peut-être pas de moyen facile de le faire automatiquement dans matplotlib (bien que l'on me dise qu'il y en a dans IDL ...). – Kyle

Questions connexes