web-dev-qa-db-fra.com

Python: liste des nuplets

J'ai le jeu de données suivant. Je voudrais utiliser python ou gnuplot pour tracer les données. Les n-uplets ont la forme (x, y). L'axe des Y doit être un axe de journalisation. IE log (y). A un nuage de points ou un tracé linéaire serait idéal.

Comment cela peut-il être fait?

 [(0, 6.0705199999997801e-08), (1, 2.1015700100300739e-08), 
 (2, 7.6280656623374823e-09), (3, 5.7348209304555086e-09), 
 (4, 3.6812203579604238e-09), (5, 4.1572516753310418e-09)]
40
olliepower

Si je comprends bien votre question, vous pouvez faire quelque chose comme ça.

>>> import matplotlib.pyplot as plt
>>> testList =[(0, 6.0705199999997801e-08), (1, 2.1015700100300739e-08), 
 (2, 7.6280656623374823e-09), (3, 5.7348209304555086e-09), 
 (4, 3.6812203579604238e-09), (5, 4.1572516753310418e-09)]
>>> from math import log
>>> testList2 = [(elem1, log(elem2)) for elem1, elem2 in testList]
>>> testList2
[(0, -16.617236475334405), (1, -17.67799605473062), (2, -18.691431541177973), (3, -18.9767093108359), (4, -19.420021520728017), (5, -19.298411635970396)]
>>> Zip(*testList2)
[(0, 1, 2, 3, 4, 5), (-16.617236475334405, -17.67799605473062, -18.691431541177973, -18.9767093108359, -19.420021520728017, -19.298411635970396)]
>>> plt.scatter(*Zip(*testList2))
>>> plt.show()

ce qui vous donnerait quelque chose comme

enter image description here

Ou comme un tracé de ligne,

>>> plt.plot(*Zip(*testList2))
>>> plt.show()

enter image description here

EDIT - Si vous voulez ajouter un titre et des étiquettes pour l'axe, vous pouvez faire quelque chose comme:

>>> plt.scatter(*Zip(*testList2))
>>> plt.title('Random Figure')
>>> plt.xlabel('X-Axis')
>>> plt.ylabel('Y-Axis')
>>> plt.show()

ce qui vous donnerait

enter image description here

56
Sukrit Kalra

Dans matplotlib ce serait:

import matplotlib.pyplot as plt

data =  [(0, 6.0705199999997801e-08), (1, 2.1015700100300739e-08),
 (2, 7.6280656623374823e-09), (3, 5.7348209304555086e-09),
 (4, 3.6812203579604238e-09), (5, 4.1572516753310418e-09)]

x_val = [x[0] for x in data]
y_val = [x[1] for x in data]

print x_val
plt.plot(x_val,y_val)
plt.plot(x_val,y_val,'or')
plt.show()

qui produirait:

enter image description here

17
K DawG

Comme d'autres personnes ont répondu, scatter() ou plot() générera le tracé que vous souhaitez. Je suggère deux améliorations aux réponses déjà présentes:

  1. Utilisez numpy pour créer la liste de coordonnées x et la liste de coordonnées y. Travailler avec des ensembles de données volumineux est plus rapide numpy que d'utiliser l'itération Python suggéré dans d'autres réponses.

  2. Utilisez pyplot pour appliquer l'échelle logarithmique plutôt que d'opérer directement sur les données, sauf si vous souhaitez réellement disposer des journaux.

    import matplotlib.pyplot as plt
    import numpy as np
    
    data = [(2, 10), (3, 100), (4, 1000), (5, 100000)]
    data_in_array = np.array(data)
    '''
    That looks like array([[     2,     10],
                           [     3,    100],
                           [     4,   1000],
                           [     5, 100000]])
    '''
    
    transposed = data_in_array.T
    '''
    That looks like array([[     2,      3,      4,      5],
                           [    10,    100,   1000, 100000]])
    '''    
    
    x, y = transposed 
    
    # Here is the OO method
    # You could also the state-based methods of pyplot
    fig, ax = plt.subplots(1,1) # gets a handle for the AxesSubplot object
    ax.plot(x, y, 'ro')
    ax.plot(x, y, 'b-')
    ax.set_yscale('log')
    fig.show()
    

result

J'ai également utilisé ax.set_xlim(1, 6) et ax.set_ylim(.1, 1e6) pour le rendre joli.

J'ai utilisé l'interface orientée objet de matplotlib. Parce qu'elle offre une plus grande flexibilité et une clarté explicite en utilisant les noms des objets créés, l'interface OO est préférable à l'interface interactive basée sur l'état).

11
Bennett Brown

Vous pouvez aussi utiliser Zip

import matplotlib.pyplot as plt

l = [(0, 6.0705199999997801e-08), (1, 2.1015700100300739e-08),
     (2, 7.6280656623374823e-09), (3, 5.7348209304555086e-09),
     (4, 3.6812203579604238e-09), (5, 4.1572516753310418e-09)]

x, y = Zip(*l)

plt.plot(x, y)
4
Philippe Chavanne