Настраиваем прозрачность для 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
Нанесение данных на карту в MATLAB

Как мы и предупреждали, значения  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
строим карту в MATLAB через geoshow (surface)

Всё бы ничего, но бывают случаи когда всё таки нужно использовать именно '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)))
Настраиваем прозрачность для NaN в MATLAB

Где-то я ещё читал, что советуют также AlphaDataMapping вместо 'scaled' установить на 'none' (так что если будет для ваших задач не получаться, имеет смысл тоже попробовать):

h.AlphaDataMapping = 'none';

Следите за обновлениями, впереди ещё много материала.

 telegram

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