Гнуплот, pm3d с контурными линиями

Я строю матрицу с некоторыми значениями в 3D-графике, и мне нужно добавить контурные линии на график, есть ли простая команда gnuplot, чтобы сделать это?

Я попробовал команду: "установить контурную базу", но подошла только 1 строка, я думаю, что должно быть много строк. Посмотреть изображение Matlab

Когда я строю это в gnuplot, я получаю только 1 контурную линию в верхнем левом углу. Но все остальное правильно.

Моя цель - сделать так, чтобы это выглядело в Matlab, как этот Matlabplot

Я также нашел этот пример: см. Ссылку в комментариях (не хватает представителя), но я не понимаю, где я должен вставить значения данных из test.txt

test.txt

test.txt

команды gnuplot

set view map
set yrange [0:30]
set xrange [0:30]
set dgrid3d 100,100,4
set contour base
splot 'test.txt' u 1:2:3 w pm3d

1 ответ

Решение

Чего вам не хватает, так это сказать gnuplot, куда поместить контуры. Это делается через set cntrparam levels incr -0.3,0.1,0.5 команда, которая означает: начать с -0,3 и проследить контур каждые 0,1 до 0,5.

AFAIK, если вы хотите сделать контуры полностью черными, вы должны сохранить контурные линии во временном файле (здесь contour.txt).

Так что ваш сценарий будет

reset
set contour
unset surface
set cntrparam levels incr -0.3,0.1,0.5

set view map
set xrange [0:30]
set yrange [0:30]

set dgrid3d 100,100,4

set table "contour.txt"
splot 'test.txt'
unset table

unset contour
set surface
set table "dgrid.txt"
splot 'test.txt'
unset table

reset
set pm3d map
unset key
set palette defined (0 '#352a87', 1 '#0363e1',2 '#1485d4', 3 '#06a7c6', 4 '#38b99e', 5 '#92bf73', 6 '#d9ba56', 7 '#fcce2e', 8 '#f9fb0e')
set autoscale fix
set grid

splot 'dgrid.txt' w pm3d, 'contour.txt' w l lc rgb "black"

что дает вам это:

Вот

Замечания:

Вы можете избавиться от файла интерполяции (dgrid.txt) если вы немного отформатируете свой файл данных, оставив пустую строку после каждой строки (т.е. каждые 30 точек данных), потому что они уже упорядочены по сетке.

Это может быть сделано также с awk скрипт. Но мне лень это заглядывать...

Остальные останутся такими же и будут работать как положено.

вот как это должно выглядеть:

В этом случае скрипт просто станет:

set pm3d map impl
set contour
set style increment user
do for [i=1:18] { set style line i lc rgb "black"}
set cntrparam levels incr -0.3,0.1,0.5
set palette defined (0 '#352a87', 1 '#0363e1',2 '#1485d4', 3 '#06a7c6', 4 '#38b99e', 5 '#92bf73', 6 '#d9ba56', 7 '#fcce2e', 8 '#f9fb0e')
set autoscale fix
splot 'test.txt' w pm3d notitle

без необходимости в промежуточном файле и с лучшим контуром, поскольку данные не интерполируются по сетке:

введите описание изображения здесь

Другие вопросы по тегам