2013-04-15 2 views
3

У меня есть матрица с координатами x и y, а также значения температуры для каждой из моих точек данных. Когда я рисую это на графике рассеяния, некоторые из точек данных затмевают других, и поэтому график не даст истинного представления о том, как изменяется температура в моем наборе данных.MATLAB - Пикселируйте график и превратите его в тепловую карту

Чтобы исправить это, я хотел бы уменьшить разрешение моего графика и создать пиксели, которые представляют среднюю температуру для всех точек данных в области пикселя. Еще один способ подумать о проблеме, которая мне нужна, чтобы поместить сетку по текущему графику и усреднить значения в каждом сегменте сетки.

Я нашел эту ветку - Generate a heatmap in MatPlotLib using a scatter data set - которая показывает, как использовать python для достижения конечного результата, который я хочу. Однако мой текущий код находится в MATLAB, и хотя я пробовал разные предложения, такие как heatmap, contourf и imagesc, я не могу получить результат, который я хочу.

ответ

9

Вы можете «уменьшить разрешение» своих данных, используя accumarray, где указывается, в какой выходной «бит» должна быть вставлена ​​каждая точка, и укажите, что вы хотите взять среднее значение во всех точках в этом бункере.

Некоторые примеры данных:

% make points that overlap a lot 
n = 10000 
% NOTE: your points do not need to be sorted. 
% I only sorted so we can visually see if the code worked, 
% see the below plot 
Xs = sort(rand(n, 1)); 
Ys = rand(n, 1); 
temps = sort(rand(n, 1)); 

% plot 
colormap("hot") 
scatter(Xs, Ys, 8, temps) 

raw points plotted

(я только отсортирован по Xs и temps для того, чтобы получить образец полосатый выше, так что мы можем визуально проверить, является ли «уменьшить разрешение» работал)

Теперь предположим, что хочу уменьшить разрешение своих данных, получив только одну точку на 0.05 единиц в направлениях X и Y, являясь средним значением всех точек в что квадрат (так как мои X и Y идут от 0 до 1, я получу 20 * 20 баллов).

% group into bins of 0.05 
binsize = 0.05; 

% create the bins 
xbins = 0:binsize:1; 
ybins = 0:binsize:1; 

Я использую histc для работы, какие бен каждый X и Y в (обратите внимание - в этом случае, так как бункеры регулярны я мог бы также сделать idxx = floor((Xs - xbins(1))/binsize) + 1)

% work out which bin each X and Y is in (idxx, idxy) 
[nx, idxx] = histc(Xs, xbins); 
[ny, idxy] = histc(Ys, ybins); 

Затем я использую accumarray для сделать среднее temps в пределах каждого бина:

% calculate mean in each direction 
out = accumarray([idxy idxx], temps', [], @mean); 

(Примечание - это означает, что точка в temps(i) принадлежит «пикс el "(нашей выходной матрицы) в строке idxy(1) столбец idxx(1). Я сделал [idxy idxx] в отличие от [idxx idxy] так, что результирующая матрица имеет Y == строк и столбцов X ==))

Вы можете построить так:

% PLOT 
imagesc(xbins, ybins, out) 
set(gca, 'YDir', 'normal') % flip Y axis back to normal 

binned data

Или как разбросом сюжет, как это (я сюжет каждой точки в средней точке «пиксель», и обратил исходные точки данных слишком для сравнения):

xx = xbins(1:(end - 1)) + binsize/2; 
yy = ybins(1:(end - 1)) + binsize/2; 
[xx, yy] = meshgrid(xx, yy); 
scatter(Xs, Ys, 2, temps); 
hold on; 
scatter(xx(:), yy(:), 20, out(:)); 

overlaid

+0

Этот ответ потрясающий!Спасибо огромное! Я пару раз работал с вашим решением, и я могу получить именно то, что хочу. Я собираюсь поработать над своим представителем, чтобы я мог подняться, спасибо еще раз !!! –

Смежные вопросы