2012-07-02 32 views

Respuesta

8

Se puede engañar, mediante la compensación de sus datos y el uso de plot lugar:

from matplotlib import pyplot 
import numpy as np 

#sample data: 
x = np.arange(30) 
y = np.cumsum(np.arange(30)) 
#offset the x for horizontal, repeat the y for vertical: 
x = np.ravel(zip(x,x+1)) 
y = np.ravel(zip(y,y)) 

pyplot.plot(x,y) 
pyplot.savefig('plt.png') 

el terreno:

enter image description here

+19

Descubrí una segunda forma. Simplemente configure 'ls =" steps "' para 'plot()'. ¡Gracias por la respuesta! – madtowneast

+0

@madtowneast, usted merece más votos favorables para ese comentario. Esa es una característica oculta. http://matplotlib.org/api/artist_api.html#matplotlib.lines.Line2D.set_linestyle – kratsg

0

Desde la fuente adjunto al http://matplotlib.sourceforge.net/examples/pylab_examples/histogram_demo_extended.html

aquí es la forma en que sacaron ese gráfico:

[snip]

y el bit que desea parece ser

pylab.hist(x, bins=bins, histtype='step') 
          ^
         right here 

Editar: si quieres saber cómo hist() funciona, un vistazo a la fuente - se define en matplotlib/axes.py a partir de la línea 7407.

En cuanto a la línea 7724,

x = np.zeros(2*len(bins), np.float) 
y = np.zeros(2*len(bins), np.float) 

de N bars, bins es una numpy.ndarray de valores N + 1, siendo los bordes de cada barra. Ellos twin los valores para cada barra (esto es lo que está haciendo con Fraxel np.ravel abajo) y el desplazamiento de los puntos de datos media barra izquierda a ellos se centran

x[0::2], x[1::2] = bins, bins 
x -= 0.5*(bins[1]-bins[0]) 

ajustar la altura de cada barra, hermanada pero compensado por una (en relación con los valores de x) para producir el efecto paso

# n is an array of arrays containing the number of items per bar 
patches = [] # from line 7676 
for m, c in zip(n, color): 
    y[1:-1:2], y[2::2] = m, m 
    patches.append(self.fill(x, y, closed=False, edgecolor=c, fill=False)) 

y el bit self.fill es lo que realmente dibuja las líneas.

+0

Por lo que entiendo el ejemplo la tampoco datos ya binned. Ya he agrupado los datos, por lo que 'hist()' no ayuda – madtowneast

+0

-1, no se aplica a la pregunta –

+0

@Jonas Wielicki: el código dado resultados en la imagen que preguntó. ¿Cómo es esto no aplicable? –

2

La solución más sencilla es la de convertir el conjunto de datos agrupada a un no-agrupada , conjunto de datos ponderado (con número de elementos == número de contenedores). El conjunto de datos no compuesto consistiría en valores de datos iguales a los centros de contenedores y pesos iguales a los valores en cada contenedor. Por ejemplo, digamos que sus datos agrupada es,

binedges = [0.0, 1.0, 2.0, 3.0] 
ybinned = [11., 22., 33.] 

El conjunto de datos ponderada correspondiente sería,

y =  [0.5, 1.5, 2.5] 
weights = [11., 22., 33.] 

Tenga en cuenta que la opción de utilizar el centro bin es arbitraria, se puede utilizar cualquier punto dentro de una compartimiento. Una vez que haya generado el conjunto de datos sin bin entonces puede usar el trazado del histograma de matplotlib normal (es decir, Axes.hist).

Un ejemplo de implementación en Python de la siguiente manera:

def plot_binned_data(axes, binedges, data, 
       *args, **kwargs): 
    #The dataset values are the bin centres 
    x = (binedges[1:] + binedges[:-1])/2.0 
    #The weights are the y-values of the input binned data 
    weights = data 
    return axes.hist(x, bins=binedges, weights=weights, 
       *args, **kwargs) 

Ahora puede tener acceso completo a todos los ejes.Opciones de trazado del histograma, incluido histtype="step" para crear el histograma escalonado que usted quería.

Un ejemplo de utilizar esta función sería,

import numpy 
import matplotlib.pyplot as plt 

#Create a dataset 
dataset = numpy.random.normal(size=100) 
#Bin the dataset 
binedges = numpy.linspace(-5.0, 5.0, num=10) 
y, binedges = numpy.histogram(dataset, binedges) 

#Plot the dataset 
fig = plt.figure() 
ax = fig.add_subplot(1, 1, 1) 
plot_binned_data(ax, binedges, y, histtype="step") 
plt.show() 

Espero que ayude!

0

Por alguna razón, el último contenedor no se cierra correctamente cuando lo intento. No es visible desde las respuestas anteriores si se mostró la última línea, así que decidí hacer mi propia función, que hace lo que quiero.

def make_bar_contour_plot(ax,x_input,y_input): 

    x = list(np.ravel(zip(x_input[:-1],x_input[:-1]+1)))[1:] 
    x += [x[-1]+20] + [300] 
    y = list(np.ravel(zip(y_input,y_input))) +[0] 
    ax.plot(x,y,ls='steps') 

    return ax 

El 20 y 300 que se agregan son mi binsize y el valor final, respectivamente, y necesitan ser ajustados si alguien quiere utilizar esto. x_input y y_input son los valores de devolución de np.histogram. Mi parcela resultante (en azul el contorno, trazada con función anterior en rojo, la barplot de los mismos datos.):

My result in contourplotting a histogram

Cuestiones relacionadas