2012-07-02 12 views

Odpowiedz

8

Można oszukać, przez potrącenie swoich danych i korzystania plot zamiast:

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

działki:

enter image description here

+19

Wymyśliłem drugą drogę. Po prostu ustaw 'ls =" steps "' for 'plot()'. Dzięki za odpowiedź! – madtowneast

+0

@madtowneast, zasługujesz na więcej upvotes dla tego komentarza. To jest taka ukryta funkcja. http://matplotlib.org/api/artist_api.html#matplotlib.lines.Line2D.set_linestyle – kratsg

0

z załączonych źródła w http://matplotlib.sourceforge.net/examples/pylab_examples/histogram_demo_extended.html

oto jak czerpali że wykres:

[ciach]

i nieco chcesz wydaje się być

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

Edit:, jeśli chcesz wiedzieć, jak hist() działa, spójrz na źródło - to określono w matplotlib/axes.py zaczynając od linii 7407.

Patrząc na linii 7724,

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

dla N słupków, pojemników jest numpy.ndarray wartości N + 1, są krawędzie dla każdego paska. Są bliźni wartości dla każdego paska (to jest to, co robi z Fraxel np.ravel poniżej) i przesunąć punkty danych pół bar lewo do centrum im

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

ustawić wysokość każdego słupka, twinned ale przesunięte o jeden (w stosunku do wartości x), aby wywołać efekt krok

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

i self.fill nieco to, co faktycznie rysuje linie.

+0

O ile mi zrozumieć przykład isnt dane już binned. Mam już binned dane, więc 'hist()' nie pomaga – madtowneast

+0

-1, nie stosuje się do pytania –

+0

@ Jonas Wielicki: podany kod skutkuje obrazem o które pytał. Jak to nie dotyczy? –

2

Najprostszym rozwiązaniem jest przekształcenie binned zbiór danych do un-binned , ważony zbiór danych (z liczbą elementów == liczba pojemników). Zbiór niepobudzony składa się z wartości danych równych centrom bin i wag równych wartościom w każdym z pojemników. Na przykład załóżmy, że binned danych,

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

Odpowiedni zestaw danych ważony byłoby

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

Należy pamiętać, że wybór do korzystania z centrum bin jest dowolna, można użyć dowolnego miejsca w kosz. Po wygenerowaniu niepakowanego zestawu danych można użyć normalnego wykresu histogramu matplotlib (tj. Axes.hist).

Przykładem implementacja w Pythonie następująco:

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) 

Możesz teraz mieć pełny dostęp do wszystkich osiach.Opcje drukowania wykresów, w tym histtype="step", aby utworzyć histogram schodkowy, który chciałeś.

Przykładem korzystania z tej funkcji byłoby

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

nadzieję, że pomoże!

0

Z jakiegoś powodu ostatni pojemnik nie jest prawidłowo zamknięty, gdy go wypróbuję. Nie jest to widoczne z poprzednich odpowiedzi, jeśli pokazana jest ostatnia linia, więc zdecydowałem się wykonać własną funkcję, która robi to, co chcę.

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 

20 i 300, które są dodawane są moją binsize a kończąc odpowiednio wartość i muszą zostać skorygowane, jeśli ktoś chce to wykorzystać. x_input i y_input są wartościami zwracanymi z np.histogram. Moja wynikające działki (w niebieskim konturem, wykreślona z powyższej funkcji w czerwonym, barplot z tych samych danych.):

My result in contourplotting a histogram

Powiązane problemy