Wiem, jak utworzyć histogram (po prostu użyj „z pudełkami”) w gnuplot, jeśli mój plik .dat ma już odpowiednio binowane dane. Czy istnieje sposób, aby wziąć listę liczb i poprosić gnuplot o dostarczenie histogramu opartego na zakresach i rozmiarach bin dostarczanych przez użytkownika?
202
Odpowiedzi:
tak, a jego szybkie i proste, ale bardzo ukryte:
sprawdzić
help smooth freq
dlaczego powyższe tworzy histogramaby poradzić sobie z zakresami, po prostu ustaw zmienną xrange.
źródło
set boxwidth binwidth
do powyższego. To było dla mnie bardzo pomocne.Mam kilka poprawek / dodatków do bardzo przydatnej odpowiedzi Born2Smile:
set boxwidth binwidth
bin
funkcję:bin(x,width)=width*floor(x/width) + width/2.0
źródło
bin(x,width)=width*floor(x/width) + binwidth/2.0
(obliczenia zmiennoprzecinkowe)bin(x,width)=width*floor(x/width) + width/2.0
. Jeśli przekazujemywidth
jako argument, użyj go. :-)Bądź bardzo ostrożny: wszystkie odpowiedzi na tej stronie domyślnie podejmują decyzję, od czego zaczyna się binowanie - lewa krawędź najbardziej lewego pojemnika, jeśli chcesz - z rąk użytkownika. Jeśli użytkownik łączy dowolną z tych funkcji do binowania danych ze swoją własną decyzją o tym, gdzie zaczyna się binowanie (jak dzieje się to na blogu, do którego prowadzi link powyżej), wszystkie powyższe funkcje są niepoprawne. W przypadku dowolnego punktu początkowego dla binowania „Min” poprawną funkcją jest:
Możesz zrozumieć, dlaczego jest to poprawne sekwencyjnie (pomaga narysować kilka koszy i punkt gdzieś w jednym z nich). Odejmij Min od punktu danych, aby zobaczyć, jak daleko znajduje się w zakresie binningu. Następnie podziel przez szerokość pasma, aby efektywnie pracować w jednostkach „pojemników”. Następnie „podłóż” wynik, aby przejść do lewej krawędzi tego kosza, dodaj 0,5, aby przejść do środka kosza, pomnóż przez szerokość, aby nie pracować już w jednostkach pojemników, ale w skali absolutnej jeszcze raz, a następnie w końcu dodajmy przesunięcie Min odjęte na początku.
Rozważ tę funkcję w działaniu:
np. wartość 1.1 naprawdę wpada do lewego pojemnika:
Odpowiedź Born2Smile jest poprawna tylko wtedy, gdy granice bin występują przy (n + 0,5) * binwidth (gdzie n przebiega przez liczby całkowite). Odpowiedź mas90 jest poprawna tylko wtedy, gdy granice bin występują przy n * binwidth.
źródło
Czy chcesz wykreślić taki wykres? tak? Następnie możesz spojrzeć na mój artykuł na blogu: http://gnuplot-surishing.blogspot.com/2011/09/statistic-analysis-and-histogram.html
Kluczowe wiersze z kodu:
źródło
Jak zwykle, Gnuplot jest fantastycznym narzędziem do rysowania słodko wyglądających wykresów i można go wykonywać do wszelkiego rodzaju obliczeń. Jednak ma on na celu wykreślanie danych zamiast służyć jako kalkulator i często łatwiej jest używać zewnętrznego programu (np. Octave) do wykonywania bardziej „skomplikowanych” obliczeń, zapisywać te dane w pliku, a następnie używać Gnuplot do tworzenia wykres. W przypadku powyższego problemu sprawdź, czy funkcja „hist” to Octave using
[freq,bins]=hist(data)
, a następnie wykreśl to w Gnuplot za pomocąźródło
Uważam tę dyskusję za niezwykle przydatną, ale napotkałem pewne problemy z „zaokrąglaniem”.
Mówiąc dokładniej, stosując szerokość przedziału 0,05, zauważyłem, że dzięki technikom przedstawionym powyżej, punkty danych, które odczytują 0,1 i 0,15, mieszczą się w tym samym przedziale. To (oczywiście niepożądane zachowanie) jest najprawdopodobniej spowodowane funkcją „podłogi”.
Poniżej mój mały wkład w próbę obejścia tego.
Ta metoda rekurencyjna jest dla x> = 0; można to uogólnić za pomocą bardziej warunkowych stwierdzeń, aby uzyskać coś jeszcze bardziej ogólnego.
źródło
Nie musimy używać metody rekurencyjnej, może być powolna. Moje rozwiązanie wykorzystuje zdefiniowaną przez użytkownika funkcję rint instesd funkcji instrinsic int lub floor.
Ta funkcja da
rint(0.0003/0.0001)=3
, podczas gdyint(0.0003/0.0001)=floor(0.0003/0.0001)=2
.Czemu? Proszę spojrzeć na funkcję Perl int i zera dopełniające
źródło
Mam małą modyfikację rozwiązania Born2Smile.
Wiem, że to nie ma większego sensu, ale możesz chcieć na wszelki wypadek. Jeśli twoje dane są liczbami całkowitymi i potrzebujesz rozmiaru pojemnika zmiennoprzecinkowego (być może do porównania z innym zestawem danych lub gęstością wydruku w drobniejszej siatce), musisz dodać losową liczbę od 0 do 1 wewnątrz podłogi. W przeciwnym razie wystąpią skoki z powodu błędu zaokrąglania.
floor(x/width+0.5)
nie zrobi tego, ponieważ utworzy wzór niezgodny z oryginalnymi danymi.źródło
Jeśli chodzi o funkcje binowania, nie spodziewałem się rezultatów oferowanych do tej pory funkcji. Mianowicie, jeśli moja szerokość przedziału wynosi 0,001, te funkcje centrowały pojemniki na 0,0005 punktów, podczas gdy uważam, że bardziej intuicyjne jest, aby pojemniki były wyśrodkowane na granicach 0,001.
Innymi słowy, chciałbym mieć
Wymyślona funkcja binowania to
Oto skrypt, aby porównać niektóre z oferowanych funkcji bin do tej:
a oto wynik
źródło