Blog durchsuchen
Profil
Joerg Rings lebt in Oakland, Kalifornien, und ist Senior Quantitative Analyst in einem Start-Up, das Thermostate optimiert um Energie zu sparen.
Kontakt
Letzte Einträge
- Neue Grenzen um Stadtteile ziehen mit Foursquare4 Kommentare· 12.05.12
- Deepwater Horizon-Katastrophe: Nichts gelernt?8 Kommentare· 04.05.12
- Das Gefangenendilemma im Fernsehen6 Kommentare· 02.05.12
- Sam Harris Privileg fordert Profiling an Muslimen18 Kommentare· 30.04.12
- Graphen bekommt Gesellschaft: Zweidimensionale Silizium-Struktur erzeugt0 Kommentare· 29.04.12
Kommentare
- Kerstin Gauck · 22.05.12 · 12:43 Uhr Deepwater Horizon-Katastrophe: Nichts gelernt?
- Hagen Scherb · 22.05.12 · 10:25 Uhr Weniger Mädchengeburten um Gorleben und nach Tschernobyl?
- SimbaOderNala · 15.05.12 · 22:23 Uhr Neue Grenzen um Stadtteile ziehen mit Foursquare
- Karina · 08.05.12 · 02:18 Uhr Sam Harris Privileg fordert Profiling an Muslimen
- BreitSide · 03.05.12 · 20:16 Uhr Das Gefangenendilemma im Fernsehen
Kategorien
Archiv
- Mai 2012
- April 2012
- Februar 2012
- Januar 2012
- Dezember 2011
- November 2011
- Oktober 2011
- September 2011
- August 2011
- Juli 2011
- Mai 2011
- April 2011
- März 2011
- Februar 2011
- Januar 2011
- Dezember 2010
- November 2010
- Oktober 2010
- September 2010
- August 2010
- Juli 2010
- Juni 2010
- Mai 2010
- April 2010
- März 2010
- Februar 2010
- Januar 2010
- Dezember 2009
- November 2009
- Oktober 2009
- September 2009
- August 2009
- Juli 2009
- Juni 2009
- Mai 2009
- April 2009
- März 2009
- Februar 2009
- Frühere Beiträge
« vorheriger Beitrag · nächster Beitrag »
09.04.09 · 16:15 Uhr
Wissenschaftliches Arbeiten mit Python und PyLab II: Bunte Bildchen mit matplotlib
Kategorie: Naturwissenschaften · Kommentare: 10
Nachdem es in Teil 1 erstmal etwas allgemeines Bla zu Python gab, wollen wir uns heute SciPy & Co. zuwenden. Bzw. muss ich jetzt genauer sein, denn eigentlich geht es um PyLab, das vereint die wissenschaftliche Bibliothek SciPy, dazugehörend NumPy zur Arbeit mit Arrays, matplotlib zum Grafiken erzeugen und eine Erweiterung zu IPython, um dynamisch mit einer Python-Konsole zu arbeiten. PyLab ist noch im Entstehen, aber die Teilpakete sind alle weit entwickelt und (im Vergleich zu den meisten anderen Bibliotheken) gut dokumentiert. Es kann noch ein wenig zu Namensverwirrungen um die Module kommen, aber in neueren Installationen sollte sich durch
from pylab import *
alles notwendige importieren lassen, um mit allen Funktionen zu arbeiten.
Heute wenden wir uns einem der wichtigsten Themen beim Erstellen wissenschaftlicher Texte zu: den bunten Bildchen. Wenn man mal die Bildchen erzeugt hat, hat man meist schon den Großteil der Datenauswertung geschafft, gut, man muss dann noch dazuschreiben was man sieht und die Fehler wegdiskutieren und so ;) Schauen wir uns vier einfache Beispiele an, denn mit matplotlib lassen sich unschlagbar schnell einfache Plots erzeugen. Als erstes erstellen wir ein Histogramm, dann eine Punkt- und einen Linienplot und schließlich noch einen Kontourplot.
1. Histogramm
Nehmen wir also an, wir haben einen Haufen Zahlenwerte und interessieren uns, wie diese verteilt sind. Dazu können wir ein Histogramm erzeugen, das zählt die Werte in eine gegebene Anzahl Kistchen ein ("bins"). Ok, wir bereiten erstmal eine Liste mit allen Zahlenwerten vor. Dazu kann man ein numpy-Array nehmen, muss man aber nicht, eine einfache Liste tut es. Sagen wir mal, wir haben eine Datei daten.txt in der pro Zeile ein Wert steht. Dann laden wir diese und speichern sie in eine Liste:
from pylab import *
datenList = [] # leere Liste
f = open("daten.txt")
for line in f:
line = line.rstrip()
datenList.append(float(line))
rstrip entfernt leere Zeichen am Anfang und Ende sowie Zeilenumbrüche. So, jetzt erzeugen wir ein Histogram aus der Liste mit 10 bins:
hist(datenList,10) show()
Das wars? Ja, das wars. Es öffnet sich ein Betrachterfenster mit dem Histogramm, aus dem man es auch abspeichern kann. Mit savefig(fname) statt show kann man es auch unter dem Dateinamen fname abspeichern. Das Grafikformat wird dabei aus der Dateinamen-Endung erkannt. Und so könnte ein Histogramm aussehen:
![]()
2. Punktwolke
Die häufigsten Daten sollten Funktionswerte sein, also (x,y)-Werte. Sagen wir also, wir haben eine Datei mit einem Haufen unabhängiger Ergebnisse, z.B. von einem Haufen Simulationsläufe mit jeweils leicht unterschiedlichen Bedingungen. Diese wollen wir einlesen und als Punkte darstellen. Dann könnte das z.B. so aussehen:
from pylab import *
xList = [] # leere Liste
yList = []
f = open("daten.txt")
for line in f:
line = line.rstrip()
parts = line.split()
xList.append(float(parts[0]))
yList.append(float(parts[1]))
plot(xList,yList, 'ro')
axis([0,10,0,1])
show()
Unsere Datei listet in jeder Zeile einen x und y-Wert mit Leerzeichen getrennt. split teilt einen String auf, ohne Angabe in Klammer automatisch am Leerezeichen. Man könnte z.B. auch an einem Strich trennen mit split('-'). Man erhält eine Liste mit den Stringteilen ohne die Trennzeichen. Also hier ist parts[0] der x- und parts[1] der y-Wert. Die stecken wir in zwei Listen und die wiederum in plot(...). Der dritte Parameter zu plot sorgt für rote Punkte. Eine Liste der möglichen Angaben hier findet sich in der Dokumentation zu plot. Schließlich sorgt axis dafür, von wo nach wo die x- und y-Achse gehen sollen, damit auch alle Punkte gut zu sehen sind. So könnte der Plot aussehen:
![]()
3. Linienplot
Ohne Formatangabe als dritter Parameter würde automatisch eine Linie gezeichnet. Wir wollen jetzt aus zwei Datensätzen einen Plot mit zwei Linien zeichnen. Auch das ist ganz einfach.
from pylab import *
def readXYDataFromFile(filename):
xList = []
yList = []
f = open(filename)
for line in f:
line = line.rstrip()
parts = line.split()
xList.append(float(parts[0]))
yList.append(float(parts[1]))
return (xList,yList)
(xListA, yListA) = readXYDataFromFile("linie1.txt")
(xListB, yListB) = readXYDataFromFile("linie2.txt")
plot(xListA, yListA, label="blau")
plot(xListB, yListB, 'm-.', linewidth=3., label="magenta")
legend()
show()
Das Einlesen habe ich jetzt in eine Funktion ausgelagert, um es nicht doppelt schreiben zu müssen.
Man sieht, wenn man einfach zweimal hintereinander plot aufruft, werden mit dem show() beide Plots in ein Bild gezeichnet. Mit label lässt sich ein Name festlegen, der später für legend verwendet wird. Der zweite plot soll sich unterscheiden, deswegen habe ich ihm nochmal ein Format mitgegeben, *'m-.' für magenta Strichpunkt-Linie, und auch noch die Liniendicke hochgesetzt. So sieht es dann aus:
![]()
4. Kontourplot
Und schließlich will ich noch - ganz kurz - den Kontourplot zeigen. Die Voraussetzung dazu ist, das man durch x- und y-Koordinaten die Punkte eines Gitters angibt und dann auf jedem Gitterpunkt einen Wert hat. Diese Werte stellt man farblich codiert da, und der Kontourplot ist eine interpolierte Darstellung die für die ganze Fläche durch Farbbereiche den Werteverlauf kennzeichnet.
from pylab import * N = 20 x = linspace(.0, 1.0, N) y = linspace(.0, 1.0, N) X, Y = meshgrid(x, y) Z = sin(X+0.2) - 2*cos(Y*1.2) contourf(X, Y, Z) colorbar() show()
Auch hier wieder nur ein ganz einfaches Beispiel um das Prinzip zu zeigen, in der Dokumentation finden sich wieder umfangreichere Beispiele. Zunächst brauchen wir jetzt numpy-Funktionen. linspace erzeugt eine Liste von 20 Werten im Bereich zwischen 0 und 1. So haben wir die x- und y-Aufteilung unseres Gitters. Gut, dass es auch meshgrid gibt, das dann dafür die 400 Gitterpunkt koordiniert...
Als Werte hab ich einfach eine Funktion zusammengestöpselt. Python mit PyLab ist clever genug, um automatisch das richtige herauszuwerfen, wenn man die Listen X und Y in die Funktion steckt, nämlich ein 20x20-Feld. Und wieder ist das Plotten simpel! contourf erzeugt den gefüllten Kontourplot, will man nur Höhenlinien, verwendet man contour. Man übergibt die Gitterkoordinaten in X, Y und das Wertefeld in Z. Schließlich ruft man noch colorbar auf, um den Farbbalken mit dem Wertebereich anzeigen zu lassen. Fertig!
![]()
Viele weitere, schönere Beispiele finden sich übrigens z.B. hier. Die Möglichkeiten sind unerschöpflich, und wer noch mehr braucht als diese Arten (z.B. komplizierteres 3D), kann sich z.B. auch mal MayaVi> anschauen.
Autor: Jörg· 10 Kommentare· Permalink· Trackback-URL
Kommentar schreiben
Top5
- Liebe Piraten, lasst uns endlich vernünftig miteinander reden!Astrodicticum Simplex· 14.05.2012
- Risikowahrnehmung: Wenn man vor den falschen Dingen Angst hatAstrodicticum Simplex· 20.05.2012
- Dr. h.c. im Sonderangebot für 39 Euro[sic]· 14.05.2012
- Die Erde dreht sich nicht um die Sonne...Astrodicticum Simplex· 12.05.2012
- Ein Krawumm geht um die Welt (4): Eishockey und NobelpreiseAstrodicticum Simplex· 14.05.2012
Top5
- Liebe Piraten, lasst uns endlich vernünftig miteinander reden!Astrodicticum Simplex· 14.05.2012
- Klimaschmock des Monats Mai 2012Primaklima· 20.05.2012
- Gibt es ein "generisches Maskulinum"?Hier wohnen Drachen· 11.05.2012
- Sollten wir auf Fleisch verzichten?evolvimus· 11.05.2012
- Die kalte Sonne von Vahrenholt/Lüning: Le Trend, c'est moi!Primaklima· 16.05.2012
ScienceBlogs.com
- Doubt and other products: The National Toxicology Program's Report on Carcinogens, bad for whose business?by Elizabeth Grossman As it pursues its anti-regulatory agenda the ...The Pump Handle· 22.05.2012 · 16:39 Uhr
- Weekend Recap: My Annular Eclipse Expedition!A little more persistence a little more effort and what ...Starts With A Bang· 22.05.2012 · 00:11 Uhr
- Water, waterThis image has been going around the intertubes recently I ...A Few Things Ill Considered· 21.05.2012 · 22:59 Uhr
- To be or not to be? The Prevention and Public Health Fundby Kim Krisberg We will pay for this by taking ...The Pump Handle· 21.05.2012 · 15:19 Uhr
- An important revelation regarding Heartland Gate (global warming denialism)Peter Gleick has been cleared of faking a key memo ...Greg Laden's Blog· 21.05.2012 · 12:52 Uhr




Kommentare (10)
Ich habe "ion()" und "ioff()" nützlich gefunden; es macht das Plotten schneller. Zum Beispiel:
ioff()
pylab.plot(X,Y1)
.....
pylab.plot(X,YN)
ion()
show()
Es arbeitet am besten für groß 'N'.
"pylab.load()" ist auch nützlich. Es arbeitet die selben wie:
f = open("daten.txt")
for line in f:
line = line.rstrip()
datenList.append(float(line))
aber für (N x M) Daten auch. (Es macht ein numpy.array).
Entschuldigungen für mein schrecklich Deutsch. :-)
Python-Einsteigerbuch gekauf, Python, NumPy & SciPy installiert -- es kann losgehen. Danke für die Einsichten.
hallo,
ich hab eine Text-Datei mit mehreren verschiedenen werten. zB: temp,time, etot usw.
ich hab Probleme die Datei in so huebschen Bildern wie oben darzustellen.
gebt mir mal Tipps
mfg
Hallo jo,
wie ist denn das genaue Format der Textdatei; und welche Art Grafik soll es werden?
Was spricht gegen die Verwendung von gnuplot? Der Leistungsumfang (siehe under demos) und die Ausgabe nach TeX, EPS oder PDF sind doch genial.
Für riesige Datenmengen eignet sich DynaWorks von Intespace.
hallo joerg,
danke fuer deine antwort.
die grafik sollte entweder wie 1.,2. oder 3. sein (siehe oben)
datei is normale textdatei ,also txt. , die ich im terminal mit gedit oeffnen kann.
mfg jonas
ich moechte die text datei einlesen.in der textdatei sind zahlreiche messwerte.ich moechte nun das das programm die einzelnen variablen und die dazu gehoerigen messwerte ausgibt, welche der nutzer zuvor bestimmt hat.er soll 2 variablen auswaehlen zu beispiel temperatur und druck.
dann sollen die messwerte umgewandelt werden in eine grafik. diagramm histogram oder aehnliches.
koennt ihr mir ma helfen?
mfg hier etwas von der textdatei:
NMR restraints: Bond = 0.000 Angle = 0.000 Torsion = 0.000
===============================================================================
NSTEP = 1000 TIME(PS) = 1.000 TEMP(K) = 47.08 PRESS = 0.0
Etot = -20159.1618 EKtot = 8.6079 EPtot = -20167.7697
BOND = 0.7916 ANGLE = 29.0493 DIHED = 1.2577
1-4 NB = 3.5567 1-4 EEL = 1.6205 VDWAALS = -48.5778
EELEC = -20155.4695 EHBOND = 0.0000 RESTRAINT = 0.0018
EAMBER (non-restraint) = -20167.7715
Ewald error estimate: 0.8708E+00
------------------------------------------------------------------------------
NMR restraints: Bond = 0.002 Angle = 0.000 Torsion = 0.000
===============================================================================
NSTEP = 2000 TIME(PS) = 2.000 TEMP(K) = 46.14 PRESS = 0. usw.
@jonas
Sorry für die späte Antwort
Ist das Format immer so? Also sind immer genau diese Variablen in diesem Format so angegeben? Dann kriegt man das leichter hin als wenn die Variablen irgendeinen Namen haben können.
Netter Einstieg in die Materie, allerdings finde ich load aus Kommentar 1 sehr viel besser fürs aarbeiten mit beliebigen ascii daten.
Bei mir war es eine 252x400 tab-delimited ascii Datei, die ich über einzelnes Zeilenlesen nur mühsam mit mehreren for Schleifen in einen array bekommen hätte.
Die Lösung
a=load('file')
imshow(a)
zeigt dann schon den gewünschten plot...
Ich habe ehrlich gesagt anfangs nicht verstanden, wie die Installation/Verwendung von pylab funktionieren soll. Verwirrt hat mich dieser erste Google-Treffer: http://www.scipy.org/PyLab Auf der Seite geht es um die Idee, scipy, numpy und matplotlib in eins zu verknüpfen.
pylab ist jedoch gleichzeitig der Name eines Moduls von matplotlib. Wenn man einzeln von http://www.scipy.org scipy und numpy sowie matplotlib von http://matplotlib.sourceforge.net/ installiert, geht es. Nur, falls sich jemand die gleiche Frage stellt.
Ansonsten vielen Dank für diese Einführung!