Ответ 1
Получение полей с помощью multiplot
немного утомительно, особенно при использовании set pm3d map
, который имеет довольно большие поля.
Так как первый релиз релиза версии 5.0 уже вышел, я хотел бы упомянуть новые опции margins
и spacing
multiplot
.
margins
принимает четыре числа set multiplot margins <left>,<right>,<bottom>,<top>
, которые дают фиксированные общие поля вокруг макета мультипликации. spacing
принимает два числа set multiplot spacing <xspacing>,<yspacing>
, которые дают расстояние между двумя строками (<yspacing>
) или двумя столбцами (<xspacing>
).
set terminal pngcairo size 800,600 background rgb '#bbbbbb'
set output 'foobar.png'
set multiplot layout 2,2 \
margins 0.1,0.98,0.1,0.98 \
spacing 0.08,0.08
set ylabel 'ylabel'
plot x
unset ylabel
plot 2*x
set ylabel 'ylabel'
set xlabel 'xlabel'
plot 3*x
unset ylabel
plot 4*x
unset multiplot
Результат (с 5.0rc1):
Чтобы добиться того же, что и с gnuplot 4.x, вы должны выполнить вычисления вручную или определить некоторые функции, как показано в следующем примере. Это должно быть вполне универсальным.
Вы можете поместить все общие вещи в файл конфигурации, например multiplot.gp
, который содержит функции
init_margins(left, right, bottom, top, dx, dy, rows, cols) = \
sprintf('left_margin = %f; right_margin = %f; top_margin = %f; bottom_margin = %f; ', left, right, top, bottom) . \
sprintf('col_count = %d; row_count = %d; gap_size_x = %f; gap_size_y = %f', cols, rows, dx, dy)
get_lmargin(col) = (left_margin + (col - 1) * (gap_size_x + ((right_margin - left_margin)-(col_count - 1) * gap_size_x)/col_count))
get_rmargin(col) = (left_margin + (col - 1) * gap_size_x + col * ((right_margin - left_margin)-(col_count - 1) * gap_size_x)/col_count)
get_tmargin(row) = (top_margin - (row - 1) * gap_size_y - (row-1) * ((top_margin - bottom_margin - gap_size_y * row_count) / row_count))
get_bmargin(row) = (top_margin - (row - 1) * gap_size_y - row * ((top_margin - bottom_margin - gap_size_y * row_count) / row_count))
set_margins(col, row) = \
sprintf('set lmargin at screen %f;', get_lmargin(col)) . \
sprintf('set rmargin at screen %f;', get_rmargin(col)) . \
sprintf('set tmargin at screen %f;', get_tmargin(row)) . \
sprintf('set bmargin at screen %f;', get_bmargin(row))
Тогда главный файл
set terminal pngcairo size 800,600 background rgb '#bbbbbb'
set output 'foobar2.png'
load 'multiplot.gp'
eval(init_margins(0.1, 0.98, 0.1, 0.98, 0.08, 0.08, 2, 2))
set multiplot
eval(set_margins(1,1))
set ylabel 'ylabel'
plot x
eval(set_margins(2,1))
unset ylabel
plot 2*x
eval(set_margins(1,2))
set ylabel 'ylabel'
set xlabel 'xlabel'
plot 3*x
eval(set_margins(2,2))
unset ylabel
plot 4*x
unset multiplot
В результате (используя 4.6.4):