How do i create a multi-colour histogram using excel data?

3 次查看(过去 30 天)
Hi, I tried to make a histogram same as the picture below. The yA, yB, yC are the data which i exported from excel. However, i got the error message at the end:
1) Error using horzcat
Dimensions of arrays being concatenated are not consistent.
2) Error in Untitled (line 20)
yA2 = [yA minY maxY];
What have i done wrong?
clf
clear all
clc
% x = x values for yA and yB (not needed for histogram)
% yA = data set A
% yB = data set B
% nBins = number of bins to use in histograms
% yA=30mins, yB=120mins, yC=240mins
Load yA
Load yB
Load yC
% Set extrema
minY = 0; %there are no values lower than this
maxY = 50; %there are no values higher than this
% Add in extrema placeholders to adjust bins to a common scale
yA2 = [yA minY maxY];
yB2 = [yB minY maxY];
yC2 = [yC minY maxY];
% Bin data
[countsA2, binsA2] = hist(yA2, nBins);
[countsB2, binsB2] = hist(yB2, nBins);
[countsC2, binsC2] = hist(yC2, nBins);
% Remove extrema placeholders from counts
histEnds = zeros(size(binsA2));
%data sets A and B have the same nBins, so binsA2 and binsB2 are same length
histEnds(1) = 1; %removes minimum placeholder
histEnds(end) = 1; %removes maximum placeholder
countsA3 = countsA2 - histEnds;
countsB3 = countsB2 - histEnds;
countsC3 = countsC2 - histEnds;
% Plot histograms
hold all
bar(binsA2, countsA3, 'b')
bar(binsB2, countsB3, 'r')
bar(binsC2, countsC3, 'g')
hold off
% Labels
set(gca, 'XLim', [minY maxY])
xlabel('y value')
ylabel('counts')
legend({'A', 'B', 'C'})

回答(4 个)

J. Alex Lee
J. Alex Lee 2020-2-3
编辑:J. Alex Lee 2020-2-12
I suspect your yA, yB, yC are column vectors, which you are trying to horizontally concatenate with scalars. You can probably fix this error by
yA2 = [yA;minY;minX]
But, I think you are making your script too complicated; don't alter you data to fit end visualization goals, but rather look for options in your tools to do that.
% Load yA
% Load yB
% Load yC
% comment out below 3 lines and uncomment your original data loads above
yA = randn(1000,1)*7+15;
yB = randn(1000,1)*3+7;
yC = randn(1000,1)*4+30;
% specify number of bins and edges of those bins; this example evenly spaces bins
NumBins = 25;
BinEdges = linspace(0,50,25);
% use histcounts and specify your bins
cntA = histcounts(yA,'BinEdges',BinEdges);
cntB = histcounts(yB,'BinEdges',BinEdges);
cntC = histcounts(yC,'BinEdges',BinEdges);
% plot
figure(1); cla; hold on;
% convert bin edges into bin centers
b = BinEdges(1:end-1)+diff(BinEdges)/2
% use bar
bar(b,[cntA',cntB',cntC'],'stacked')

ka chun yick
ka chun yick 2020-2-6
Hi,
This is my updated script. But it still got some problems at the end:
Undefined function or variable 'nbins'.
Error in Untitled (line 20)
[countsA2, binsA2] = hist(yA2,nbins);
clf
clear all
clc
% x = x values for yA and yB (not needed for histogram)
% yA = data set A
% yB = data set B
% nBins = number of bins to use in histograms
% yA=30mins, yB=120mins, yC=240mins
load yA
load yB
load yC
% Set extrema
minY = 0; %there are no values lower than this
maxY = 50; %there are no values higher than this
% Add in extrema placeholders to adjust bins to a common scale
yA2 = [yA;minY;maxY];
yB2 = [yB;minY;maxY];
yC2 = [yC;minY;maxY];
% Bin data
[countsA2, binsA2] = hist(yA2,nbins);
[countsB2, binsB2] = hist(yB2,nbins);
[countsC2, binsC2] = hist(yC2,nbins);
% Remove extrema placeholders from counts
histEnds = zeros(size(binsA2));
%data sets A and B have the same nBins, so binsA2 and binsB2 are same length
histEnds(1) = 1; %removes minimum placeholder
histEnds(end) = 1; %removes maximum placeholder
countsA3 = countsA2 - histEnds;
countsB3 = countsB2 - histEnds;
countsC3 = countsC2 - histEnds;
% Plot histograms
hold all
bar(binsA2, countsA3, 'b')
bar(binsB2, countsB3, 'r')
bar(binsC2, countsC3, 'g')
hold off
% Labels
set(gca, 'XLim', [minY maxY])
xlabel('y value')
ylabel('counts')
legend({'A', 'B', 'C'})
  1 个评论
J. Alex Lee
J. Alex Lee 2020-2-6
编辑:J. Alex Lee 2020-2-6
The error sounds straightforward...you have not defined nBins.
Does my solution not work?

请先登录,再进行评论。


ka chun yick
ka chun yick 2020-2-7
Hi,
I still got a problem on the line 20, bar(b,[cA',cB'],'stacked'), any thought? Capture - co.png
  1 个评论
J. Alex Lee
J. Alex Lee 2020-2-7
编辑:J. Alex Lee 2020-2-7
Yea, my bad. I was incomplete in my last line. Here's a tested example with test data.
% Load yA
% Load yB
% Load yC
% comment out below 3 lines and uncomment your original data loads above
yA = randn(1000,1)*7+15;
yB = randn(1000,1)*3+7;
yC = randn(1000,1)*4+30;
% specify number of bins and edges of those bins; this example evenly spaces bins
NumBins = 25;
BinEdges = linspace(0,50,25);
% use histcounts and specify your bins
cntA = histcounts(yA,'BinEdges',BinEdges);
cntB = histcounts(yB,'BinEdges',BinEdges);
cntC = histcounts(yC,'BinEdges',BinEdges);
% plot
figure(1); cla; hold on;
% convert bin edges into bin centers
b = BinEdges(1:end-1)+diff(BinEdges)/2
% use bar
bar(b,[cntA',cntB',cntC'],'stacked')
untitled.png
But note that the error message told you exactly what was wrong.

请先登录,再进行评论。


ka chun yick
ka chun yick 2020-2-11
Thanks, it works. In additional, i would like to add a distribution fit. I looked at the tutorial: https://uk.mathworks.com/help/stats/histfit.html
histfit(data) plots a histogram of values in data using the number of bins equal to the square root of the number of elements in data and fits a normal density function.
So, hisfit(data) will do its work. How do i add this line to the script?
% Load yA
% Load yB
% Load yC
% comment out below 3 lines and uncomment your original data loads above
yA = randn(1000,1)*7+15;
yB = randn(1000,1)*3+7;
yC = randn(1000,1)*4+30;
% specify number of bins and edges of those bins; this example evenly spaces bins
NumBins = 25;
BinEdges = linspace(0,50,25);
% use histcounts and specify your bins
cntA = histcounts(yA,'BinEdges',BinEdges);
cntB = histcounts(yB,'BinEdges',BinEdges);
cntC = histcounts(yC,'BinEdges',BinEdges);
% plot
figure(1); cla; hold on;
% convert bin edges into bin centers
b = BinEdges(1:end-1)+diff(BinEdges)/2
% use bar
bar(b,[cntA',cntB',cntC'],'stacked')
  2 个评论
J. Alex Lee
J. Alex Lee 2020-2-11
I don't have the toolbox. It seems you already have the full documentation, why not use it?
ka chun yick
ka chun yick 2020-2-11
Hi,
I am using the academic version so i don't have the access of toolbox. Any idea that i can add the histfit()to the existing sctipt? I am not sure which line should i define....

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Data Distribution Plots 的更多信息

标签

产品

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by