Подтвердить что ты не робот

Как я могу сделать "цветную карту" в Matlab?

У меня есть некоторые данные (функция из двух параметров), хранящиеся в формате matlab, и я хотел бы использовать matlab для его построения. Когда я прочитал данные, я использую mesh() для создания сюжета. Мой график mesh() дает мне значение функции как цвет и высоту поверхности, например:

A color and a surface height as a function of two independent variables.

Какую функцию построения Matlab следует использовать для создания 2D-сетки, где зависимая переменная представлена ​​только как цвет? Я ищу что-то вроде pm3d map в gnuplot.

4b9b3361

Ответ 1

По умолчанию mesh будет цветовое значение поверхности на основе (по умолчанию) jet colormap (т.е. hot выше). Вы можете дополнительно использовать surf для заполненных поверхностных патчей и установить для свойства 'EdgeColor' значение 'None' (поэтому края патча невидимы).

[X,Y] = meshgrid(-8:.5:8);
R = sqrt(X.^2 + Y.^2) + eps;
Z = sin(R)./R;

% surface in 3D
figure;
surf(Z,'EdgeColor','None');

enter image description here

2D-карта. Вы можете получить двумерную карту, переключив свойство view фигуры

% 2D map using view
figure;
surf(Z,'EdgeColor','None');
view(2);    

enter image description here

... или обрабатывая значения в Z как матрицу, рассматривая ее как масштабированное изображение с использованием imagesc и выбрав соответствующий colormap.

% using imagesc to view just Z
figure;
imagesc(Z); 
colormap jet; 

enter image description here

Цветовой палитр карты управляется colormap(map), где map может быть настраиваемым или любой из встроенных цветовых папок, предоставляемых MATLAB:

enter image description here

Обновление/уточнение карты. Несколько вариантов дизайна на карте (разрешение, сглаживание, ось и т.д.) можно контролировать с помощью обычных опций MATLAB. Как отмечает @Floris, вот сглаженные, равноосные, карты без меток, адаптированные к этому примеру:

figure;
surf(X, Y, Z,'EdgeColor', 'None', 'facecolor', 'interp');
view(2);
axis equal; 
axis off;

enter image description here

Ответ 2

Ответ gevang велик. Другой способ сделать это можно с помощью pcolor. Код:

[X,Y] = meshgrid(-8:.5:8);
R = sqrt(X.^2 + Y.^2) + eps;
Z = sin(R)./R;
figure;
subplot(1,3,1);
pcolor(X,Y,Z); 
subplot(1,3,2);
pcolor(X,Y,Z); shading flat;
subplot(1,3,3);
pcolor(X,Y,Z); shading interp;

Вывод:

enter image description here

Кроме того, pcolor также является плоским, как показано здесь (pcolor является базой 2d, а третий рисунок над ним генерируется с помощью mesh):

enter image description here

Ответ 3

Обратите внимание, что как pcolor, так и "surf + view (2)" не отображают последнюю строку и последний столбец ваших 2D-данных.

С другой стороны, используя imagesc, вы должны быть осторожны с осями. Примеры surf и imagesc в ответе gevang (почти - кроме последней строки и столбца) соответствуют друг другу, потому что функция 2D sinc симметрична.

Чтобы проиллюстрировать эти 2 пункта, я привел приведенный ниже рисунок со следующим кодом:

[x, y] = meshgrid(1:10,1:5);
z      = x.^3 + y.^3;

subplot(3,1,1)
imagesc(flipud(z)), axis equal tight, colorbar
set(gca, 'YTick', 1:5, 'YTickLabel', 5:-1:1);
title('imagesc')

subplot(3,1,2)
surf(x,y,z,'EdgeColor','None'), view(2), axis equal tight, colorbar
title('surf with view(2)')

subplot(3,1,3)
imagesc(flipud(z)), axis equal tight, colorbar
axis([0.5 9.5 1.5 5.5])
set(gca, 'YTick', 1:5, 'YTickLabel', 5:-1:1);
title('imagesc cropped')

colormap jet

surf vs imagesc

Как вы видите, 10-й ряд и 5-й столбец отсутствуют в сюжете серфинга. (Вы также можете увидеть это в изображениях в других ответах.)

Обратите внимание, как вы можете использовать команду set (gca, 'YTick'... "(и Xtick), чтобы правильно установить метки x и y tick, если x и y не 1:1: N.

Также обратите внимание, что imagesc имеет смысл только в том случае, если ваши данные z соответствуют xs и ys (каждый) равномерно распределены. Если нет, вы можете использовать серфинг (и, возможно, дублировать последний столбец и строку и еще одно значение "(конец, конец)", хотя это своего рода грязный подход).

Ответ 4

Я также предлагаю использовать contourf(Z). Для моей проблемы я хотел визуализировать трехмерную гистограмму в 2D, но контуры были слишком гладкими, чтобы представлять верхний вид гистограмм.

Итак, в моем случае, я предпочитаю использовать jucestain ответ. По-умолчанию подходит shading faceted pcolor(). Однако pcolor() не использует последнюю строку и столбец построенной матрицы. Для этого я использовал функцию padarray():

pcolor(padarray(Z,[1 1],0,'post'))

Извините, если это не связано с исходным сообщением