Ich weiß, wie man in gnuplot ein Histogramm erstellt (verwenden Sie einfach "mit Kästchen"), wenn meine .dat-Datei bereits ordnungsgemäß gruppierte Daten enthält. Gibt es eine Möglichkeit, eine Liste mit Zahlen zu erstellen und Gnuplot ein Histogramm basierend auf den vom Benutzer angegebenen Bereichen und Behältergrößen erstellen zu lassen?
202
Antworten:
Ja, und es ist schnell und einfach, aber sehr versteckt:
Überprüfen Sie,
help smooth freq
warum oben ein Histogramm erstellt wirdUm mit Bereichen umzugehen, setzen Sie einfach die Variable xrange.
quelle
set boxwidth binwidth
. Es war sehr hilfreich für mich.Ich habe ein paar Korrekturen / Ergänzungen zu Born2Smiles sehr nützlicher Antwort:
set boxwidth binwidth
bin
Funktion korrigiert werden :bin(x,width)=width*floor(x/width) + width/2.0
quelle
bin(x,width)=width*floor(x/width) + binwidth/2.0
(Gleitkommaberechnungen)bin(x,width)=width*floor(x/width) + width/2.0
. Wenn wirwidth
als Argument übergeben, dann verwenden Sie es. :-)Seien Sie sehr vorsichtig: Alle Antworten auf dieser Seite treffen implizit die Entscheidung, wo das Binning beginnt - der linke Rand des am weitesten links liegenden Fachs, wenn Sie möchten - aus den Händen des Benutzers. Wenn der Benutzer eine dieser Funktionen zum Binning von Daten mit seiner eigenen Entscheidung darüber kombiniert, wo das Binning beginnt (wie in dem Blog, auf das oben verwiesen wird), sind die oben genannten Funktionen alle falsch. Mit einem beliebigen Startpunkt für das Binning von 'Min' lautet die richtige Funktion:
Sie können sehen, warum dies nacheinander korrekt ist (es hilft, ein paar Fächer und einen Punkt irgendwo in einem von ihnen zu zeichnen). Subtrahieren Sie Min von Ihrem Datenpunkt, um zu sehen, wie weit es im Binning-Bereich liegt. Teilen Sie dann durch die Binbreite, damit Sie effektiv in Einheiten von "Bins" arbeiten. Dann 'boden' das Ergebnis, um zum linken Rand dieses Behälters zu gelangen, addieren Sie 0,5, um zur Mitte des Behälters zu gelangen, multiplizieren Sie mit der Breite, damit Sie nicht mehr in Einheiten von Behältern, sondern in einer absoluten Skala arbeiten Fügen Sie dann wieder den Min-Offset hinzu, den Sie zu Beginn subtrahiert haben.
Betrachten Sie diese Funktion in Aktion:
zB fällt der Wert 1.1 wirklich in den linken Bereich:
Die Antwort von Born2Smile ist nur dann richtig, wenn die Bin-Grenzen bei (n + 0,5) * Binwidth auftreten (wobei n über ganze Zahlen läuft). Die Antwort von mas90 ist nur dann richtig, wenn die Bin-Grenzen bei n * binwidth auftreten.
quelle
Möchten Sie ein Diagramm wie dieses zeichnen? Ja? Dann können Sie sich meinen Blog-Artikel ansehen: http://gnuplot-surprising.blogspot.com/2011/09/statistic-analysis-and-histogram.html
Schlüsselzeilen aus dem Code:
quelle
Wie üblich ist Gnuplot ein fantastisches Werkzeug zum Zeichnen süß aussehender Grafiken und kann für alle Arten von Berechnungen verwendet werden. Jedoch ist es zu Plotdaten gedacht und nicht als Rechner zu dienen , und es ist oft einfacher , ein externes Programm (zB Octave) zu verwenden , die mehr „kompliziert“ Berechnungen zu tun, speichern diese Daten in einer Datei, dann verwenden Gnuplot zu produzieren der Graph. Überprüfen Sie für das oben genannte Problem, ob die Funktion "hist" Octave verwendet
[freq,bins]=hist(data)
, und zeichnen Sie diese dann in Gnuplot mitquelle
Ich fand diese Diskussion äußerst nützlich, aber ich habe einige "Abrundungs" -Probleme festgestellt.
Genauer gesagt habe ich bei einer Binbreite von 0,05 festgestellt, dass mit den hier oben vorgestellten Techniken Datenpunkte mit 0,1 und 0,15 in denselben Bin fallen. Dies (offensichtlich unerwünschtes Verhalten) ist höchstwahrscheinlich auf die "Boden" -Funktion zurückzuführen.
Im Folgenden ist mein kleiner Beitrag, um dies zu umgehen.
Diese rekursive Methode ist für x> = 0; man könnte dies mit bedingteren Aussagen verallgemeinern, um etwas noch allgemeineres zu erhalten.
quelle
Wir müssen keine rekursive Methode verwenden, sie kann langsam sein. Meine Lösung besteht darin, eine benutzerdefinierte Funktion zu verwenden, die die Instrumentenfunktion int oder floor enthält.
Diese Funktion wird geben
rint(0.0003/0.0001)=3
, währendint(0.0003/0.0001)=floor(0.0003/0.0001)=2
.Warum? Bitte schauen Sie sich die Perl int-Funktion an und füllen Sie Nullen auf
quelle
Ich habe eine kleine Änderung an der Lösung von Born2Smile vorgenommen.
Ich weiß, dass das nicht viel Sinn macht, aber Sie können es für alle Fälle wollen. Wenn Ihre Daten eine Ganzzahl sind und Sie eine Float-Bin-Größe benötigen (möglicherweise zum Vergleich mit einem anderen Datensatz oder zur Darstellung der Dichte in einem feineren Raster), müssen Sie eine Zufallszahl zwischen 0 und 1 innerhalb des Stockwerks hinzufügen. Andernfalls treten aufgrund eines Aufrundungsfehlers Spitzen auf.
floor(x/width+0.5)
funktioniert nicht, da dadurch ein Muster erstellt wird, das den Originaldaten nicht entspricht.quelle
In Bezug auf Binning-Funktionen habe ich das Ergebnis der bisher angebotenen Funktionen nicht erwartet. Wenn meine Binbreite 0,001 beträgt, haben diese Funktionen die Bins auf 0,0005 Punkte zentriert, während es meiner Meinung nach intuitiver ist, die Bins auf 0,001 Grenzen zu zentrieren.
Mit anderen Worten, ich hätte gerne
Die Binning-Funktion, die ich mir ausgedacht habe, ist
Hier ist ein Skript, um einige der angebotenen Bin-Funktionen mit dieser zu vergleichen:
und hier ist die Ausgabe
quelle