20080115

Цветные поверхности в gnuplot в режиме pm3d

Задача: визуализация двумерных данных, то есть некой зависимости вида
z=f(x,y). Всем понятный пример такой функции: карта высот некоторого района, высота является функцией координат.

Распространены следующие способы отобразить графически значения такой функции:
1) рисовать изолинии значений функции, вдоль которых значение функции не меняется;
2) раскрашивать плоскость {x,y} цветами, зависящими от значения функции (чем выше, тем желтее на физических картах);
3) рисовать проекцию воображаемой поверхности, с таким рельефом, как если бы значения функции в каждой точке были высотой этой точки;
4) комбинировать способы 1–3.

В этом посте я расскажу, как можно рисовать раскрашенную «поверхность» значений функции в gnuplot. О том, как рисовать на графике изолинии, я написал отдельную заметку. Для начального ознакомления с gnuplot я рекомендую прочитать статью Строим научные графики с помощью GNUplot Михаила Конника.

В качестве примера я буду строить график следующей аналитически заданной функции:
z=(cos(5*acos(y/sqrt(x*x+y*y)))/(1+(x*x+y*y))**0.25),

хотя ровно то же самое можно делать и с данными из файла.

Надо сказать, что возможность раскрашивать поверхности появилась в gnuplot сравнительно недавно, начиная с версии 4.0. Раньше можно было нарисовать поверхность только с помощью линий.

Чтобы нарисовать поверхность линиями, надо выполнить в gnuplot следующую комманду:

splot (cos(5*acos(y/sqrt(x*x+y*y)))/(1+(x*x+y*y))**0.25) w l

где w l — это сокращение от with lines. Эта и все последующие команды набираются внутри интерпретатора gnuplot. Результат выглядит примерно так:
gnuplot splot with lines

Перед построением этого графика я задал точку зрения (set view 45,45 и степень детализации (set isosamples 50). В современных версиях gnuplot, при использовании интерактивных терминалов (x11,wxt) точку зрения можно менять поворачивая изображение при нажатой кнопке мыши.

А вот, что получается, если использовать режим построения графиков pm3d. Команда:

splot (cos(5*acos(y/sqrt(x*x+y*y)))/(1+(x*x+y*y))**0.25) w pm3d

(w pm3d можно писать полностью как with pm3d). Получаемый результат:
gnuplot splot with pm3d

Многие такие графики в цветном варианте выглядят гораздо понятнее. Цветовая палитра — это линейка цветов, крайние цвета соответствуют максимальному и минимальному значению функции. Промежуточные — промежуточным. Палитру, конечно, можно сменить (набираем в gnuplot help palette и читаем справку).

Стоит отметить палитру из градаций серого:

set palette gray

после чего повторное построение графика даёт:


Можно задавать палитры и с помощью формул. В gnuplot имеется несколько формул, задающих зависимость яркости от значения, формулы пронумерованы. Чтобы собрать пользовательскую палитру, нужно указать номера формул, которые надо использовать для каждого цветового канала.

Я, например, являюсь большим поклонником палитры 30-31-32, которая включается так:

set palette rgbformulae 30,31,32

Это значит, что красный канал определяется формулой №30, зелёный формулой №31 и синий формулой №32, а результат выглядит так:

Прелесть этой палитры в том, что даже если её напечатать в градациях серого, градации яркости останутся заметны. Это удобно, если принтер нецветной. Полагаю, что и у людей с нарушениями цветового зрения проблем с такой палитрой тоже будет меньше.

Кому мало встроенных формул для составления палитры — могут загружать палитры из файла. И конечно, RGB — не единственная цветовая модель, которую можно использовать при задании палитры. Доступны также следующие цветовые модели: HSV, CMY, YIQ, XYZ.

Любая палитра может быть инвертирована (перевёрнута), если добавить слово negative после описания палитры в команде set palette. При этом максимум и минимум на палитре меняются местами.

Ну а если рисовать «трёхмерные» поверхности не нужно, а хочется просто взглянуть на раскрашенную область определения функции «сверху»? Ничего проще!

set view map
splot (cos(5*acos(y/sqrt(x*x+y*y)))/(1+(x*x+y*y))**0.25) w pm3d


Получаем вот такую «цветовую карту» нашей функции:

(здесь я использовал палитру 34-35-36).

По умолчанию, палитра растягивается, чтобы охватить весь диапазон данных. Если нужно указать диапазон палитры (цветовой шкалы) явно, можно использовать команду:

set cbrange [минимум:максимум]

Смотрите также:

☙ справку по режиму pm3d в gnuplot (набрать help pm3d)
галерею возможностей режима pm3d
галерею возможностей режима pm3d (сокрытие поверхностей)
Как построить график с изолиниями в gnuplot, gri и pylab
Сравнение программ для построения графиков