5

Ma question est assez simple: dans matplotlib, comment puis-je convertir facilement les coordonnées dans le système Axis/du système de données (Idéalement, je suis à la recherche d'une fonction simple output_coords = magic_func(input_coords))Python/Matplotlib: convertir Axis <=> systèmes les coordonnées données

En fait, mon problème exact est: Je voudrais tracer un matplotlib.patches.Ellipse avec son centre dans le système Axis mais sa taille (largeur & longueur) dans le système de données. Mais la méthode transforms.blended_transform_factory ne fonctionne pas dans ce cas.

Merci!

+1

Vous devriez probablement jeter un oeil à [cette ] (http://matplotlib.org/users/transforms_tutorial.html) – Arthur

Répondre

3

Aucune solution immédiate trouvée, besoin de l'écrire moi-même:

def axis_data_coords_sys_transform(axis_obj_in,xin,yin,inverse=False): 
    """ inverse = False : Axis => Data 
       = True : Data => Axis 
    """ 
    xlim = axis_obj_in.get_xlim() 
    ylim = axis_obj_in.get_ylim() 

    xdelta = xlim[1] - xlim[0] 
    ydelta = ylim[1] - ylim[0] 
    if not inverse: 
     xout = xlim[0] + xin * xdelta 
     yout = ylim[0] + yin * ydelta 
    else: 
     xdelta2 = xin - xlim[0] 
     ydelta2 = yin - ylim[0] 
     xout = xdelta2/xdelta 
     yout = ydelta2/ydelta 
    return xout,yout 
+0

C'est gentil, merci. Il pourrait facilement être modifié pour fonctionner aussi pour les axes à échelle logarithmique, en utilisant 'axis_obj_in.get_ [x ou y] scale()'. – askewchan

5

Pour obtenir des transformations de l'Axes exemple ax, vous pouvez utiliser

axis_to_data = ax.transAxes + ax.transData.inverted() 
points_data = axis_to_data.transform(points_axis) 
data_to_axis = axis_to_data.inverted() 
numpy.testing.assert_allclose(points_axis, data_to_axis.transform(points_data)) 
+0

Salut là-bas, cela a incroyablement résolu mon cas. Existe-t-il une page de documentation où l'on combine les méthodes trans *() et les classes? – grafa