Próbuję uzyskać histogram z już zakumulowanymi danymi. Próbowałem użyć do tego celu bar()
, ale nie mogę wymyślić, jak uczynić go histogramem schodkowym like this one from the examples, zamiast wypełnionego histogramu.Matplotlib - Histogram schodkowy z już zakodowanymi danymi
Odpowiedz
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:
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.
O ile mi zrozumieć przykład isnt dane już binned. Mam już binned dane, więc 'hist()' nie pomaga – madtowneast
-1, nie stosuje się do pytania –
@ Jonas Wielicki: podany kod skutkuje obrazem o które pytał. Jak to nie dotyczy? –
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!
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.):
- 1. Animowany histogram Matplotlib
- 2. facecolor kwarg dla Matplotlib skumulowany histogram
- 3. Wykresy typu rozkładu (histogram/kde) z ważonymi danymi
- 4. Import nagrań magicznych z już istniejącymi danymi
- 5. Skumulowany histogram z już podsumowanych zliczeń za pomocą ggplot2
- 6. Adnotacja Spring @MVC i @RequestBody z danymi zakodowanymi w formacie x-www?
- 7. Matplotlib Stephilled histogram zrywa na wartości 10^-1 na Xubuntu
- 8. Jak zrobić histogram z listy danych
- 9. Kontrolowanie szerokości pasków w matplotlib z danymi miesięcznymi
- 10. Boxplot z danymi o zmiennej długości w matplotlib
- 11. Google api narysowana polilinia z zakodowanymi punktami
- 12. Matplotlib już nie działa z powodu interaktywnego problemu
- 13. Wykres punktowy z danymi skalarnymi
- 14. Jak utworzyć histogram z hashmap w python?
- 15. Histogram pionowy
- 16. numpy histogram z 3 zmiennymi
- 17. Bieg histogram strumień z Rx
- 18. Python: Histogram z obszarem znormalizowanym do czegoś innego niż 1
- 19. histogram z pojemnikami czasowymi z datetime wektora
- 20. Przesyłanie komunikatu ViewBag MVC z niektórymi obszarami nie zakodowanymi?
- 21. geom_rect i alpha - czy to działa z wartościami zakodowanymi?
- 22. Matplotlib normowane histogramy
- 23. R - histogram wewnątrz histogramu
- 24. Histogram bez funkcji wykreślania
- 25. Histogram wykrywanych obiektów gradientowych
- 26. Histogram na kratownicy
- 27. Opóźnienie z brakującymi danymi
- 28. Wysłanie zdarzenia z danymi
- 29. httplistener z danymi pocztowymi
- 30. Sklep z danymi MixedCollection
Wymyśliłem drugą drogę. Po prostu ustaw 'ls =" steps "' for 'plot()'. Dzięki za odpowiedź! – madtowneast
@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