it-swarm.com.de

Python: Liste der Tupel aufzeichnen

Ich habe folgenden Datensatz. Ich würde gerne python oder gnuplot zum Plotten der Daten verwenden. Die Tupel haben die Form (x, y). Die Y-Achse sollte eine Log-Achse sein. IE-Log (y). A Streudiagramm oder Liniendiagramm wären ideal.

Wie geht das?

 [(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

Wenn ich Ihre Frage richtig verstanden habe, könnten Sie so etwas tun.

>>> 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()

das würde dir sowas geben

enter image description here

Oder als Liniendiagramm,

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

enter image description here

EDIT - Wenn Sie einen Titel und Beschriftungen für die Achse hinzufügen möchten, können Sie so etwas tun

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

was würde dir geben

enter image description here

56
Sukrit Kalra

In matplotlib wäre es:

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()

was produzieren würde:

enter image description here

17
K DawG

Wie andere geantwortet haben, generiert scatter() oder plot() das gewünschte Diagramm. Ich schlage zwei Verfeinerungen der Antworten vor, die bereits hier sind:

  1. Verwenden Sie numpy, um die X-Koordinatenliste und die Y-Koordinatenliste zu erstellen. Das Arbeiten mit großen Datenmengen ist in Zahlen schneller als die in anderen Antworten vorgeschlagene Iteration in Python.

  2. Verwenden Sie Pyplot, um die logarithmische Skala anzuwenden, anstatt direkt auf die Daten zuzugreifen, es sei denn, Sie möchten die Protokolle tatsächlich haben.

    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

Ich habe auch ax.set_xlim(1, 6) und ax.set_ylim(.1, 1e6) verwendet, um es hübsch zu machen.

Ich habe die objektorientierte Schnittstelle zu Matplotlib verwendet. Da die Verwendung der Namen der erstellten Objekte eine größere Flexibilität und eindeutige Klarheit bietet, wird die Schnittstelle OO gegenüber der auf dem interaktiven Status basierenden Schnittstelle bevorzugt.

11
Bennett Brown

Sie könnten auch Zip verwenden

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