预处理
脚本复制后,需要预处理,否则出现"Not able to execute a .sh file: /bin/bash^M: bad interpreter"的错误。
sed -i -e 's/\r$//' multiplot.sh
gnuplot绘制多图。
multiplot.sh
gnuplot<<!
set terminal pngcairo size 600, 900
set output 'stacking.png'
set lmargin at screen 0.15
set rmargin at screen 0.95
TOP=0.98
DY = 0.29
set multiplot
set offset 0,0,graph 0.05, graph 0.05
set xlabel 'time'
set ylabel 'ylabel 1' offset 1
set tmargin at screen TOP-2*DY
set bmargin at screen TOP-3*DY
set ytics -1000,500,1000
plot 1150*cos(x) title 'First'
set xtics format ''
unset xlabel
set ylabel 'ylabel 2' offset 0
set tmargin at screen TOP-DY
set bmargin at screen TOP-2*DY
set ytics -100,50,100
plot 101*sin(x) title 'Second'
set ylabel 'ylabel 3' offset -1
set tmargin at screen TOP
set bmargin at screen TOP-DY
set ytics -8,4,8
plot 10*sin(2*x) title 'Third'
unset multiplot; set output
set output
exit
!
这里的tmargin,bmargin设置的就是一个子图的高度。
上述脚本可以直接执行,画出的结果:
我更改下脚本,让它画出四个子图。
#! /bin/sh
gnuplot<<!
set terminal pngcairo size 600, 900
set output 'stacking.png'
set lmargin at screen 0.15
set rmargin at screen 0.95
TOP=0.98
DY = 0.23
set multiplot
set offset 0,0,graph 0.05, graph 0.05
set xlabel 'time'
set ylabel 'ylabel 0' offset 1
set tmargin at screen TOP-3*DY
set bmargin at screen TOP-4*DY
set ytics -4 2 4
plot 8*cos(x) title 'Zero'
set xtics format ''
unset xlabel
set ylabel 'ylabel 1' offset 1
set tmargin at screen TOP-2*DY
set bmargin at screen TOP-3*DY
set ytics -1000,500,1000
plot 1150*cos(x) title 'First'
set ylabel 'ylabel 2' offset 0
set tmargin at screen TOP-DY
set bmargin at screen TOP-2*DY
set ytics -100,50,100
plot 101*sin(x) title 'Second'
set ylabel 'ylabel 3' offset -1
set tmargin at screen TOP
set bmargin at screen TOP-DY
set ytics -8,4,8
plot 10*sin(2*x) title 'Third'
unset multiplot;
set output
exit
!
result:
让各个子图之间,有一定的间距:
#! /bin/sh
gnuplot<<!
set terminal pngcairo size 600, 900
set output 'stacking.png'
set lmargin at screen 0.15
set rmargin at screen 0.95
TOP=0.98
DY = 0.21
seam=0.02
set multiplot
set offset 0,0,graph 0.05, graph 0.05
set xlabel 'time'
set ylabel 'ylabel 0' offset 1
set tmargin at screen TOP-3*DY-3*seam
set bmargin at screen TOP-4*DY-3*seam
set ytics -4 2 4
plot 8*cos(x) title 'Zero'
set xtics format ''
unset xlabel
set ylabel 'ylabel 1' offset 1
set tmargin at screen TOP-2*DY-2*seam
set bmargin at screen TOP-3*DY-2*seam
set ytics -1000,500,1000
plot 1150*cos(x) title 'First'
set ylabel 'ylabel 2' offset 1
set tmargin at screen TOP-DY-1*seam
set bmargin at screen TOP-2*DY-1*seam
set ytics -100,50,100
plot 101*sin(x) title 'Second'
set ylabel 'ylabel 3' offset 1
set tmargin at screen TOP
set bmargin at screen TOP-DY
set ytics -8,4,8
plot 10*sin(2*x) title 'Third'
unset multiplot;
set output
exit
!
results:
上下左右各两个:
multiplot.sh
#! /bin/sh
#set lmargin at screen 0.15
#set rmargin at screen 0.95
gnuplot<<!
set terminal pngcairo size 600, 900
set output 'stacking.png'
TOP=0.98
DY = 0.45
seam=0.02
x_gap=0.02
central_axis=0.55
set multiplot
set offset 0,0,graph 0.05, graph 0.05
set xlabel 'time'
set ylabel 'ylabel 0' offset 1
set lmargin at screen 0.15
set rmargin at screen central_axis-x_gap
set tmargin at screen TOP-1*DY-seam
set bmargin at screen TOP-2*DY-seam
set ytics -4 2 4
plot 8*cos(x) title 'Zero'
set xlabel 'time'
unset ylabel
set lmargin at screen central_axis+x_gap
set rmargin at screen 0.95
set tmargin at screen TOP-1*DY-seam
set bmargin at screen TOP-2*DY-seam
set ytics -1000,500,1000
plot 1150*cos(x) title 'First'
set xtics format ''
unset xlabel
set ylabel 'ylabel 2' offset 1
set lmargin at screen 0.15
set rmargin at screen central_axis-x_gap
set tmargin at screen TOP
set bmargin at screen TOP-DY
set ytics -100,50,100
plot 101*sin(x) title 'Second'
set xtics format ''
unset ylabel
set lmargin at screen central_axis+x_gap
set rmargin at screen 0.95
set tmargin at screen TOP
set bmargin at screen TOP-DY
set ytics -8,4,8
plot 10*sin(2*x) title 'Third'
unset multiplot;
set output
exit
!
Result:
更改坐标轴标注
data.txt
month beijing shanghai
Jan 12 13
Fab 1 3
Mar 2 4
Apr 5 7
May 4 8
Jun 9 10
Jul 13 15
Aug 16 17
Sept 2 20
Oct 25 15
Nov 18 16
Dec 12 17
data_plot.sh
#! /bin/sh
file1=data.txt
output=test
gnuplot<<!
set yrange [0:30]
set style data histogram
set style histogram clustered gap 1
set style fill solid 0.4 border
set term "png"
set output "${output}.png"
plot "${file1}" using 2:xticlabels(1) title columnheader(2),'' using 3:xticlabels(1) title columnheader(3)
set output
exit
!
reference:
[1]multiplot-stacking
[2]gnuplot demo
[3]How do gnuplot margins work in multiplot mode?
[4]gnuplot使用中的几个设置
[5] [gnuplot详细教程]