Создайте тепловую карту в наборе X, Y, Z, где Z - интенсивность цвета. - PullRequest
1 голос
/ 08 мая 2020

У меня есть числовой набор X, Y, Z, и я хотел бы воспроизвести тепловую карту с этими значениями. Размер корзины составляет 20 x 20, а диапазон осей X и Y составляет от -150 до 150, где Z - цвет. Внутри этого бункера он должен содержать среднее значение Z в этом диапазоне.

В Origin содержится этот инструмент для создания тепловой карты со средним значением, но я хотел бы сделать это в MATLAB. График, который я сделал в Origin и который я хотел бы сделать в MATLAB, можно увидеть на рисунке 1 .

Figure 1

Я пробовал что-то вроде

load xyz.dat 
x = xyz(:,1); 
y = xyz(:,2);
z = xyz(:,3); 
tbl = table(x,y,z); 
h = heatmap(tbl,'x','y','ColorVariable','z','ColorMethod','mean');

Но он напечатал это предупреждение

Предупреждение: Ошибка обновления HeatmapChart. Значения переменной «x» исходной таблицы не группируются по дискретным категориям. Используйте функцию дискретизации, чтобы сгруппировать свои значения.

1 Ответ

0 голосов
/ 09 мая 2020

heatmap ожидает дискретных значений x и y. Ваша цель - разделить ваши x и y на 20 дискретных интервалов и усреднить значения z для каждого интервала, но сами x и y являются непрерывными.

Чтобы достичь своей цели, следуйте совету предупреждающего сообщения и используйте discretize для объединения значений x и y.

% I used the following stand ins for your data:
% x = rand(540, 1);
% y = rand(540, 1);

n_bins = 20; % Number of grid cells
% If you want the width of the grid cell to be 20, use 
% n_bins = (max(x) - min(x)) / 20; 

x_discrete = discretize(x, n_bins);
y_discrete = discretize(y, n_bins);
tbl = table(X_discrete,y_discrete,z, 'VariableNames', {'x', 'y', 'z'});
h = heatmap(tbl,'x','y','ColorVariable','z','ColorMethod','mean');

Heatmap of discretized variables

Примечание. Почему это не проблема с образцами данных?

Используя ваши образцы данных,

x = [49.8, 14.5, -60.7, -21.6, -10.6];
y = [45.3, 7.9, 23.9, -58.5, -55.4];
z = [0.2 , -0.06, -0.35, -0.15, -0.08];
tbl = table(x',y',z', 'VariableNames', {'x', 'y', 'z'});
h = heatmap(tbl,'x','y','ColorVariable','z','ColorMethod','mean');

Не вызывает ошибку, потому что рассматривает каждое значение x и y как отдельную категорию. heatmap использует вызов categorical для преобразования непрерывных значений в категориальные значения.

Помимо того, что на самом деле вы не получаете желаемого результата (каждая точка будет отдельным блоком вместо усредненных ячеек сетки), categorical, похоже, имеет ограничение на количество создаваемых категориальных значений. Мне не удалось найти никакой документации о том, каков именно этот предел, но экспериментальным путем он достигает середины 200-х годов. Поскольку ваши векторы состоят из 540 элементов, вы получите предупреждение об использовании вместо него discretize.

...