2011-01-30 12 views
8

He recopilado algunos datos en un archivo de texto y quiero crear un diagrama de caja. Pero este archivo de datos contiene filas de longitud variable, por ejemplo.Boxplot con datos de longitud variable en matplotlib

1,2, 2,3, 3,0, 4,5
1,1, 2,2, 2,9

para la misma longitud que sólo podía hacer
PW = numpy.loadtxt ("./ learning.dat")
matplotlib.boxplot (PW.T);

¿Cómo manejo las líneas de datos de longitud variable?

+0

¿Cómo deben interpretarse los datos? ¿Deberían concatenarse todos los valores en una única matriz 1D? –

+0

No, me gustaría tener diagramas de caja para las columnas del archivo de datos. Entonces, ¿qué haría en el caso de igual longitud sería un m veces n array, luego boxplot la transposición, ¿verdad? – Kabbo

+0

Los documentos dicen "x es una matriz o una secuencia de vectores". Entonces, necesita leer sus datos y traducirlos a una serie de vectores, uno por caja. Parece que puedes leerlo usando el módulo csv de Python. –

Respuesta

16

Simplemente use una lista de matrices o listas. boxplot tomará cualquier tipo de secuencia (Bueno, cualquier cosa que tenga un __len__, de todos modos. No funcionará con generadores, etc.).

ej .:

import matplotlib.pyplot as plt 
x = [[1.2, 2.3, 3.0, 4.5], 
    [1.1, 2.2, 2.9]] 
plt.boxplot(x) 
plt.show() 

enter image description here

Si estás preguntando cómo leer en los datos, hay un montón de maneras de hacer lo que quiere. Como un simple ejemplo:

import matplotlib.pyplot as plt 
import numpy as np 

def arrays_from_file(filename): 
    """Builds a list of variable length arrays from a comma-delimited text file""" 
    output = [] 
    with open(filename, 'r') as infile: 
     for line in infile: 
      line = np.array(line.strip().split(','), dtype=np.float) 
      output.append(line) 
    return output 

plt.boxplot(arrays_from_file('test.txt')) 
plt.show() 
2

También se puede hacer un diagrama de caja en Plot.ly, mediante la API de Python o simplemente la interfaz gráfica de usuario. Hice this graph, que se puede hacer en el navegador o con el Python API así:

box1 = {'y': [1.2, 2.3, 3.0, 4.5], 
'type': 'box'} 
box2 = {'y': [1.1, 2.2, 2.9], 
'type': 'box'} 
response = py.plot([box1, box2]) 
url = response['url'] 
filename = response['filename'] 

La revelación completa: estoy en el equipo de argumentalmente.

enter image description here

+0

woah, beautiful! –

Cuestiones relacionadas