Тепловая карта гнуплота с разными масштабами
У меня проблемы с созданием тепловой карты с gnuplot для данных разных масштабов.
Рассмотрим следующий примерный набор данных:
0.100 1.000 10.0
0.010 1.000 20.0
0.001 1.000 40.0
0.100 10.00 20.0
0.010 10.00 40.0
0.001 10.00 80.0
0.100 100.0 40.0
0.010 100.0 80.0
0.001 100.0 160.0
Если я построю график с использованием тепловой карты, это будет правильным, если я масштабирую значения x так, чтобы они находились в том же диапазоне, что и значения y.
Пожалуйста, найдите ниже иллюстрирующий пример. Только второй график дает мне правильные значения тепловой карты (высокие значения в верхнем левом углу, низкие значения в нижнем правом углу):
set multiplot layout 2,1
set pm3d
set dgrid3d 20,20
set view map
set xlabel 'unscaled'
splot 'data.dat' u 1:2:3
set xlabel 'scaled by factor 1000'
splot 'data.dat' u ($1*1000):2:3
Как я могу добиться этого также для немасштабированных значений?
Любая помощь приветствуется. Большое спасибо.
2 ответа
Ну вот:
set dgrid3d 20,20
set pm3d explicit
set view map
set table "interpolated_data.dat"
splot 'data.dat' using ($1*1000):2:3
set output 'heatmap.png'
set terminal pngcairo
set multiplot layout 2,1
unset table
unset dgrid3d
set pm3d
unset surface
set xlabel 'scaled by factor 1000'
splot 'interpolated_data.dat' u 1:2:3
set xlabel 'unscaled'
splot 'interpolated_data.dat' u ($1/1000):2:3
Масштабный сюжет выглядит правильно, но я не уверен, что он действительно правильный. По крайней мере, в левом нижнем углу, кажется, есть артефакт, локальный максимум, которого, вероятно, не должно быть. Вы можете увидеть это лучше, если вы удалите set view map
:
Я думаю, что причина в dgrid3d
, Это делает некоторое взвешивание соседних точек, что может привести к неожиданным результатам.
Мое предложение будет использовать линейную интерполяцию, удалив set dgrid3d 20,20
и используя set pm3d interpolate 20,20
, Это дает следующую картину:
Наконец, ваши данные как-то просят, по крайней мере, попробовать график масштаба:
Мой сценарий для последнего сюжета выглядит следующим образом. Ничего особенного по сравнению с твоим. Я должен был указать xrange для немасштабированного графика, и он длиннее из-за 4 графиков.
reset
set terminal png size 1200,800
set output "data_log.png"
set logscale x
set logscale y
set multiplot layout 2,2 title "With \"interpolate\" and logscale"
set pm3d at s interpolate 20,20
set hidden3d
set xlabel 'unscaled'
set origin 0.5,0.5
set xrange [0.001:0.1]
splot 'data.dat' u 1:2:3 notitle
set autoscale x
set xlabel 'scaled by factor 1000'
set origin 0.5,0.0
splot 'data.dat' u ($1*1000):2:3 notitle
set view map
set xlabel 'unscaled'
set origin 0.0,0.5
set xrange [0.001:0.1]
splot 'data.dat' u 1:2:3 notitle
set autoscale x
set xlabel 'scaled by factor 1000'
set origin 0.0,0.0
splot 'data.dat' u ($1*1000):2:3 notitle
unset multiplot
set output