Как я могу сделать "цветную карту" в Matlab?
У меня есть некоторые данные (функция из двух параметров), хранящиеся в формате matlab, и я хотел бы использовать matlab для его построения. Когда я прочитал данные, я использую mesh()
для создания сюжета. Мой график mesh()
дает мне значение функции как цвет и высоту поверхности, например:
![A color and a surface height as a function of two independent variables.]()
Какую функцию построения Matlab следует использовать для создания 2D-сетки, где зависимая переменная представлена только как цвет? Я ищу что-то вроде pm3d map
в gnuplot.
Ответы
Ответ 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'))
Извините, если это не связано с исходным сообщением