Forum: PC-Programmierung Gnuplot: Mehrere plots (multiplot) über gleicher x-Achse?


von Johann L. (gjlayde) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hi, mit Gnuplot v4.4 möchte ich ein multiplot für 1:2 und 1:3 für 
folgende Daten machen:
1
0 -1.000673e+000
2
1 -5.563919e-001 4.442806e-001
3
2 -2.858316e-001 2.705603e-001 -1.737204e-001
4
3 -5.589447e-002 2.299372e-001 -4.062311e-002
5
4 1.363203e-001 1.922148e-001 -3.772237e-002
6
5 3.072147e-001 1.708944e-001 -2.132036e-002
7
6 4.645879e-001 1.573731e-001 -1.352128e-002
8
7 6.128868e-001 1.482989e-001 -9.074243e-003
9
8 7.549088e-001 1.420221e-001 -6.276821e-003
10
9 8.924935e-001 1.375846e-001 -4.437459e-003
11
10 1.026892e+000 1.343987e-001 -3.185958e-003
12
11 1.158978e+000 1.320857e-001 -2.313006e-003
13
12 1.289371e+000 1.303928e-001 -1.692896e-003
14
13 1.418517e+000 1.291463e-001 -1.246417e-003
15
14 1.546742e+000 1.282246e-001 -9.217196e-004
16
15 1.674282e+000 1.275408e-001 -6.838224e-004
Das Resultat sieht ziemlich hässlich und unleserlich aus, siehe Anhang.

1) Beide Spalten sollen die 1. Spalte als x-Achse verwenden, und zwar 
mit gleicher Skalierung etc.

2) Die Wertebereiche sind unterschiedlich, daher möchte ich die Bemaßung 
für die 2. Spalte (y1-Achse) links und die Bemaßung für die 3. Spalte 
(y2-Achse) rechts im Plot haben.

Mein Skript sieht momentan so aus:
1
Data = "q10.data"
2
3
Form = "png"
4
5
call "size.gplot" Data
6
7
#set xrange [min_x:max_x]
8
#set x2range [min_x:max_x]
9
10
set terminal Form size 640,480
11
set output "q10." . Form
12
set multiplot
13
14
#show autoscale
15
set autoscale keepfix
16
#set autoscale xfixmin
17
#set autoscale xfixmax
18
#set autoscale x2fixmin
19
#set autoscale x2fixmax
20
#show autoscale
21
22
plot [min_x:max_x] Data using 1:2 with lines title "quality p10" axes x1y1
23
plot [min_x:max_x] Data using 1:2 title "quality p10" axes x1y1
24
25
plot [min_x:max_x] Data using 1:3  lc "#000000" with lines axes x1y2
 
*size.gplot*
1
# Sets:
2
# size_x ,min_x, max_x,
3
# size_y, min_y, max_y.
4
5
# Dummy plot to get statistical properties without
6
# having "stats" command like with v4.4.4.
7
8
set terminal unknown
9
plot $0 u 1:2
10
11
min_x = GPVAL_DATA_X_MIN
12
max_x = GPVAL_DATA_X_MAX
13
min_y = GPVAL_DATA_Y_MIN
14
max_y = GPVAL_DATA_Y_MAX
15
16
size_x = max_x - min_x
17
size_y = max_y - min_y

Laut Doku sollte "xfixmin" "x2fixmin" etc. zu gleicher Skalierung der 
beiden x-Achsen führen.  Tut's aber nicht...

Wie macht man das richtig?

von Tobias P. (hubertus)


Angehängte Dateien:

Lesenswert?

Du musst doch dazu keinen multiplot verwenden. Du kannst auch
1
plot Data using 1:2 w l ax x1y1, Data using 1:3 w l ax x1y2

dann wird nur ein einzelner Plot erzeugt. Beispiel siehe Anhang.

1
reset
2
3
set y2tics in
4
5
set grid
6
7
set bmargin 4
8
set label 1 at graph 0.5, char 1 'xlabel' center
9
10
set lmargin 15
11
set label 2 at graph -0.12, graph 0.5 'y1label' right
12
13
set rmargin 30
14
set label 3 at graph 1.12, graph 0.5 'y1label' left
15
16
set key reverse Left
17
set key samplen 2
18
set key spacing 1.5
19
set key at graph 1.2, 1 left
20
21
plot 'data.txt' u 1:2 w lp pt 7 ps 1 ax x1y1 title 'Daten', \
22
     ''         u 1:3 w lp pt 7 ps 1 ax x1y2 title 'andere Daten'


allerdings würde ich nicht 2 y-Achsen benutzen. Obwohl man es kann, muss 
man immer tierisch aufpassen, dass die Ticks links und rechts zueinander 
passen, weil es sonst einfach hässlich wie die Nacht aussieht und das 
Gitter nirgends passt. Daher würde ich in der Tat in Erwägung ziehen 
einen Multiplot zu verwenden, wie im 2. Beispiel.
1
reset
2
3
set grid
4
5
set bmargin 4
6
7
set lmargin 15
8
9
set rmargin 18
10
11
set key reverse Left
12
set key samplen 2
13
set key spacing 1.5
14
set key at graph 1, 1 left
15
16
set multiplot layout 2,1
17
18
set label 1 at graph 0.5, graph -0.35 'xlabel' center
19
set label 2 at graph -0.12, graph 0.5 'y1label' right
20
plot 'data.txt' u 1:2 w lp pt 7 ps 1 title 'Daten'
21
22
set label 2 at graph -0.12, graph 0.5 'other' right
23
plot 'data.txt' u 1:3 w lp pt 7 ps 1 title 'andere Daten'
24
25
unset multiplot

: Bearbeitet durch User
von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Tobias P. schrieb:
> Du musst doch dazu keinen multiplot verwenden. Du kannst auch
>
>
1
> plot Data using 1:2 w l ax x1y1, Data using 1:3 w l ax x1y2
2
>
>
> dann wird nur ein einzelner Plot erzeugt. Beispiel siehe Anhang.

Danke für den Tipp!  Damit sieht es schon viel besser aus.

> allerdings würde ich nicht 2 y-Achsen benutzen. Obwohl man es kann, muss
> man immer tierisch aufpassen, dass die Ticks links und rechts zueinander
> passen,

Ist kein Problem, da ich in der Grafik kein Gitter haben will.  Es es 
nur eine Übersichtsgrafik wo ich die Bemaßung brauche bzw. sehen will.

> weil es sonst einfach hässlich wie die Nacht aussieht und das
> Gitter nirgends passt. Daher würde ich in der Tat in Erwägung ziehen
> einen Multiplot zu verwenden, wie im 2. Beispiel.

Das kann ich bestimmt auch mal gebrauchen; momentan ist's in 1 Plot 
übersichtlicher.

Wie kommst du auf all die magischen Zahlen?  Ist das einfach 
ausprobieren oder kann man die berechnen?

von Tobias P. (hubertus)


Angehängte Dateien:

Lesenswert?

Johann L. schrieb:
> Wie kommst du auf all die magischen Zahlen?  Ist das einfach
> ausprobieren oder kann man die berechnen?

einige davon sind ausprobiert.

Also
1
set key samplen 2
2
set key spacing 1.5
3
set key at graph 1, 1 left
4
set key reverse Left
mach ich immer gleich, weil es meiner Meinung nach hübscher aussieht als 
der Defaultwert, und weil ich die Legende immer oben links ausserhalb 
des Plots will. Die Legende ist mit den 3 obigen Befehlen bombenfest 
verankert und immer gleich.
1
set bmargin 4
2
set lmargin 15
3
set rmargin 18

ist immer ein wenig ein herum pröbeln. Ich mach die Achsen bei 
Diagrammen immer DIN461-formatiert, wegen der Legende und wegen 
allfälliger Einheiten oder Spezialsymbolen sind die Achsenbeschriftungen 
immer ein wenig anders in der Breite bzw. Höhe. Ich habe da leider noch 
keine befriedigende Lösung gefunden, die zuverlässig funktioniert.
1
set multiplot layout 2,1

das ist ja klar (2 Zeilen, 1 Spalte).
1
set label 1 at graph 0.5, graph -0.35 'xlabel' center
2
set label 2 at graph -0.12, graph 0.5 'y1label' right
3
...
4
set label 2 at graph -0.12, graph 0.5 'other' right

ich mache die Achsenbeschriftungen immer mit "set label" und nicht 
"xlabel" oder "ylabel", weil vor einigen Monaten in gnuplot eine 
Änderung gemacht wurde, die mir alte Plots zerschossen hat und ich 
musste dann jeden Plot händisch anfassen. Es hatte irgendwas mit der 
Ausrichtung der x/y-Labels zu tun, die gnuplot automatisch macht. Auf 
jeden Fall hat da was nicht richtig funktioniert, und seither mache ich 
die Labels händisch. graph 0.5 bedeutet, dass das Label mittig zum 
Graphen positioniert wird (beim x-Label ja sinnvoll, deshalb ist es auch 
zentriert). Die -0.35 findet man durch herum pröbeln ;-) dasselbe fürs 
y-Label.

Man könnte übrigens auch schreiben
1
set label 1 at graph 0.5, graph -0.35 'xlabel' center
2
set label 2 at graph -0.12, graph 0.5 'y1label' right
3
...
4
set label 2 'other' right

womit man die Positionsangabe beim 2. mal eigentlich sparen kann, nur 
der Text muss geändert werden.

Ich habe mir eine gnuplotsetup.gp zusammen gebastelt, die so aussieht
1
set linetype 1 lw 2 lc rgb '#0072bd' # blue
2
set linetype 2 lw 2 lc rgb '#d95319' # orange
3
set linetype 3 lw 2 lc rgb '#edb120' # yellow
4
set linetype 4 lw 2 lc rgb '#7e2f8e' # purple
5
set linetype 5 lw 2 lc rgb '#77ac30' # green
6
set linetype 6 lw 2 lc rgb '#4dbeee' # light-blue
7
set linetype 7 lw 2 lc rgb '#a2142f' # red
8
9
set palette defined (\
10
0 '#352a87',\
11
1 '#0363e1',\
12
2 '#1485d4',\
13
3 '#06a7c6',\
14
4 '#38b99e',\
15
5 '#92bf73',\
16
6 '#d9ba56',\
17
7 '#fcce2e',\
18
8 '#f9fb0e')
19
20
set style line 1 lw 3
21
set style line 2 lw 3
22
set style line 3 lw 3
23
set style line 4 lw 3
24
set style line 5 lw 3
25
set style line 6 lw 3
26
set style line 7 lw 3
27
28
set style line 100 lw 1 lc rgb 'black' dt '.'
29
set grid ls 100 front
30
31
set border 15 lw 2 front
32
33
set key at graph 1,1 left
34
set key reverse Left
35
set key samplen 2
36
set key spacing 1.5

und die muss ich dann nur noch einmal laden:
1
laod 'gnuplotsetup.gp'
2
plot sin(x) title 'funky stuff'

dann sieht der Plot schon defaultmässig etwas hübscher aus (u.a. will 
ich immer ein Gitter und die Matlab-Farben verwenden, und eben ein paar 
Ausrichtungen an der Legende korrigieren).

Im Anhang ein Beispiel wie ich das dann immer mache. Dass sind dann nur 
noch wenige Zeilen, weil ich nur die Labels und Ränder richtig setzen 
muss und natürlich noch der eigentliche Plotbefehl. Aber so kann man 
sich ein wenig Schreibarbeit sparen :-)

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.