¿Cómo puedo extraer columnas de datos de un archivo CSV y definirlas como variables x e y, luego trazarlas en python usando pylab?

Tengo un archivo CSV con datos como

350, -0.042447984
349, -0.041671798
348, -0.04158416
347, -0.041811798
346, -0.041716855

Aunque tengo muchos más datos. Lo que intento hacer es definir la primera columna (350, 349, etc.) como mis valores x, y la segunda columna (-0.042447984, -0.041671798, etc.) como mis valores y. Este es mi código hasta ahora:

import pylab
x=[350, 349, 348, 347, 346]
y=[-0.042447984, -0.041671798, -0.04158416, -0.041811798, -0.041716855]
pylab.plot(x, y)
pylab.show()

Sin embargo, en lugar de ingresar manualmente los números, intento escribir un programa que extraiga la columna 1 de mi archivo CSV como los valores x y la columna 2 como los valores y. Probablemente sea algo mucho más simple de lo que estoy tratando de hacer. Soy nuevo en python, ¡así que tengan paciencia conmigo!

preguntado el 27 de julio de 12 a las 19:07

Tengo, ¿me estoy perdiendo algo? -

3 Respuestas

Suponiendo que su archivo csv esté en el formato que ha descrito, probablemente usaría loadtxt.

>>> d = numpy.loadtxt("plot1.csv", delimiter=",")
>>> d
array([[  3.50000000e+02,  -4.24479840e-02],
       [  3.49000000e+02,  -4.16717980e-02],
       [  3.48000000e+02,  -4.15841600e-02],
       [  3.47000000e+02,  -4.18117980e-02],
       [  3.46000000e+02,  -4.17168550e-02]])

y hay muchas maneras de conseguir x y y de esto:

>>> x,y = numpy.loadtxt("plot1.csv", delimiter=",", unpack=True)
>>> x
array([ 350.,  349.,  348.,  347.,  346.])
>>> y
array([-0.04244798, -0.0416718 , -0.04158416, -0.0418118 , -0.04171685])

or x,y = d.T or d[:,0], d[:,1], etc.

Cuanto más complicado sea el formato, mejor estará para trabajar con el csv módulo directamente. Aunque loadtxt tiene muchas opciones, a menudo necesita un control más fino del que ofrece.

Respondido 27 Jul 12, 20:07

Estoy de acuerdo, por lo general empiezo con loadtxt, subo a genfromtxt si necesito un poco más de flexibilidad, y luego csv si los dos primeros no funcionan. - CrisC

Esto te ayudará a comenzar:

import csv

with open('data.txt') as inf:
    x = []
    y = []
    for line in csv.reader(inf):
        tx, ty = line
        x.append(int(tx))
        y.append(float(ty))

liza x y y contendrán respectivamente:

[350, 349, 348, 347, 346]
[-0.042447984, -0.041671798, -0.04158416, -0.041811798, -0.041716855]

Notas:

Usar with para abrir el archivo se encargará de cerrarlo cuando terminemos o se encuentre una excepción. Él csv El módulo leerá los datos de entrada línea por línea y dividirá cada línea en una lista basada en el separador de coma. El primer elemento se convierte en int, el segundo en float antes de ser agregado a las respectivas listas.

Declarar impuestos data.txt contiene sus datos de muestra.

Respondido 27 Jul 12, 20:07

Sé que esta publicación está bastante anticuada; sin embargo, para alguien que necesite trazar datos csv rápidamente, el siguiente script proporcionará una buena solución.

Muestra cómo importar los datos del archivo csv y cómo hacer un gráfico con matplotlib que hará un png y lo trazará.

Usando los datos de Lago huron sin encabezados, obtienes una buena trama.

import csv
import matplotlib.pyplot as plt
from numpy import arange

#####################################
# instatiation of variables

filehandle = "lake_huron.csv"
x_data = []                         # makes a list
y_data = []                         # makes a list
png_filename = 'LakeData.png'

#####################################
# opening csv file and reading

my_file = open(filehandle, "rb")    # opens file for reading
data = csv.reader(my_file)          # saves file to variable "data"

#####################################
# saves csv data to x_data and y_data

for row in data:
    x_data.append(eval(row[1]))     # selects data from the ith row
    y_data.append(eval(row[2]))     # selects data from the ith row

#####################################
# closes csv file
my_file.close()                     # closes file




#####################################
# makes plot (show) and saves png

fig = plt.figure()                  # calls a variable for the png info

# defines plot's information (more options can be seen on matplotlib website)
plt.title("Level of Lake Huron from 1875 to 1972")      # plot name
plt.xlabel('Year')                                      # x axis label
plt.ylabel('Lake Level (in feet)')                      # y axis label
plt.xticks(arange(1875,1973,10))                        # x axis tick marks
plt.axis([1875,1973,573,584])                           # x and y ranges

# defines png size
fig.set_size_inches(10.5,5.5)                           # png size in inches

# plots the data from the csv above
plt.plot(x_data,y_data)

#saves png with specific resolution and shows plot
fig.savefig(png_filename ,dpi=600, bbox_inches='tight')     # saves png
plt.show()                                                  # shows plot

plt.close()                                                 # closes pylab

Respondido 01 Oct 15, 04:10

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.