Eghbal
Eghbal

Reputation: 3783

Conditional coloring of histogram graph in MATLAB

I have a histogram that I want conditional coloring in it with this rule :

Values that are upper than 50 have red bars and values lower than 50 have blue bars.

Suppose that we have this input matrix:

X = [32 64 32 12 56 76 65 44 89 87 78 56 96 90 86 95 100 65];

I want default bins of MATLAB and applying this coloring on X-axes (bins). I'm using GUIDE to design my GUI and this histogram is an axes in my GUI.

enter image description here

This is our normal graph. Bars with upper values than 50 should be red and bars with lower values than 50 should be green (X-axes). Bars with upper values than 50 should be red and ?

Upvotes: 1

Views: 982

Answers (3)

Luis Mendo
Luis Mendo

Reputation: 112659

I think this does what you want (as per comments). The bar around 50 is split into the two colors. This is done by using a patch to change the color of part of that bar.

%// Data:
X = [32 64 32 12 56 76 65 44 89 87 78 56 96 90 86 95 100 65]; %// data values
D = 50; %// where to divide into two colors

%// Histogram plot:
[y n] = hist(X); %// y: values; n: bin centers
ind = n>50; %// bin centers: greater or smaller than D?
bar(n(ind), y(ind), 1, 'r'); %// for greater: use red
hold on %// keep graph, Or use hold(your_axis_handle, 'on')
bar(n(~ind), y(~ind), 1, 'b'); %// for smaller: use blue
[~, nd] = min(abs(n-D)); %// locate bar around D: it needs the two colors
patch([(n(nd-1)+n(nd))/2 D D (n(nd-1)+n(nd))/2], [0 0 y(nd) y(nd)], 'b');
%// take care of that bar with a suitable patch

enter image description here

Upvotes: 1

lakshmen
lakshmen

Reputation: 29064

First sort X:

X = [32 64 32 12 56 76 65 44 89 87 78 56 96 90 86 95 100 65]; 
sorted_X = sort(X)

sorted_X :

sorted_X =

Columns 1 through 14

12    32    32    44    56    56    64    65    65    76    78    86    87    89

Columns 15 through 18

90    95    96   100

Then split the data based on 50:

idx1 = find(sorted_X<=50,1,'last');
A = sorted_X(1:idx1);
B = sorted_X(idx1+1:end);

Display it as two different histograms.

hist(A);
hold on;
hist(B); 
h = findobj(gca,’Type’,’patch’);
display(h) 
set(h(1),’FaceColor’,’g’,’EdgeColor’,’k’);
set(h(2),’FaceColor’,’r’,’EdgeColor’,’k’);

Upvotes: 0

Iv&#225;n
Iv&#225;n

Reputation: 410

X = [32 64 32 12 56 76 65 44 89 87 78 56 96 90 86 95 100 65];

then you create an histogram, but you are only going to use this to get the numbers of bins, the numbers of elements and positions:

[N,XX]=hist(X);
close all

and finally here is the code where you use the Number of elements (N) and the position (XX) of the previous hist and color them

figure;
hold on;
width=8;
for i=1:length(N)
    h = bar(XX(i), N(i),8);
    if  XX(i)>50
        col = 'r';
    else
        col = 'b';
    end
    set(h, 'FaceColor', col)
end

here you can consider using more than one if and then you can set multiple colors

cheers

Upvotes: 0

Related Questions