Создайте тепловую карту в наборе X, Y, Z, где Z - интенсивность цвета.
У меня есть числовой набор X, Y, Z, и я хотел бы воспроизвести тепловую карту с этими значениями. Размер корзины составляет 20 x 20, а диапазон осей X и Y составляет от -150 до 150, где Z является цветом. В этом интервале он должен содержать среднее значение Z в этом диапазоне.
В Origin содержится этот инструмент для создания тепловой карты со средним значением значений, но я хотел бы сделать это в MATLAB. График, который я создал в Origin и который я хотел бы сделать в MATLAB, можно увидеть на рисунке 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 ответ
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');
Примечание: Почему это не проблема с образцами данных?
Используя ваши образцы данных,
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
вместо.