Настраиваем прозрачность для NaN при построении с использованием texturemap в MATLAB
В одной из наших предыдущих заметок мы визуализировали данные SST на карте. И в той заметке зашла речь о том, что при нанесении данных на карту, используя метод ‘texturemap’ в функции geoshow, области с пропущенными значениями (NaN) закрашиваются цветом. Например, используя те же данные SST, построим карту для немного другог района:
worldmap([42 78],[-50 180])
setm(gca,'MapProjection','mercator')
Раньше такая конструкция работала, но теперь, по неведомой мне причине MATLAB начал ругаться: «Error using setm (line 41)
Expected H to be a handle to a MATLAB graphics object.» Просит сделать указатьель (насколько я понимаю, как на русский язык переводится слово Handle, или ещё называют «дескриптор», что быть может даже более прпвильно), не хочет обращаться к карте при помощи gca. Ладно, сделаем через этот самый hadle.
k = worldmap([42 78],[-50 180])
setm(k,'MapProjection','mercator')
Теперь получилось построить подложку карты, осталось нанести данные:
k = worldmap([42 78],[-50 180])
setm(k,'MapProjection','mercator')
geoshow(lat,lon,sst,'displaytype','texture')
caxis([-2 25])
geoshow('landareas.shp','FaceColor',[0.5 0.5 0.5])
colormap jet
colorbar
Как мы и предупреждали, значения NaN имеют тёмно синий цвет, что не есть хорошо, так как неотличимы от значений с низкими температурами. Одно из решений мы обсуждали в прошлый раз — заменить ‘texturemap’ на ‘surface’:
k = worldmap([42 78],[-50 180])
setm(k,'MapProjection','mercator')
geoshow(lat,lon,sst,'displaytype','texture')
caxis([-2 25])
geoshow('landareas.shp','FaceColor',[0.5 0.5 0.5])
colormap jet
colorbar
Всё бы ничего, но бывают случаи когда всё таки нужно использовать именно ‘texturemap’. Что тогда? Тогда нужно немного дополнительно поколдовать. Во-первых, для того, чтобы можно было использовать тонкие настройки создадим также свой указатель для функции geoshow, строящей SST данные:
h =geoshow(lat,lon,sst,'displaytype','texture')
Во-вторых, настроим прозрачность, а именно, укажем, что настройки прозрачности будут применяться к каждому отдельному пекселю построения, а не ко всему объекту целиком (как это задано по умолчанию):
h.FaceAlpha = 'texturemap';
а затем установим для значений NaN прозрачность равную нулю:
alpha(h,double(~isnan(sst)))
Для тех, кто не понял, мы создали логический вектор по результатам сравнения с NaN и перевели его в числовой формат, ибо функция Alpha, создающая прозрачность принимает только его (0 — прозрачные объекты, 1 — непрозрачные).
Весь код выглядит так:
k = worldmap([42 78],[-50 180])
setm(k,'MapProjection','mercator')
h =geoshow(lat,lon,sst,'displaytype','texture')
caxis([-2 25])
geoshow('landareas.shp','FaceColor',[0.5 0.5 0.5])
colormap jet
colorbar
h.FaceAlpha = 'texturemap';
alpha(h,double(~isnan(sst)))
Где-то я ещё читал, что советуют также AlphaDataMapping вместо ‘scaled’ установить на ‘none’ (так что если будет для ваших задач не получаться, имеет смысл тоже попробовать):
h.AlphaDataMapping = 'none';
Следите за обновлениями, впереди ещё много материала.
Чтобы не пропустить новые заметки, подпишитесь на канал в Telegram: https://t.me/koldunovaleksey