2012-07-02 15 views

risposta

8

Si potrebbe barare, compensando i dati e l'utilizzo di plot invece:

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

la trama:

enter image description here

+19

Ho trovato una seconda via. Basta impostare 'ls =" steps "' per 'plot()'. Grazie per la risposta però! – madtowneast

+0

@madtowneast, ti meriti più voti per quel commento. Questa è una caratteristica nascosta. http://matplotlib.org/api/artist_api.html#matplotlib.lines.Line2D.set_linestyle – kratsg

0

Dalla sorgente di accompagnamento al http://matplotlib.sourceforge.net/examples/pylab_examples/histogram_demo_extended.html

ecco come hanno tratto che grafico:

[snip]

e il bit che si desidera sembra essere

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

Edit: se vuoi sapere come hist() funziona, guardare la fonte - è definito in matplotlib/axes.py partire dalla riga 7407.

Guardando la linea 7724,

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

per N barre, bin sono un numpy.ndarray di N + 1 valori, essendo i bordi per ogni barra. Essi doppia i valori per ogni barra (questo è ciò Fraxel sta facendo con np.ravel sotto) e spostare la datapoints mezza barra a sinistra per centrarli

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

impostare l'altezza di ciascuna barra, gemellata ma spostati di una (rispetto ai valori x) per produrre l'effetto passo

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

e il bit self.fill è ciò che attira effettivamente le linee.

+0

Per quanto ho capito l'esempio il depliant di dati cestinate già. Ho già raccolto dati, quindi 'hist()' non aiuta – madtowneast

+0

-1, non si applica alla domanda –

+0

@Jonas Wielicki: il codice dato risulta nell'immagine che ha chiesto. Come non è applicabile? –

2

La soluzione più semplice è quella di convertire il set di dati categorizzata a un non-categorizzata set di dati ponderati (con numero di elementi == numero di contenitori). Il set di dati non vincolato consisterebbe in valori di dati uguali ai centri del contenitore e pesi equivalenti ai valori in ciascun contenitore. Per esempio diciamo che i dati categorizzata è,

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

Il corrispondente set di dati ponderato sarebbe,

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

Si noti che la scelta di utilizzare il centro bin è arbitraria, è possibile utilizzare qualsiasi punto all'interno di un bidone. Una volta generato il set di dati non abbinati, è possibile utilizzare il normale tracciato dell'istogramma matplotlib (ad esempio Axes.hist).

Un esempio di implementazione in Python segue:

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) 

ora è possibile avere pieno accesso a tutti gli assi.Opzioni di tracciamento dell'istogramma, incluso histtype="step" per creare l'istogramma a gradini che si desiderava.

Un esempio di utilizzare questa funzione sarebbe,

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

Speranza che aiuta!

0

Per qualche motivo, l'ultimo cestino non viene chiuso correttamente quando lo provo. Non è visibile dalle risposte precedenti se viene mostrata l'ultima riga, quindi ho deciso di creare una mia funzione, che fa ciò che voglio.

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 

Il 20 e 300 che vengono aggiunti sono la mia binsize e termina il valore, rispettivamente, e hanno bisogno di essere regolata, se qualcuno vuole utilizzare questo. x_input e y_input sono i valori restituiti da np.histogram. Il mio grafico risultante (in blu il contorno, tracciata con la funzione di cui sopra in rosso, Il barplot dei dati stessi.):

My result in contourplotting a histogram

Problemi correlati