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)]
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
Ou comme un tracé de ligne,
>>> plt.plot(*Zip(*testList2))
>>> plt.show()
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
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:
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:
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.
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()
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).
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)