Vraag Python: plot lijst van tuples


Ik heb de volgende dataset. Ik zou graag Python of gnuplot gebruiken om de gegevens te plotten. De tuples hebben de vorm (x, y). De Y-as moet een log-as zijn. D.W.Z. log (y). Een scatterplot of lijnplot zou ideaal zijn.

Hoe kan dit worden gedaan?

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

26
2017-08-27 06:46


oorsprong


antwoorden:


Als ik je vraag goed beantwoord, zou je zoiets als dit kunnen doen.

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

wat je zoiets zou geven

enter image description here

Of als lijnplot,

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

enter image description here

BEWERK - Als u een titel en labels voor de as wilt toevoegen, kunt u iets als doen

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

wat je zou geven

enter image description here


43
2017-08-27 06:58



In matplotlib zou het zijn:

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

welke zou produceren:

enter image description here


12
2017-08-27 07:04



Zoals anderen hebben geantwoord, scatter() of plot() zal de plot genereren die u wilt. Ik stel twee verfijningen voor aan antwoorden die al hier zijn:

  1. Gebruik numpy om de x-coördinaatlijst en y-coördinatenlijst te maken. Werken met grote gegevenssets gaat sneller in numpy dan het gebruik van de iteratie in Python die in andere antwoorden wordt gesuggereerd.

  2. Gebruik pyplot om de logaritmische schaal toe te passen in plaats van direct op de gegevens in te werken, tenzij u de logboeken daadwerkelijk wilt hebben.

    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

Ik heb ook gebruikt ax.set_xlim(1, 6) en ax.set_ylim(.1, 1e6) om het mooi te maken.

Ik heb de objectgeoriënteerde interface gebruikt voor matplotlib. Omdat het een grotere flexibiliteit en expliciete duidelijkheid biedt door namen van de gemaakte objecten te gebruiken, heeft de OO-interface de voorkeur boven de interactieve, op status gebaseerde interface.


8
2018-02-20 23:46



Je zou ook zip kunnen gebruiken

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)

1
2018-01-05 09:30