gnuplot — переход с 2d точек на тепловую карту

#gnuplot #heatmap

#gnuplot #тепловая карта

Вопрос:

Я пытаюсь преобразовать график, который мы обычно делаем, используя точки, в тепловую карту. Данные представлены в формате x, y, z, где x, y — широта / долгота, а z — число зарегистрированных экземпляров

В настоящее время мы строим график с использованием:

 plot 'data.dat' u 1:2:3 with points pointtype 13 lc palette, 
'boundary.dat' with lines ls 1
 

Я хотел бы иметь возможность отображать тепловую карту в виде 3 графиков:
1. базовая тепловая карта значений
2. указывает, возможно, на 50% непрозрачности, чтобы показать базовый географический путь
3. линия, представляющая границу.

пример изображения:введите описание изображения здесь изображение слева — gnuplot, изображение справа — из qgis. Мы хотели бы, чтобы gnuplot создавал что-то похожее на то, что показано справа.

Питер

Ответ №1:

Хороший вопрос 🙂

Вам потребуется несколько шагов, чтобы получить правильный результат:

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

 set dgrid3d 200,200,2
set table 'data-heatmap.dat'
splot '< tr "," " " < data.dat' using 1:2:3
unset table
unset dgrid3d
 

Обычно вы можете использовать set datafile separator ',' запятые в качестве разделителей, но во временном файле data-heatmap.dat' contains columns separated by spaces, so you must use tr` запятые заменяются пробелами.

Затем вы можете построить все вместе. Полный сценарий может выглядеть следующим образом:

 # Diverging color palette from colorbrewer2.org
set palette defined (0 '#006837', 1 '#1a9850', 2 '#66bd63',
                     3 '#a6d96a', 4 '#d9ef8b', 5 '#ffffbf',
                     6 '#fee08b', 7 '#fdae61', 8 '#f46d43',
                     9 '#df3027', 10 '#a50026')
unset key
set dgrid3d 200,200,2
set table 'data-heatmap.dat'
splot '< tr "," " " < data.dat' using 1:2:3
unset table
unset dgrid3d

set autoscale fix
set xtics 0.1
plot 'data-heatmap.dat' u 1:2:3 w image,
     '< tr "," " " < boundary.dat' w l lc rgb 'black' lw 2,
     '< tr "," " " < data.dat' w p pt 7 ps 0.2 lc palette
 

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

Результат с 4.6.5:

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

Размеры сгенерированной сетки получены из ограничивающей рамки разбросанных данных. В качестве хака для расширения области интерполяции вы можете добавить две фиктивные точки «на лету» при создании интерполированных данных: одну точку в правом верхнем углу и одну в левом верхнем углу. Позже вы можете немного исправить эти точки с помощью set offsets :

 # Diverging color palette from colorbrewer2.org
set palette defined (0 '#006837', 1 '#1a9850', 2 '#66bd63',
                     3 '#a6d96a', 4 '#d9ef8b', 5 '#ffffbf',
                     6 '#fee08b', 7 '#fdae61', 8 '#f46d43',
                     9 '#df3027', 10 '#a50026')
unset key
set dgrid3d 200,200,2
set table 'data-heatmap.dat'
splot '< echo -e "n-118.62,34.29,1n-118.10,34.29,1" | paste -s -d "n" data.dat - | tr "," " "' using 1:2:3
unset table
unset dgrid3d

set autoscale fix
set offsets -0.02,-0.01,-0.01,0.01
set xtics 0.1
plot 'data-heatmap.dat' u 1:2:3 w image,
     '< tr "," " " < boundary.dat' w l lc rgb 'black' lw 2,
     '< tr "," " " < data.dat' w p pt 7 ps 0.2 lc palette
 

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

Комментарии:

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

2. хорошо, отлично. данные генерируются программно, поэтому я могу добавить несколько фиктивных строк / столбцов по мере необходимости. Я также изменил его, чтобы создать с использованием пробелов вместо запятых, поэтому tr не нужен. Спасибо!