4 Stimmen

Gnuplot sendet Zeilenumbruch und ",\" aus Python

Normalerweise tue ich das, wenn ich Gnuplot interaktiv verwende:

gnuplot> plot "state_log_6548032.data" using 4 with lines lt -1 lw 0.5 title "X axis" ,\
>"state_log_6548032.data" using 5 with lines lt 1 lw 0.5 title "Y axis" ,\
>"state_log_6548032.data" using 6 with lines lt 2 lw 0.5 title "Z axis"

Wenn ich jedoch versuche, dasselbe von Python aus mit einem Unterprozess zu tun:

gnuplot.write( "plot \"%s\" using 1 with lines lt -1 lw 0.5 title 'X axis' ,\ \n" %filename )
gnuplot.write( "plot \"%s\" using 2 with lines lt 1 lw 0.5 title 'Y axis' ,\ \n" %filename )
gnuplot.write( "plot \"%s\" using 3 with lines lt 2 lw 0.5 title 'Z axis' \n" %filename )

Ich erhalte die folgenden Fehler:

gnuplot> plot "state_log_6548032.data" using 1 with lines lt -1 lw 0.5 title 'X axis' ,\ 
                                                                                       ^
         line 0: invalid character \

gnuplot> plot "state_log_6548032.data" using 2 with lines lt 1 lw 0.5 title 'Y axis' ,\ 
                                                                                      ^
         line 0: invalid character \

Ich habe viel Zeit damit verbracht, herauszufinden, ob es ein Problem mit Python ist, aber ich habe herausgefunden, dass es ein Problem mit Gnuplot ist, das aus irgendeinem Grund das Escape-Zeichen verwendet, wenn es von der Konsole aufgerufen wird, aber in meinem Fall nicht erforderlich ist. Mein Problem bleibt jedoch bestehen. Wie kann ich die obigen Daten^^ in aufeinanderfolgenden Zeilen entweder aus dem Python-Subprozess heraus plotten, indem ich die Anweisungen per Piping weitergebe, oder indem ich eine Gnu-Datei aus Python heraus erstelle und den Gnuplot-Subprozess aufrufe, um diese Datei zu verwenden?

EDIT:

Für alle, die mit dieser einfachen Sache nicht weiterkommen: Wie die netten Leute, die diese Gemeinschaft am Leben erhalten, weiter unten erklären, entgeht Python das "\", wenn Sie "\" verwenden. Die Lösung war also einfach:

gnuplot.write( "plot \"%s\" using 1 with lines lt -1 lw 0.5 title 'X axis' ,\\\n" %filename )
        gnuplot.write( "\"%s\" using 2 with lines lt 1 lw 0.5 title 'Y axis' ,\\\n" %filename )
        gnuplot.write( "\"%s\" using 3 with lines lt 2 lw 0.5 title 'Z axis' \n" %filename )

0 Stimmen

@Keith Ich habe python-gnuplot-1.8 mit Debian, aber ich kann keine Dokumentation dazu finden, wie man es benutzt. Es scheint nicht gewartet zu werden. Ich wusste nicht, dass matplotlib, vielen Dank für den Link, das scheint mehr wie das, was ich in erster Linie nach war!

5voto

slezica Punkte 69362

In dem gnuplot-Beispiel für die Befehlszeile, das Sie gepostet haben, müssen Sie Zeilenumbrüche vermeiden um zu vermeiden, dass Sie kilometerlange Zeilen auf Ihrem Bildschirm haben, aber trotzdem die Daten an gnuplot als eine einzige Zeile senden.

Das ist in Ordnung, wenn Sie die Daten manuell eingeben, aber warum sollten Sie sich darum kümmern, wenn Sie die Daten programmatisch eingeben? Senden Sie einfach eine einzelne Zeile, Python wird sich nicht über die Lesbarkeit beschweren :). Wenn Sie neugierig sind, was das Problem war, dann liegt es daran, dass Python verwendet auch \ als Escape-Sequenz so dass die Figur niemals die gnuplot .

Abgesehen davon gibt es Python-Gnuplot-Bibliotheken, die all diese schmutzige Arbeit für Sie erledigen. Probieren Sie sie aus!

0 Stimmen

Es ist mir eigentlich egal, wie ich es mache, aber das ist der einzige Weg, den ich kenne, um Befehle in gnuplot zu senden. agf sagte mir in einer anderen Frage, die ich gepostet habe, dass ich einfach eine tmp-Datei erstellen und die Befehle dort hineinwerfen und sie nacheinander in gnuplot einspeisen könnte. Ich habe auch daran gedacht, alle Befehle in eine gnu-Datei auszugeben und gnuplot aufzurufen, um diese Datei zu laden. Aber im Moment kann ich den obigen Code noch nicht zum Laufen bringen.

1voto

agf Punkte 159286

Ich denke, wenn Sie das tun \ (Backlash-Leerzeichen) in Python wird das Leerzeichen umgangen, und ich denke, wenn Sie das \ und dann in Gnuplot die Eingabetaste drücken, wird der Zeilenumbruch umgangen.

Haben Sie es nur mit ,\n am Ende, die Python-Methode, um einen Zeilenumbruch zu vermeiden? Einfach mit , o , (Komma-Leerzeichen)? Mit nur \n ?

Wenn Sie den Zeilenumbruch auslassen müssen, ist das wahrscheinlich nicht wirklich notwendig, und , funktioniert, um Befehle zu trennen.

0 Stimmen

Hallo agf. Ich habe es versucht: , \n und ich erhalte: Zeile 0: Funktion zum Plotten erwartet. Ich habe es versucht: \n und obwohl es funktioniert, wird nur die erste Zeile gezeichnet. Schließlich habe ich es versucht: , \\\n und es hat funktioniert :) Tut mir leid, dass ich Sie damit belästigt habe. Ich werde jetzt versuchen, es mit einer Datei zu automatisieren, wie Sie in meiner anderen Frage vorgeschlagen haben.

0 Stimmen

Ich habe versucht, das Leerzeichen durch ein \ aber sie schicken mich immer wieder auf die Erde zurück.

1voto

Karl Knechtel Punkte 55450

Um einen buchstäblichen Backslash in gnuplot einzugeben, verwenden Sie \\ in der Python-Zeichenkette (so wie Sie auch \n um es mit einem buchstäblichen Zeilenumbruch zu versehen). \ beginnt im Allgemeinen Escape-Sequenzen, und in Ihrem Fall haben Sie \ ; es gibt keine besondere Bedeutung dafür, also wird es einfach als Leerzeichen interpretiert (d.h. der Backslash wird weggelassen).

Sie können den Inhalt Ihrer Zeichenketten testen, indem Sie print und sie nicht an andere Personen weitergeben gnuplot.write .

Allerdings stehen die Chancen gut, dass Sie das Ganze einfach in eine Zeile setzen können, anstatt die Backslashes und Newlines an gnuplot zu übergeben.

0 Stimmen

Ich habe python-gnuplot-1.8 bekommen, aber ich kann keine Dokumentation dazu finden, wie man es benutzt!

1voto

Sergey Punkte 11

In meinem Fall von Gnuplot 4.6 und opensuse linux war der Typ und die Reihenfolge der eingeschlossenen Apostrophe wichtig: mit gnuplot gestartet als subprocess.Popen, schreiben:

gnuplot.stdin.write("set format x '%d %h\\\n%H:%M'")

... gedrucktes Zeilenumbruchzeichen als Literal in einzeiligem Etikett, wenn:

gnuplot.stdin.write('set format x "%d %h\\\n%H:%M"')

... funktioniert wie erwartet und erzeugt zweizeilige Beschriftungen entlang der Zeitachse x.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X