una tuplas tupla son recorrer qué llenar listas lista las entre elementos diferencia conjuntos como acceder python numpy matplotlib scipy gnuplot

tuplas - llenar una lista en python



Python: parcela lista de tuplas (4)

Tengo el siguiente conjunto de datos. Me gustaría usar python o gnuplot para trazar los datos. Las tuplas son de la forma (x, y). El eje Y debe ser un eje logarítmico. Log de IE (y). Un diagrama de dispersión o de línea sería ideal.

¿Cómo se puede hacer esto?

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


Como han respondido otros, scatter() o plot() generarán la trama que desee. Sugiero dos refinamientos a las respuestas que ya están aquí:

  1. Use numpy para crear la lista de coordenadas xy la lista de coordenadas y. Trabajar con grandes conjuntos de datos es mucho más rápido que usar la iteración en Python sugerida en otras respuestas.

  2. Utilice pyplot para aplicar la escala logarítmica en lugar de operar directamente sobre los datos, a menos que realmente desee tener los registros.

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

También he usado ax.set_xlim(1, 6) y ax.set_ylim(.1, 1e6) para hacerlo bonito.

He usado la interfaz orientada a objetos para matplotlib. Debido a que ofrece una mayor flexibilidad y claridad explícita al usar los nombres de los objetos creados, se prefiere la interfaz OO a la interfaz basada en estado interactiva.


En matplotlib sería:

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

lo que produciría:


Si recibo tu pregunta correctamente, podrías hacer algo como esto.

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

lo que te daría algo como

O como una trama de línea,

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

EDITAR - Si desea agregar un título y etiquetas para el eje, podría hacer algo como

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

que te daría


También puedes usar 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)