matplotlib - contour plot

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Ich hab folgendes Datenfile (ziemlich gekürzt, reicht aber :)):

Code: Alles auswählen

1800 1260 0.5897
1800 1265 0.7443
1800 1270 0.8458

1805 1260 0.5423
1805 1265 0.7017
1805 1270 0.8266

1810 1260 0.4988
1810 1265 0.6579
1810 1270 0.7974
Jetzt möchte ich davon einen Contour plot anfertigen (also ein Höhenschichtliniending). Ich habs bisher mit gnuplot so gemacht:

Code: Alles auswählen

set contour
unset surface
set view 0,0
splot "data.dat" u 1:2:3 w l
Ok. Aber wie macht man das mit matplotlib?
Aus dem Beispielscript das mitgeliefert wird werd ich nicht schlau.

Gruß, mawe
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hoi mawe,

hilft dies weiter?

Code: Alles auswählen

from __future__ import division
from pylab import *
#numpy oder welche numerix-Variante Du auch immer benutzen willst:
from scipy import array 

figure(1)
X = array([[1800,1800,1800,1805,1805,1805,1810,1810,1810],[1260,1265,1270,1260,1265,1270,1260,1265,1270],[0.5897,0.7443,0.8458,0.5423,0.7017,0.8266,0.4988,0.6579,0.7974]])
#oder so, je nachdem, wie Deine Daten zu lesen sind:
#X = array([[1800,1260,0.5897],[1800,1265,0.7443],[1800,1270,0.8458],[1805,1260,0.5423],[1805,1265,0.7017],[1805,1270,0.8266],[1810,1260,0.4988],[1810,1265,0.6579],[1810,1270,0.7974]])
contour(X)

#---------------------------------------
#aus dem wiki:
def func3(x,y):
    return (1- x/2 + x**5 + y**3)*exp(-x**2-y**2)

dx, dy = 0.025, 0.025
x = arange(-3.0, 3.0, dx)
y = arange(-3.0, 3.0, dy)
X,Y = meshgrid(x, y)

Z = func3(X, Y)

figure(2)
cset = contour(Z)

#optional; einfach mal ausprobieren

#clabel(cset,inline=1,fmt='%1.1f',fontsize=10)
#hot()
#colorbar()

axis('off')
show()
Das Problem ist in gewisser Weise, daß Du nur so wenige Daten lieferst ;-). Damit kann auch gnuplot keinen schönen plot machen. Neben den Beispielen hilft vielleicht auch einfach:

Code: Alles auswählen

from pylab import contour
print contour.__doc__
Gruß,
Christian
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi Christian!

Ja ich gebs zu, die Daten sind nicht sehr aussagekräftig :)
Aber eigentlich ganz einfach:
In der ersten Spalte stehen die x-Werte, in der 2. die Y,
und in der 3. die Z-Werte. D.h. ich brauch keine Funktion mehr, die mir die z's ausrechnet, das hat mich bei den Beispielen immer ein wenig verwirrt ;)
Das File ist in Blöcke geteilt. In jedem Block ist der x-Wert fixiert, durch sämtliche y-Werte wird iteriert, und (wie gesagt) in der 3. Spalte stehen die
zugehörigen z-Werte. Im nächsten Block das selbe Spielchen mit dem nächsten x. Gnuplot mag das so, d.h.
es zeichnet eigentlich 2D Kurven versetzt hintereinander, und verbindet sie dann 3dimensional (vermute ich).

Wie auch immer, ich habs mal so gelöst:

Code: Alles auswählen

from pylab import *

# Daten laden. 26 x-Werte, 16 y-Werte
data = load("contour_test.dat")
x = data[:,0]
y = data[:,1]
z = data[:,2]

X = [x[i] for i in range(0,len(x),16)]
Y = y[:16]
Z = transpose([z[i:i+16] for i in range(0,len(z),16)])

contour(X,Y,Z)

show()
So schaut's dann aus. Naja, muss mich noch ein wenig damit spielen :)

Danke für Deine Antwort.

Gruß, mawe
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Jau, so ungefähr habe ich mir das auch gedacht. Wie Du natürlich Deine Daten verwurstest ist Dir überlassen - auch wenn das der eigentlich komplizierte Teil ist.

Im Übrigen sieht Dein Plot doch schon mal nicht schlecht aus. (Wenn es sich um eine Patterson-Dichte oder ähnliches handelt kannst Du u. U. Symmetrieoperatoren mit Latex reinbasteln - womit ich vielleicht schon zuviel in Deinen Plot interpretiere ;-) .)

Gruß,
Christian
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

CM hat geschrieben: Wenn es sich um eine Patterson-Dichte oder ähnliches handelt
Es geht um die Simulation eines Experiments, nämlich der (direkten) Umwandlung von HCN in HNC mittels 2 Laserpulsen, ohne Umweg über einen Übergangszustand (Stichwort STIRAP). Was man in dem Diagramm sehen soll, ist dass es bei Variation der beiden Frequenzen (x und y Achsen), einen Bereich gibt (Diagonale), in der der Übergangszustand (die runden Dinger in den Ecken) nicht populiert werden. Das System tunnelt also quasi vom Ausgangs- in den Endzustand :)
CM hat geschrieben: kannst Du u. U. Symmetrieoperatoren mit Latex reinbasteln
So, das hast Du nun davon, jetzt will ich wissen was Du meinst und wie man es macht :D
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Was es nicht alles gibt :o

Zu Deiner Frage:
Patterson Funktion
Plangruppensymmetrieoperationen (Abb. 1.4) (und diese Dinger kann man dank des Tex-Supportes von mpl auch plazieren)
(Ergebnis "schnellen Googelns", denn ich habe selber keine besseren Bookmarks, aber diese hier sollten erklären können, worum es geht.)

M.a.W. Dein Problem ist ein anderes (aber ein sehr interessantes). Tut mir leid, wenn ich da Verwirrung gestiftet habe, aber Dein Plot sah so verführerisch ähnlich aus, wie diese Dinger, an die ich dachte ...

Gruß,
Christian
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

CM hat geschrieben: und diese Dinger kann man dank des Tex-Supportes von mpl auch plazieren
Cool, da hab ich wieder etwas womit ich herumspielen kann :D

Symmetrieoperationen kenn ich schon, wenn auch eher im Zus.hang mit Quantenchemie.
CM hat geschrieben: Tut mir leid, wenn ich da Verwirrung gestiftet habe, aber Dein Plot sah so verführerisch ähnlich aus, wie diese Dinger, an die ich dachte ...
Du brauchst Dich nicht zu entschuldigen. Ganz im Gegenteil.
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Christian, Du kennst Dich anscheinend mit matplotlib recht gut aus, darum frag ich gleich noch etwas:
Wie kann man den Bereich einstellen, der gespeichert wird? Ich hab eine Grafik gespeichert, aber im entstandenen eps nimmt die Grafik selbst nur etwa ein Drittel der gespeicherten Seite ein. Da ich bis jetzt auch kein brauchbares Programm zum Editieren von eps Dateien gefunden habe, ist das etwas ärgerlich.
Noch etwas: Kann man einstellen, wie groß die Grafik gespeichert wird? Ich steuere das derzeit indem ich das Grafikfenster selbst vergrössere bzw. verkleinere, aber das kann ja wohl nicht der richtige Weg sein. :)

Gruß, mawe
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

ad 1) Die Sache mit dem eps verstehe ich nicht: So etwas habe ich noch nicht beobachtet. Vielleicht magst Du auf der mpl-Mailingliste fragen? Oder Du gibt mir mehr Info zu Deinem System und Deinen libraries und ich frage für Dich.
ad 2) Dazu gibt es einen schönen Eintrag im wiki. (Leider ist der Code in der letzten Zeit etwas verschrumpelt, aber die Leute arbeiten am Highlighter - ich denke, Du wirst trotzdem schlau draus.) Irgendwo habe ich auch noch ein pylab-Beispiel auf Platte, habe ich aber gerade nicht finden können. Wenn ich im Laufe des Tages noch Zeit finde, werde ich es nachschieben.

Gruß,
Christian
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Nochmal zum eps: Das heisst, wenn Du eine Grafik abspeicherst, bekommst Du ein eps auf dem raumfüllend die Grafik zu sehen ist? Ich bekomm nämlich eine A4 Seite, wo die Grafik in der oberen Hälfte ist. Wenn man das in LaTeX einbaut, ist die caption ziemlich weit vom Bild entfernt, was nicht so toll aussieht :)
Lustigerweise passt es wenn ich als png speichere. Muss eben pdflatex verwenden, ich bin ja flexibel :)

Hier ist das eps (unter der Grafik).
PS: Ich verwende matplotlib-0.86.2

Gruß, mawe
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hoi mawe,

sieht schön aus.
Das heisst, wenn Du eine Grafik abspeicherst, bekommst Du ein eps auf dem raumfüllend die Grafik zu sehen ist?
Ja, das ist bei mir der Fall. Ich würde Dir ja gerne ein Beispiel schicken oder eines hosten, aber der Webspace unserer Uni ist ein Grauss (und mit jedem Update wird es schlimmer ...). Das ist aber nicht so schlimm, denn das wirklich Dumme ist, daß ich nichts besonderes mache, um die Größe anzupassen. Das ist bei mir default - und in matplotlibrc steht auch nichts besonderes. Wenn Du an Deiner matplotlibrc nicht rumgefummelt hast, sehe ich eigentlich nicht, woran das liegen könnte.
Hier mal der Kopf eines gerade generieren eps:

Code: Alles auswählen

%!PS-Adobe-3.0 EPSF-3.0
%%Title: distplot.eps
%%Creator: matplotlib version 0.86.2, http://matplotlib.sourceforge.net/
%%CreationDate: Fri Mar  3 18:36:02 2006
%%BoundingBox: 18 180 594 612
%%EndComments
%%BeginProlog
/mpldict 7 dict def
mpldict begin
/m { moveto } bind def
/l { lineto } bind def
/r { rlineto } bind def
/box {
m
1 index 0 r
0 exch r
neg 0 r
closepath
} bind def
/clipbox {
box
clip
newpath
} bind def
/ellipse {
newpath
matrix currentmatrix 7 1 roll
translate
scale
0 0 1 5 3 roll arc
setmatrix
closepath
} bind def
%%BeginFont: BitstreamVeraSans-Roman
%!PS-TrueType-1.0-2.0
8 dict begin
/FontName /BitstreamVeraSans-Roman def
/FontMatrix [1 0 0 1 0 0] def
/FontType 42 def
/Encoding StandardEncoding def
/FontBBox [-375 -483 2636 1901] def
/PaintType 0 def
/FontInfo 7 dict dup begin
/Notice (Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved.) def
/FamilyName (Bitstream Vera Sans) def
/FullName (Bitstream Vera Sans) def
/version (Release 1.10) def
/isFixedPitch false def
/UnderlinePosition -213 def
/UnderlineThickness 143 def
end readonly def
Dein Kopf - bzw. der Deines Files - sieht wesentlich anders aus . Habe allerdings absolut keine Ahnung woran das liegen könnte: Vielleicht doch mal die Mailingliste mit dem Problem belasten?

Schönes Wochenende,
Christian

PS Habe doch kein besseres Codebeispiel mehr gefunden.
Antworten