How to plot histogram using matrix?
조회 수: 37 (최근 30일)
이전 댓글 표시
I want to plot a histogram where the a value in the first column is the measurement of the rest of the columns. so example would be, the first column, first row, (Which is 1). It would plot the values 0.3 0.2 and 0.3. so the histogram would be the 0.2 and 0.3 and the 0.3 would be counted twice
T =[1 0.3 0.2 0.3; 2 0.2 0.1 0.2 ; 3 0.7 0.9 0.7 ; 4 0.9 0.2 0.1]
댓글 수: 0
채택된 답변
DGM
2021년 11월 25일
If I'm understanding the problem correctly, you're trying to plot a series of histograms, where column 1 is merely ordinal information, and you want a histogram for each row.
% parameters
nbins = 20; % use however many bins you want
% test data
T = [1 0.3 0.2 0.3; 2 0.2 0.1 0.2 ; 3 0.7 0.9 0.7 ; 4 0.9 0.2 0.1];
% build histograms with fixed (common) binning
datarange = [min(T(:,2:end),[],'all') max(T(:,2:end),[],'all')];
edges = linspace(datarange(1),datarange(2),nbins+1);
numframes = size(T,1);
H = zeros(numframes,nbins);
for f = 1:numframes
H(f,:) = histcounts(T(f,2:end),edges);
end
% adjust bin labels to indicate bin center value
xticks = linspace(1,nbins,nbins);
hbw = 0.5*abs(diff(datarange))/(nbins+1);
xlabels = linspace(datarange(1)+hbw,datarange(2)-hbw,nbins);
% plot everything
h = bar3(H);
% color plots based on z instead of x
for k = 1:length(h)
h(k).CData = h(k).ZData;
h(k).FaceColor = 'interp';
h(k).EdgeAlpha = 0.5;
h(k).EdgeColor = [0 0 0];
end
set(gca,'xtick',xticks);
set(gca,'xticklabels',num2str(xlabels',3));
view(40,14)
xlabel('bin')
ylabel('frame')
colormap(jet)
This example uses a set of common, uniformly-distributed bins for all rows. If you want to let each row have its own bin locations, you can, but it'll pretty much make the xticks (bin location) unreadable since the bars won't align.
댓글 수: 4
DGM
2021년 11월 25일
If you want to count the frequency of unique values of each row, then a method like above won't work. Even if bar3() would allow explicit xdata, managing the labeling would be a complete mess. There may be a way to set those positions via manipulation of the object vertices directly, but that's going to be another mess to think about.
The frequency information can easily be calculated using tabulate() if you have the stats toolbox, or using unique() and hist()/histc() if you don't have stats toolbox.
DGM
2021년 11월 25일
편집: DGM
2021년 11월 25일
For instance:
% parameters
nbins = 20; % use however many bins you want
barwidth = 0.08;
% test data
T = [1 0.3 0.2 0.3;
2 0.2 0.1 0.2;
3 0.7 0.9 0.7;
4 0.9 0.2 0.1;
5 0.8 0.5 0.3;
6 0.6 0.1 0.1;
7 0.2 0.4 0.6;
8 0.5 0.2 0.5;
9 0.2 0.3 0.4;
10 0.1 0.9 0.1];
% build histograms with fixed (common) binning
hbw = barwidth/2;
hold on;
for f = 1:size(T,1)
tt = tabulate(T(f,2:end));
% plot
h = bar3(tt(:,1),tt(:,2));
h.XData = h.XData + (f-1);
% need to enforce fixed bar width
YD = NaN(fliplr(size(h.YData)));
for b = 1:size(tt,1)
idx = [2 3 5:8 18 19] + 24*(b-1);
YD(idx) = tt(b,1)-hbw;
idx = [9:12 14 15] + 24*(b-1);
YD(idx) = tt(b,1)+hbw;
end
h.YData = YD.';
end
grid on
view(-56,52)
xlabel('frame')
I omitted the colormappng in this example for simplicity. As you can tell, this is starting to get messy.
추가 답변 (0개)
참고 항목
카테고리
Help Center 및 File Exchange에서 Histograms에 대해 자세히 알아보기
제품
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!