Seite 1 von 1

Gnuplotausgabe in root?

Verfasst: Dienstag 17. April 2007, 08:37
von Zizibee
Tag zusammen,

ich habe die Frage zwar schon in einem anderen Thread gestellt, aber dort wurde eine anderes "Problem" so umfangreich, dass es gar nicht mehr dran kam und ich hierfür jetzt lieber etwas neues aufmache.

Bisher habe ich eine Reihe von Messungen (Strom und Spannung) die ich mit Gnuplot ausgebe

Code: Alles auswählen

			self.g = Gnuplot.Gnuplot()
			self.g.title('I(V)-Kennlinie')
			self.g.xlabel('Voltage (V)')
			self.g.ylabel('Current (A)')
			self.g('set style data linespoints')
			self.data = list()
Wenn eine neue Messung dazu kommt, füge ich sie in die Liste von "data" hinzu und gebe es aus

Code: Alles auswählen

						self.data.append([float(self.volt2),float(self.current2)])
						self.g.plot(self.data)
Das klappt so weit ganz gut, allerdings geht für die Kurve immer ein neues Fenster auf. Gibt es eine Möglichkeit, die Kurve in meinem Hauptfenster anzuzeigen? Gibt es für graphische Ausgaben vielleicht ein eigenes Feld? (In einem ScrolledText-Feld wird man so etwas wohl nicht anzeigen lassen können...)

Schonmal vielen Dank!

Verfasst: Donnerstag 19. April 2007, 08:22
von Zizibee
Gibt es mit rein mit Tkinter keine Möglichkeit Funktionen zu zeichnen?
Schade eigentlich... :(

Verfasst: Donnerstag 19. April 2007, 10:08
von Rebecca
Zizibee hat geschrieben:Gibt es mit rein mit Tkinter keine Möglichkeit Funktionen zu zeichnen?
Doch, gibt es: :D

Code: Alles auswählen

import Tkinter as tk

def plot(canvas, xvalues, yvalues):
    """plot graph and axes"""
    
    #some transformation values, so that graph fits into canvas:
    height = canvas.winfo_reqheight()
    width = canvas.winfo_reqwidth()

    scale_x = float(width) / (max(xvalues) - min(xvalues)) 
    scale_y = float(height) /(max(yvalues) - min(yvalues))

    move_x = - min(xvalues) * scale_x
    move_y = min(yvalues) * scale_y

    #plot axes:
    canvas.create_line(0, height + move_y, width, height + move_y)
    canvas.create_line(move_x, 0, move_x, height)

    #plot graph:
    for i in range(len(xvalues) - 1):
        punkt1 = (scale_x * xvalues[i] + move_x,
                  height - scale_y * yvalues[i] + move_y)
        punkt2 = (scale_x * xvalues[i+1] + move_x,
                  height - scale_y * yvalues[i+1] + move_y)

        canvas.create_line(punkt1[0], punkt1[1], punkt2[0], punkt2[1])



master = tk.Tk()

canvas = tk.Canvas(master, width=600, height=400)
canvas.pack()
plot(canvas, range(-10, 5), [(x**3) for x in range(-10, 5)])

tk.mainloop()

Verfasst: Donnerstag 19. April 2007, 10:31
von Zizibee
Danke erstmal! Was man nicht so alles machen kann.
Allerdings bin ich mir gerade gar nicht mehr so sicher ob sich der ganze Aufwand des umschreibens auch wirklich lohnt. Ich bräuchte halt auch Achsenbeschriftungen, Messgrößen sollen auslesbar sein, die Kurve muss aus Messgrößen erstellt werden, es sollten auch mehrere Kurven in verschiedenen Farben gleichzeitig angezeigt werden usw.
Da hab ich gerade so meine Zweifel, ob das damit so gut machbar wäre. Aber es wäre in meinem Fenster, so wie ich das ja wollte. :)

Verfasst: Donnerstag 19. April 2007, 14:39
von schlangenbeschwörer
Hi,
wenn ich dich richtig verstanden habe, ist das eine recht gute Übung um zu sehen, was Tkinter.Canvas alles kann. Du kannst das eigentlich alles machen. Fang einfach an, mit dem, was du kannst. Schreib es so, das es möglichst einfach ist, es nachher immer einfach erweitern zu können. Ein paar Tips für ein etwas ausführlicheres Script:

Schreibe eine Faktor-Funktion, die du auf alle Canvaswerte anwendest, und die die gegebene Zahl so umrechnet, dass man die Werte je nach Größe gut unterscheiden kann. (ZB x=x*10) So kannst du bei verschiedenen Werten einen anderen Zoomfaktor einsetzen und bleibst flexibel.

Zur Erleichterung des Ablesens kanns du ne kleine Funktion mit ner Schleife schreiben, mit der du ein Koordinatensystem zeichnen kanns. Wenn du die ids speicherst, kannst du das KS beliebig ein- und ausschalten.

Die Linien kannst du durch die Option ´smooth=1´ als parabolischen Spline zeichnen. Die Farbe mit ´fill´ zu ändern dürfte kein Problem sein.

Und: Wenn du einmal sowas gemacht hast, hast du 1. recht viel übers Canvas und seine Möglichkeiten gelernt, und 2. ein Script, was du jederzeit als Grundlage für eine Abwandlung nehmen kannst.

mfg, jj

Verfasst: Donnerstag 19. April 2007, 15:09
von Zizibee
Das ist eigentlich eine gute Idee, nur leider programmier ich zur Zeit nicht aus Spass an der Freude, sondern weil es Teil meines Praktikums ist. Deshalb steh ich etwas unter Zeitdruck und ich sollte in den nächsten Tagen schon eine funktionierende Version vorzeigen können :roll:
Darum muss jetzt erstmal alles hinten anstehen, was nicht so unbedingt notwendig ist...
Wenn ich aber wieder etwas mehr Luft habe (sei es hier im Praktikum oder privat), dann nehm ich mir das mal vor!

Verfasst: Donnerstag 19. April 2007, 18:36
von schlangenbeschwörer
Ok, wenn du meinst...
Ich weiß ja nicht, wie viel Zeit du in den nächsten Tagen hast, aber ich denke mit Tkinter eine akzeptable Grundversion zu basteln dürfte eigentlich nicht alzulange dauern, wenn man erstmal alles, was nicht direkt gebraucht wird, weglässt. Ich hab auch schonmal sowas in der Richtung gemacht, und das Grundscript ist echt leicht und auch recht kurz. Halt nur das Koordinatensystem mit Gitter, Achsen und Bezeichnung, was mit Schleifen echt kurz ist, die Funktionen zum Zeichnen und Verwalten der Kurven und das übliche Grundgerüst. Ich denke, das schaffst du schon, denn die speziellen Sachen, die das Programm dann perfektionieren, sind zweitrangig, das, was du erstmal brauchst, kannst du bestimmt schon (wenn nicht, findest du es schnell) ...So viel ist das nicht. Und die (nicht so tolle) Alternative hast du doch schon, oder?
Gruß, jj

Verfasst: Freitag 20. April 2007, 08:06
von Zizibee
Ich beschäftige mich mit Python erst seit ca. 3 Wochen und mit den Canvas hab ich noch gar nichts gemacht. Zwar hab ich schon mit anderen Sprachen programmiert, aber ich glaube dennoch, dass das eine ganze Weile dauern dürfte, bis ich das so hin bekomme!

Am Ende meinenes Praktikums sollte ich dann auch einige Strukturen gemessen und die Messungen ausgewertet haben, wobei ich die Messstrukturen mitsammt dem ganzen Aufbau auch noch machen werden musss. Dazu kommt noch, dass ich dummerweise angekündigt habe, dass das Gründgerüst des Programmes bis Ende der Woche (also bis heute) steht. :roll:
Wenn ich dann aber endlich mal so weit bin, dass ich etwas sinvolles zum Messen da habe, (bisher messe ich nur an ein paar Widerständen rum) kann ich das Programm noch weiter den Erfordernissen anpassen und sollte auch noch etwas Zeit für solche Sachen haben.

Jetzt muss ich aber erstmal hinbekommen eine beliebig große Anzahl Messreihen aufzunehmen, alle gleichzeitig mit Gnuplot auszugeben und damit man noch was erkennen kann die einzelnen Graphen zu beschriften. :wink:

Verfasst: Freitag 20. April 2007, 10:16
von Mr_Snede
Bin aufm Sprung, deswegen nur ein Link:
http://heim.ifi.uio.no/~hpl/Pmw.Blt/doc/