Нормализовать 3d-гистограмму, чтобы сумма под кривой = 1 в Matlab

Мне нужно понять, как я могу сделать трехмерную гистограмму данных, которые я нормализовал, поэтому область под = 1. у меня есть

data=[data_x,data_y];
[HIST,Cent]=hist3(data];

Я прочитал сообщение в:

MatLab: создать трехмерную гистограмму из дискретизированных данных

Но я не могу понять этот метод. Может ли какой-нибудь специалист помочь объяснить, как это сделать в Matlab?

Редактировать:

Я использовал следующий код:

load('of.mat')
data=[single(theta(:)),mag(:)];
%define the x and y axis
edges{1} = -180:90:180;
edges{2} = 0:0.2:1;
hist3(data, 'Edges',edges);
[N,C] = hist3(data, 'Edges',edges);
x_diff = diff(edges{1});
y_diff = diff(edges{2});
x = repmat([x_diff, x_diff(end)], length(edges{2}),1)';
y = repmat([y_diff, y_diff(end)], length(edges{1}),1);
% volume of the histogram
V_tot = sum(sum(x.*y.*N));
N_norm = N/V_tot;
figure
% plot normalized histogram
bar3(-C{2}, N_norm');
axis normal

Он работает хорошо, но как я могу изменить оси на нормированную гистограмму, ее отрицательный и мои данные должны быть положительными. Мои данные_x находятся между -180 и 180 (угол), а data_y - между 0 и 1. Я не могу опубликовать изображение.

1 ответ

Попробуйте этот код, если ящики размещены одинаково, это может дать вам удовлетворительный результат.

data = mvnrnd([0, 0], eye(2), 10e4);

%define the x and y axis
edges{1} = -4:0.5:4;
edges{2} = -4:0.2:4;

hist3(data, 'Edges', edges);

[N,C] = hist3(data, 'Edges', edges);

x_diff = diff(edges{1});
y_diff = diff(edges{2});
x = repmat([x_diff, x_diff(end)], length(edges{2}),1)';
y = repmat([y_diff, y_diff(end)], length(edges{1}),1);

% volume of the histogram
V_tot = sum(sum(x.*y.*N));

N_norm = N/V_tot;

figure
% plot normalized histogram
bar3(-C{2}, N_norm');
axis normal

Обратите внимание, что график bar3 требует некоторой последующей обработки: изменение тиков оси и, возможно, разрыв между цветом и цветом баров. Я не могу отправить изображение, поэтому вы должны попытаться запустить код и проверить, является ли результат приемлемым.

EDIT: или вы можете изменить метки тика на оси гистограммы z с помощью V_tot.

EDIT: изменение меток меток оси z (без штрихового графика):

data = mvnrnd([0, 0], eye(2), 10e4);

%define the x and y axis
edges{1} = -4:0.5:4;
edges{2} = -4:0.2:4;

hist3(data, 'Edges', edges);

[N,C] = hist3(data, 'Edges', edges);

x_diff = diff(edges{1});
y_diff = diff(edges{2});
x = repmat([x_diff, x_diff(end)], length(edges{2}),1)';
y = repmat([y_diff, y_diff(end)], length(edges{1}),1);

% volume of the histogram
V_tot = sum(sum(x.*y.*N));

% change the Z tick labels
z_tval = get(gca, 'ZTick');
z_norm_tval = z_tval/V_tot;
set(gca, 'ZTickLabel', z_norm_tval)

licensed under cc by-sa 3.0 with attribution.