Как уменьшить расстояние между картой и значениями долгот в MATLAB

Как уменьшить расстояние между картой и значениями долгот в MATLAB

В прошлый раз мы избавились от пустого пространства вокруг построенной карты в MATLAB. Однако, если вы не умеете этого делать, то жизнь ваша не станет такой уж сложной, ведь для обрезки пустого пространства картинки достаточно использовать любой редактор изображений с функцией кадрирования («crop») . Сегодняшняя тема — другое дело, здесь так просто не отделаться. Вернёмся к нашей карте:

worldmap([50 70],[-60 20])
setm(gca, 'mlabellocation',[-60:10:20])

Допустим, вы хотите подвинуть значения долгот ближе к координатным осям. Сделать это, воспользовавшись всё тем же приложением для редактирования изображений, уже не такая простая задача, ведь оси изогнуты. Вы не можете подвинуть все подписи одновременно вверх лёгким движением руки. Поэтому тут решение должно быть при построении на программном уровне. К моему удивлению, поиск решения данной проблемы занял у меня значительное время. Хотя решение моё достаточно простое, есть ощущение, что должно быть какое-то, скажем так, более «правильное» решение. Но что есть то есть.

Первое, что нам нужно сделать, это заполучить информацию о положении каждого значения долготы. Делаем мы это при помощи команды

m = mlabel('on');

Если наши оси были бы не изогнуты, то можно было бы изменить положение каждой подписи на фиксированное значение (сдвинуть всё вверх), используя координаты в нашей переменной m. Но в нашем случае такое провернуть не удасться и тогда на помощь приходит параметр VerticalAlignment (и такой вариант будет проще даже если сетка у вас прямоугольная).

По умолчанию параметр VerticalAlignment, отвечающий за выравнивание текста по вертикали имеет значение ‘top’. Заменить его можно на значения ‘bottom’, ‘cap’, ‘middle’ или ‘baseline’. На самом деле удобнее попробовать все варианты и посмотреть, какой вам больше нравится. Однако для ясности следует дать некоторые пояснения. У каждого текста есть свой центр по вертикали (‘middle’ ), базовая линия (‘baseline’), т.е. линия на которой лежат все буквы за исключением подстрочных элементов (хвостики у р, ц, д и т.д.), а также ‘cap’ , которая является верхушкой всех ПРОПИСНЫХ букв. Кроме того вокруг текста есть воображаемая рамка, границы которой по вертикали соответствуют ‘top’ и ‘bottom’. Параметр VerticalAlignment задаёт, какому из этих пяти мест текста будет соответствовать координата, записанная в Position для каждой долготы.

 Для того, чтобы заменить параметр ‘VerticalAlignment’ достаточно написать, например:

set(m,'VerticalAlignment','baseline');

Приведём здесь все варианты:

set(m,'VerticalAlignment','bottom');
set(m,'VerticalAlignment','cap');
set(m,'VerticalAlignment','baseline');
set(m,'VerticalAlignment','middle');

Если же вам нужна более тонкая настройка, то придётся колдовать с координатами или использовать более «удобные» картографические проекции. Ах да, чуть не забыл, если вам нужно будет работать со значениями широт, то вместо mlabel используйте plabel.

Чтобы не пропустить новые материалы с рецептами по работе с океанологическими данными, подпишитесь на канал в Telegram: https://t.me/koldunovaleksey