#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 не нужен. Спасибо!