web-dev-qa-db-fra.com

Récupérer les données XY de la figure matplotlib

J'écris une petite application dans wxPython qui a une figure matplotlib (en utilisant le backend wxagg). Je voudrais ajouter la possibilité pour l'utilisateur d'exporter les données X, Y de ce qui est actuellement tracé dans la figure vers un fichier texte. Existe-t-il un moyen non invasif de le faire? J'ai beaucoup cherché et je n'arrive pas à trouver quoi que ce soit, même si j'ai l'impression que c'est incroyablement simple et juste en face de mon visage.

Je pourrais certainement obtenir les données et les stocker quelque part quand elles sont tracées, et les utiliser - mais ce serait assez envahissant, dans les niveaux inférieurs de mon code. Ce serait tellement plus facile et universel si je pouvais faire quelque chose d'aussi simple que:

x = FigurePanel.axes.GetXData()
y = FigurePanel.axes.GetYData()

J'espère que cela a du sens :)

Merci beaucoup! Toute aide est grandement appréciée!

edit : pour clarifier, ce que j'aimerais savoir, c'est obtenir les données X, Y. Écrire dans le fichier texte après cela est trivial;)

17
brettb

Cela marche:

In [1]: import matplotlib.pyplot as plt

In [2]: plt.plot([1,2,3],[4,5,6])
Out[2]: [<matplotlib.lines.Line2D at 0x30b2b10>]

In [3]: ax = plt.gca() # get axis handle

In [4]: line = ax.lines[0] # get the first line, there might be more

In [5]: line.get_xdata()
Out[5]: array([1, 2, 3])

In [6]: line.get_ydata()
Out[6]: array([4, 5, 6])

In [7]: line.get_xydata()
Out[7]: 
array([[ 1.,  4.],
       [ 2.,  5.],
       [ 3.,  6.]])

Je les ai trouvés en fouillant dans l'objet axe. Je n'ai pu trouver que informations minimales sur ces fonctions, apparemment vous pouvez leur donner un drapeau booléen pour obtenir des données originales ou traitées, je ne sais pas ce que cela signifie.

Edit : Joe Kington a montré une façon légèrement plus nette de le faire:

In [1]: import matplotlib.pyplot as plt

In [2]: lines = plt.plot([1,2,3],[4,5,6],[7,8],[9,10])

In [3]: lines[0].get_data()
Out[3]: (array([1, 2, 3]), array([4, 5, 6]))

In [4]: lines[1].get_data()
Out[4]: (array([7, 8]), array([ 9, 10]))
30
Bas Swinckels