2012-01-05 38 views
6

Estoy tratando de hacer un point and figure chart. Puedo hacer que funcione imprimiendo en la terminal, pero quiero graficarlo con matplotlib. ¿Cuál sería la mejor manera de hacer algo como esto? Estaba pensando en dispersarme, pero cuando hago esto las columnas se extienden demasiado. Me gustaría obtener algo muy parecido al gráfico del enlace que proporcioné, donde las columnas están lo más cerca posible entre sí. ¿Hay algún parámetro que pueda sobrescribir para forzar esto? La primera vez que uso matplotlib, discúlpeme si esto es trivial. Gracias.Gráfico de puntos y figuras con matplotlib

+0

Si Jeff está escuchando aquí, ha dicho que ha imprimido con éxito la tabla de P & F en la terminal. Podrías pl. compartir el código python (o al menos la lógica)? Estoy tratando de desarrollar la tabla P & F en Python. Si se puede imprimir en la terminal, intentaré llevarlo al formato HTML. Gracias, – Vineet

+0

¿Alguna vez obtuvo un gráfico de punto y figura de trabajo trazado. –

Respuesta

11

Puede ajustar el tamaño de los símbolos utilizados en un diagrama de dispersión seleccionando sparameter. También es probable que necesite ajustar el tamaño de su figura (con figsize) o las dimensiones de sus ejes (con add_axes). Esto se debe a que los símbolos de dispersión son cuadrados, en unidades de visualización, y los ejes xey no se ajustan automáticamente, por lo que el ancho de un cambio = altura de un cuadro.

En otras palabras, el ejemplo que proporcionó es un diagrama rectangular con el alto> ancho, y el alto y el ancho se eligen para hacer el ancho de un cambio == altura de un cuadro.

Aquí está un ejemplo de aplicar estas técnicas:

import matplotlib.pyplot as plt 

BOX = 5 
START = 365 
changes = (8, -3, 4, -4, 12, -3, 7, -3, 5, -9, 3) 

# one way to force dimensions is to set the figure size: 
fig = plt.figure(figsize=(5, 10)) 

# another way is to control the axes dimensions 
# for axes to have specific dimensions: 
#     [ x0, y0, w, h] in figure units, from 0 to 1 
#ax = fig.add_axes([.15, .15, .7*.5, .7]) 
ax = fig.add_axes([.15, .15, .7, .7]) 

def sign(val): 
    return val/abs(val) 

pointChanges = [] 
for chg in changes: 
    pointChanges += [sign(chg)] * abs(chg) 

symbol = {-1:'o', 
      1:'x'} 

chgStart = START 
for ichg, chg in enumerate(changes): 
    x = [ichg+1] * abs(chg) 
    y = [chgStart + i * BOX * sign(chg) for i in range(abs(chg))] 
    chgStart += BOX * sign(chg) * (abs(chg)-2) 
    ax.scatter(x, y, 
       marker=symbol[sign(chg)], 
       s=175) #<----- control size of scatter symbol 

ax.set_xlim(0, len(changes)+1) 
fig.savefig('pointandfigure.png') 
plt.show() 

El método desarrollado para cada diagrama de dispersión es muy hacker, pero el punto clave es que necesitaba para jugar con el parámetro de dispersión s y el tamaño figura para obtener algo del efecto deseado.

El gráfico resultante es:

enter image description here

ideal sería hacer un método personalizado siguiendo el modelo del método de dispersión. Crearía un Collectioninstance personalizado que incluiría las etiquetas x, o's y de mes. También a) ajustará automáticamente el aspecto de los ejes/figura ob) creará símbolos asimétricos. Esta es obviamente una opción avanzada, destinada a alguien que desea contribuir, como desarrollador, al proyecto Matplotlib.

+0

Muchas gracias por la respuesta detallada. – Jeff

+0

+1 buena respuesta, votado en contra – joaquin

0

Sin experiencia personal, pero tal vez set_view_interval() o set_data_interval() desde here? He usado Matplotlib para un proyecto, pero no tuve que jugar con la fijación del ancho del eje x.

+0

¿Cómo harías para hacer este mismo gráfico si tienes las X y O en un marco de datos? –

Cuestiones relacionadas