2016-02-20 3 views
11

Ich habe eine CSV-Datendatei erstellt von einer anderen 3rd-Party-Anwendung, die mit gnuplot geplottet werden sollte. Lassen Sie uns die Datei übernehmen, hat folgendes Format:Gnuplot: Kürzeste Möglichkeit, die erste Zeile in der Datendatei zu ignorieren

1;2;3;4;5;6 <-- This is the header line that should be ignored (with values 1;2;...;N) 
1;1;2;1;1;1 
2;3;3;3;5;6 
3;4;1;1;1;4 

Die erste Spalte ist die x-Achse sollten die folgenden Spalten jeweils als eigene lineplot aufgetragen werden (ja, ich weiß, zu viele Liniendiagramme innerhalb einer Parzelle kann schlecht aussehen, aber nur um eine Idee zu bekommen). Hier ein MCVE:

Das Problem ist, dass dies auch die erste Zeile wie Daten darstellt.

Ich weiß, dass auf jede Zeile in der Daten-Datei ignorieren kann es mit # durch Starten, wie #1;2;3;4;5;6, aber ich will nicht, um die Datei zu bearbeiten, weil es auch von anderen Werkzeugen verwendet wird.

Eine andere Möglichkeit ist, plot <filename> every ::1 zu verwenden, um die erste Zeile zu ignorieren, was bedeuten würde, dass ich every ::1 5 Mal in das obige Skript einschließen müsste, wie in this link erklärt. Dies würde aussehen wie die folgende:

set terminal png size 1000,500  
set datafile separator ";" # CSV file is seperated with ; 
plot \ 
    'C://tmp/test.csv' every ::1 using 1:2 with lines title "A",\ 
    'C://tmp/test.csv' every ::1 using 1:3 with lines title "B",\ 
    'C://tmp/test.csv' every ::1 using 1:4 with lines title "C",\ 
    'C://tmp/test.csv' every ::1 using 1:5 with lines title "D",\ 
    'C://tmp/test.csv' every ::1 using 1:6 with lines title "E" 

ist die Definition every ::1 für jede Handlung wirklich der einzige Weg? Gibt es eine kürzere - bevorzugte Einstrich - Möglichkeit, die erste (n) Linie (n) zu ignorieren; eine Möglichkeit, die every ::1 "global" oder etwas wie (Pseudocode) set datafile ignorefirstnlines 1 zu definieren?

+0

Ist 'Every :: 1' wirklich so schlecht? Es scheint mir elegant. Woher kommen die Titelfolgen "B", "C" usw.? Sind sie Spaltenüberschriften? – e0k

+1

Nicht "so schlecht", aber ich würde es eleganter finden, wenn das in einer Aussage anstatt in jeder Handlung getan werden könnte. Wenn ich mir ein Balkendiagramm mit 5 verschiedenen Balken und zusätzlichen Fehlerbalken vorstelle, würde das zu 10 Plot-Anweisungen führen, also 10 'alle :: 1 '. Und ja, "A", "B" usw. sind nur Beispiel-Spaltenüberschriften, die im Schlüssel/in der Legende angezeigt werden sollen. –

+1

Kennen Sie die Plot-Iteration? Geben Sie 'help plot iteration' von einer 'gnuplot' Eingabeaufforderung ein. – e0k

Antwort

17

Gnuplot kann Spaltennamen aus der ersten Zeile lesen, aber Sie können die Spaltennamen auch weiterhin normal angeben. Daher überspringt das effektiv die erste Zeile.

Geben Sie den Befehl

set key autotitle columnhead 

Diese gnuplot erzählt, dass die erste Zeile keine Daten, sondern ist die Spaltennamen für den Schlüssel verwendet werden. Sie können immer noch unset key oder plot datafile title sometitle das selbe wie vorher, und Gnuplot wird nur nicht diese Daten verwenden.

Nehmen wir an, meine Datei kann wie

sieht
1 2 
4 5 
7 8 

ich von unset key nur set key autotitle columnhead follwed ausgeben (wenn ich wirklich keinen Schlüssel wollen), und es wird die erste Zeile überspringen.

enter image description here


Alternativ I Rohr durch ein externes Programm meine Daten können. Zum Beispiel awk mit (was für die meisten Betriebssysteme, einschließlich Windows verfügbar ist), kann ich

plot "< awk '(NR>2){print;}' datafile" 

die ersten 2 Zeilen überspringen (mit Windows muss ich tun '< awk "(NR>2){print;}" datafile'). Wenn ich will das nicht halten eingeben, so kann ich speichern diese in einem String

skipfile = "\"< awk '(NR>2){print;}' datafile\"" 

und als Makro verwenden (für Windows, verwenden skipfile = '"< awk \"(NR>2){print;}\" datafile"').Um zum Beispiel die Daten-Datei mit Linien zu zeichnen, könnte ich

plot @skipfile with lines 

Die @skipfile tun Tells nur gnuplot den Befehl zu behandeln, wie ich gerade hatte genau dort den Inhalt skipfile eingegeben haben.

+2

Stellen Sie sicher, dass Makros mit 'set macros' aktiviert sind, bevor Sie' @ 'verwenden. – e0k

+0

Wenn die Makros nicht funktionieren, versuchen Sie den von @ e0k vorgeschlagenen Befehl und versuchen Sie es erneut. Ich habe jedoch noch keine Installation von Gnuplot gefunden, die ich diesen Befehl ausgeben musste. – Matthew

+1

Vielen Dank! Das scheint genau das zu sein, was ich wollte, und ich wanderte auch, wenn so etwas wie "@" möglich war. Zwei Antworten in einem :) –