Гладкий контур контура - PullRequest
0 голосов
/ 17 октября 2018

Привет
Я хочу представить данные с двумя переменными (широтой и долготой) в формате 2D.Значение представлено цветом и 2 переменными в виде оси 2, и я использую функцию contourf для построения моих данных.Все данные поступают из файла xlsx, и я помещаю его в матрицу.

Locations = xlsread('Availability results.xlsx');
column_numberloc = 1; % Column in the locations file containing the number of the locations
column_latitude = 2; % Column in the locations file containing the latitude of the locations
column_longitude = 3; % Column in the locations file containing the longitude of the locations
column_availability = 4; % Column in the locations file containing the availability of the locations

min_latitude = min(Locations(:,column_latitude));
max_latitude = max(Locations(:,column_latitude));
min_longitude = min(Locations(:,column_longitude));
max_longitude = max(Locations(:,column_longitude));
max_availability = max(Locations(:,column_availability));
min_availability = min(Locations(:,column_availability));
longitude = Locations(:,column_longitude);
latitude = Locations(:,column_latitude);
Contour = zeros(23,17);

for numerofile=1:204
    [coord_x,coord_y] =transformation(Locations(numerofile,column_latitude),Locations(numerofile,column_longitude));
    Contour(coord_x,coord_y) = Locations(numerofile,column_availability);
end

for i=1:23
    for j=1:17
        if Contour(i,j) == 0
            Contour(i,j) = NaN;
        end
    end
end

cMap=jet(256);
figure(1);

x = linspace(min_longitude,max_longitude,17);
y = linspace(min_latitude,max_latitude,23);
newpoints = 100;

[xq,yq] = meshgrid(linspace(min(x),max(x),newpoints),linspace(min(y),max(y),newpoints ));
Contourq = interp2(x,y,Contour,xq,yq,'linear',max_availability);


[c,h]=contourf(xq,yq,Contourq,100);

%[c,h]=contourf(x,y,Contour,50);
set(h, 'edgecolor','none');
colormap(cMap);
cb=colorbar;
caxis([min_availability max_availability]);

Функция преобразование позволяет мне поместить все данные в матрицу Contour, поскольку она связывает долготуи широта для строки и столбца.

Я поместил NaN для всех данных, равных нулю, чтобы лучше рассмотреть мои данные, и я получил это: interpolation_linear

Это хорошо, но я хотел, чтобы эти данные были близки к: Без интерполяции

Итак, я решил изменить линейную интерполяцию на «ближайшую» интерполяцию и я получил это: interpolation_nearest

Я могу видеть больше данных, но контурный график не такой гладкий , как при линейной интерполяции.

Я видел много постов о том, как сделать гладкий контурный график (именно так я нашел функцию 'interp2'), но я думаю, что моя проблема связана с данными NaN, которые мешают мне иметь гладкий контурный график на границе междуNaN васиние и остальные, как на первом изображении, но с достаточным количеством данных, например на третьем.

Мой вопрос: знаете ли вы , как получить график с гладким контуром с достаточным количеством данных благодаряближайшая интерполяция, но с хорошим изображением, похожим на первое изображение?

Большое спасибо

1 Ответ

0 голосов
/ 17 октября 2018

Поскольку вы выполняете интерполяцию на квадратной сетке, вы можете напрямую отобразить 2D-изображение с помощью imagesc.Преимущество заключается в том, что вы можете получить доступ к свойству AlphaData объектов изображения, которое можно использовать в качестве маски отображения.

r=rand(50);            % random 50x50 array
r(11:20,11:20)=NaN;    % some hole filled with NaN
imagesc(r)             % show the image, with NaN considered as the lowest value in color scale
imagesc(r,'AlphaData',~isnan(r)) % show the image, with NaN values set as fully transparent

Затем вы также можете:

  • сначала установить маску отображения
  • заменить нули или NaN некоторыми значимыми значениями (ближайшее значение не NaN?)
  • интерполируется с interp2, возможно, даже с параметром 'cubic' для улучшения сглаживания
  • отображает только значимую часть изображения благодаря маске отображения, установленной в AlphaData.
...