pgfplots surface plot aus Datenfile Thema ist als GELÖST markiert

Tabellen und Grafiken erstellen und anordnen


Dirk

pgfplots surface plot aus Datenfile

Beitrag von Dirk »

Hallo,
ich versuche gerade einen surface plot mit pgfplots zu erstellen.
Das Plotten von Funktionen funktioniert sehr gut. Allerdings verzweifle ich gerade daran extern eingelesene Daten darzustellen. Das Datenfile hat 4 Spalten, von denen ich die erste, zweite und vierte benötige. Trotz 15400 Zeilen läuft TeX durch (das Datenfile bzw. dessen Aufbau sollte also keine Probleme machen). Allerdings stellt er mir alle Messpunkte (wie bei mark=*) dar, statt zwischen den Messwerten zu interpolieren.
\documentclass{standalone}

\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{verbatim}

\pgfplotsset{compat=1.3, axis line style={ultra thin}, tick style={ultra thin,black}, major tick length={0.06cm}, minor tick length={0.06cm}, xlabel near ticks, ylabel near ticks,y axis style/.style={
        yticklabel style=#1,
        ylabel style=#1,
        y axis line style=#1,
        ytick style=#1}}

\begin{document}
\small
\begin{tikzpicture}
\begin{axis}[faceted color=none,
height=10.5cm, width=6cm,
view={0}{90},
xlabel={$b$ [S]},xlabel shift=0pt,
ylabel={$l$ [S]},ylabel shift=-5pt,
zlabel={$c_{\mathrm I}$ [k]},
colorbar sampled={surf}, 
colorbar style={
samples=40,
tickwidth=0pt,
faceted color=white, 
ylabel={$\sigma_{\mathrm I}$ [Pa]},
ylabel shift=-3pt, 
y axis line style={draw opacity=0},
colorbar sampled line=\marg{none}}, 
colorbar shift/.style={xshift=0.1cm}, 
colorbar/width=0.4cm,
colormap={color}{color(0)=(blue);color(0.5)=(white); color(1)=(red)}] 
\addplot3 table[x index=0,y index=1, z index=3,header=false,surf,shader=interp]{versuch.txt}; 
\end{axis}
\end{tikzpicture}
\end{document}
Leider kann ich kein Datenfile oder den Ergebnisplot hochladen, aber vielleicht habe ich ja schon einen groben Fehler in meinem Quellcode!?
Hat jemand einen Tip?

Viele Grüße
Dirk

Dirk
Forum-Newbie
Forum-Newbie
Beiträge: 8
Registriert: Di 15. Mai 2012, 17:26

Beitrag von Dirk »

Nachtrag: anbei das Datenfile und mein Ergbenisplot![/b]
Dateianhänge
versuch.txt
Datenfile
(1.39 MiB) 557-mal heruntergeladen
plot.pdf
Ergebnisplot
(1016.37 KiB) 643-mal heruntergeladen

feuersaenger
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 91
Registriert: Mi 5. Okt 2011, 18:24
Wohnort: Rheinbach

Beitrag von feuersaenger »

Hallo Dirk,

mir scheint, dass irgendwo die "surf" option fehlt - als resultat nimmt der einen linienplot mit markern. Im Grunde ist also die Loesung, \addplot3[surf] ..... zu schreiben.

Allerdings faengt dann das Datenfile richtig an: ich erkenne darin keinerlei Matrixstruktur -- und ein surface ist ja inherent etwas zweidimensionales. Bist Du Dir sicher, dass das eine Matrix ist bzw. war?

In jedem Fall braucht pgfplots noch entweder 'mesh/rows= <number rows>' oder 'mesh/cols=<number cols>', damit es die richtig aus Deinem file zusammensetzt. Zudem braucht es auch 'mesh/ordering=x varies|y varies'.

Mit liebem Gruss

Christian

Dirk
Forum-Newbie
Forum-Newbie
Beiträge: 8
Registriert: Di 15. Mai 2012, 17:26

Beitrag von Dirk »

Hallo Christian,

ersteinmal Dankeschön für deine Antwort!
feuersaenger hat geschrieben:Im Grunde ist also die Loesung, \addplot3[surf] ..... zu schreiben.
OK, das probiere ich!
feuersaenger hat geschrieben:... ich erkenne darin keinerlei Matrixstruktur -- und ein surface ist ja inherent etwas zweidimensionales. Bist Du Dir sicher, dass das eine Matrix ist bzw. war?
Das Datenfile wird von einem Simulationsprogramm ausgespuckt, damit kann man allerdings keine vernünftigen Graphiken erstellen... Ich habe es schon in Origin geladen und dort dargestellt, allerdings möchte ich es für meine Arbeit einheitlich und zu den anderen Graphen passend darstellen, habe daher pgfplot gewählt... Es handelt sich lediglich um eine x- und y-Spalte für die Koordinaten sowie eine z-Spalte für den dort zugeordneten Parameter.
feuersaenger hat geschrieben:In jedem Fall braucht pgfplots noch entweder 'mesh/rows= <number rows>' oder 'mesh/cols=<number cols>', damit es die richtig aus Deinem file zusammensetzt. Zudem braucht es auch 'mesh/ordering=x varies|y varies'.

Mit liebem Gruss

Christian
Auch das werde ich mit einbeziehen und melde mich dann mit dem Ergebnis zurück!

Grüße von unterwegs
Dirk

Dirk
Forum-Newbie
Forum-Newbie
Beiträge: 8
Registriert: Di 15. Mai 2012, 17:26

Beitrag von Dirk »

feuersaenger hat geschrieben:Bist Du Dir sicher, dass das eine Matrix ist bzw. war?
Ich bekomme es nicht hin. Zwar hat
\addplot3[surf]
schonmal etwas Farbe ins Spiel gebracht, allerdings hilft
mesh/ordering=x varies|y varies
,
mesh/rows= <number rows>
oder auch
mesh/cols=<number cols>
nicht.
Allerdings verstehe ich die Funktion der Befehle auch nicht wirklich...

Welches Datenformat benötigt pgfplot :?: Mein aktuelles Datenfile besteht wie oben beschrieben aus 3 Spalten, je eine für x-, y- und z-Werte.

Mit großem Fragezeichen und dankend für jede hilfreiche Antwort,
Dirk

feuersaenger
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 91
Registriert: Mi 5. Okt 2011, 18:24
Wohnort: Rheinbach

Beitrag von feuersaenger »

Hallo Dirk,

vorschlag: ich gebe Dir anhand von dummy-daten eine Erlaeuterung der Befehle - Du muesstest dann pruefen, ob Deine Daten entsprechend aussehen (denn leider ist mir die Pruefung nicht gelungen).

Also: surface plots erwarten eine daten *matrix*.

Da Tabellen aber nunmal typischerweise eindimensional angelegt werden (d.h. wie bei Dir: eine spalte fuer X, eine fuer Y und eine fuer Z) muss man die matrix serialisieren. Soweit, so einfach. Der Punkt ist nur: wie deserialisiert man sie wieder? Hier kommen die genannten optionen zum tragen.

Beispiel:
nehmen wir an, Du hast folgende Matrix von funktionswerten:

1 2 3
4 5 6

und wir gehen mal davon aus, dass x=1,2,3 und y=4,5 ist (d.h. f(x=2,y=4) = 2). Hier habe ich die x an die spaltenindizes geklebt und y an die zeilenindizes.

eine serialisierungsmethode ist *x varies*. Sieht dann so aus:

X Y Z
1 4 1
2 4 2
3 4 3
1 5 4
2 5 5
3 5 6

In Bezug auf die Matrix ist das *zeilenweise* kodierung.

Fuer diese Matrix muesste man
\addplot[surf,mesh/ordering=x varies,mesh/rows=2] table {
X Y Z
1 4 1
2 4 2
3 4 3
1 5 4
2 5 5
3 5 6
};
schreiben (oder aus nem datenfile; das ist egal).

Man kann auch *y varies* nehmen; das entspricht dann *spaltenweiser* kodierung:

X Y Z
1 4 1
1 5 4
2 4 2
2 5 5
3 4 3
3 5 6

Dafuer muesste man entsprechend
\addplot[surf,mesh/ordering=y varies,mesh/rows=2] table {
X Y Z
1 4 1
2 4 2
3 4 3
1 5 4
2 5 5
3 5 6
};
schreiben.

In Bezug auf mesh/rows gilt: man muss entweder mesh/rows oder mesh/cols oder beide angeben.

Es sei denn.... man nutzt folgende alternative, dann braucht man beides nicht:

Zusaetzlich hat pgfplots die moeglichkeit, "scanline marker" zu lesen. Sprich: immer dann, wenn eine zeile bzw. spalte zu ende ist, kann man einfach eine leere zeile in die eingabetabelle schreiben. Dann kann man sich die explizite angabe von mesh/rows sparen.

Sprich: obige Daten koennte man aequivalent durch
\addplot[surf,mesh/ordering=x varies] table {
X Y Z
1 4 1
2 4 2
3 4 3

1 5 4
2 5 5
3 5 6
};
bzw.
\addplot[surf,mesh/ordering=y varies] table {
X Y Z
1 4 1
2 4 2
3 4 3

1 5 4
2 5 5
3 5 6
};
ausdruecken.

Das ist so ziemlich das, was pgfplots an datenfiles unterstuetzt.

Details + mehr doku + beispiele gibt es im pgfplots manual.

Antworten