Contourf и NaNs (как сделать белые области прозрачными)
Я пытаюсь создать график contourf
, но некоторые области массива данных имеют NaN (только в матрице данных, матрицы x и y meshgrid заполнены). Я бы хотел, чтобы эти NaN были прозрачными, и они предназначены для NaNs на границе прямоугольника. Но смежные области NaN внутри матрицы данных являются белыми, а не прозрачными. Ниже приведен пример:
код:
[X Y] = meshgrid(10:50);
Z = X.*Y;
Z(10:30,10:30) = NaN;
figure
imshow(uint8(repmat(1:4:240,[60,1,3])));
hold on;
contourf(X,Y,Z);
colormap jet;
Вывод:
![enter image description here]()
Подсказка:
Добавление вышеуказанного кода с помощью:
% Find Face
set(findobj(h,'FaceColor',[1 1 1]),'FaceAlpha',0))
Найдите белый объект патча и установите его прозрачным. К сожалению, патч под ним заполнен:
![enter image description here]()
Обновление: взятие области NaN
и наложение фонового изображения на результат:
![enter image description here]()
Как вы можете видеть, он не охватывает весь образ. Если я использую imdilate
, он избавляется от белой области, но в то же время также разрушает черную границу, а также немного данных.
Ответы
Ответ 1
Основываясь на ответе H. Muster, я искусственно создал группы, сегментируя данные (вы могли бы использовать простую функцию для выбора групп или создавать их с помощью contour
на фиктивной фигуре, возвращать их и повторно -используйте их).
[X Y] = meshgrid(10:0.1:50);
Z = X.*Y;
Z(100:300,100:300) = NaN;
figure
hold on;
h = pcolor(X,Y,round(Z/500)*500);
set(h,'Edgecolor', 'interp');
colormap jet;
set(gca, 'XLim', [0 60], 'YLim', [0 60]);
Я боюсь, что у меня нет панели инструментов, которая включает imread
, поэтому не может показать базовый градиент, но я думаю, что это сработает. Я должен был увеличить разрешение в 10 раз, чтобы получить достаточно гладкое изображение.
![enter image description here]()
Ответ 2
Можно ли использовать pcolor
вместо contourf
?
[X Y] = meshgrid(10:50);
Z = X.*Y;
Z(10:30,10:30) = NaN;
figure
imshow(uint8(repmat(1:4:240,[60,1,3])));
hold on;
h = pcolor(X,Y,Z)
set(h,'Edgecolor', 'interp');
colormap jet;
![enter image description here]()