How can I plot this figure?

조회 수: 8 (최근 30일)
SM
SM 2022년 4월 11일
답변: Voss 2022년 4월 16일
X=[1,2,3,4,5,6,7,8,9,10]
Y=['d=1','d=3','d=2','d=2','d=3','d=1','d=2','d=2','d=1','d=3']
The outcome will be similar to this figure.
  댓글 수: 4
Image Analyst
Image Analyst 2022년 4월 11일
편집: Image Analyst 2022년 4월 11일
How are you determining the width of the gray and black strips? Then are you just using repmat() to replicate some row vector vertically to get your vertically striped image?
X=[1,2,3,4,5,6,7,8,9,10]; %days
Y1=[1,0,0,0,1,0,0,0,1,0]; %d=1 (worker 1)
Y2=[0,0,1,1,0,0,1,1,0,0]; %d=2 (worker 2)
Y3=[0,1,0,0,0,1,0,0,0,1]; %d=3 (worker 3)
y2image = uint8(repmat(128*Y2, [15, 1]));
imshow(y2image)
SM
SM 2022년 4월 16일
I have used the following codes to plot:
Face(1).Colours=[0 0 0]; Face(2).Colours=[0.8500 0.3250 0.0980]; Face(3).Colours=[0.9290 0.6940 0.1250];
Y1=[1,0,0,0,1,0,0,0,1,0]; %d=1 (worker 1)
Y2=[0,0,1,1,0,0,1,1,0,0]; %d=2 (worker 2)
Y3=[0,1,0,0,0,1,0,0,0,1]; %d=3 (worker 3)
Days=10;
i=1;
while i<=Days
if Y1(i)==1
rectangle('Position',[(i-0.5) 0 1 1],'FaceColor',Face(1).Colours,'EdgeColor',Face(1).Colours,'LineWidth',0.5)
axis([0 Days 0 1])
elseif Y2(i)==1
rectangle('Position',[(i-0.5) 0 1 1],'FaceColor',Face(2).Colours,'EdgeColor',Face(2).Colours,'LineWidth',0.5)
axis([0 Days 0 1])
elseif Y3(i)==1
rectangle('Position',[(i-0.5) 0 1 1],'FaceColor',Face(3).Colours,'EdgeColor',Face(3).Colours,'LineWidth',0.5)
axis([0 Days 0 1])
end
i=i+1;
end
The obtained figure is:
To illsutrate, working days={1, 5, 9} have black bar as worker 1 performed duty in those days. Other days can also be exlained accordingly. Now my question is: (1) how can i insert legend for Y1, Y2 and Y3?; (2) Is there any simple and shortcut way to draw it?
Thanks

댓글을 달려면 로그인하십시오.

채택된 답변

Voss
Voss 2022년 4월 16일
You could use create patch objects instead of rectangle objects, and then make a legend from (some of) those patches.
Or you can create patch objects with NaN data (so they don't appear in the axes) in addition to the rectangle objects you already have, one patch for each color, just to be used for the legend:
Face(1).Colours=[0 0 0]; Face(2).Colours=[0.8500 0.3250 0.0980]; Face(3).Colours=[0.9290 0.6940 0.1250];
Y1=[1,0,0,0,1,0,0,0,1,0]; %d=1 (worker 1)
Y2=[0,0,1,1,0,0,1,1,0,0]; %d=2 (worker 2)
Y3=[0,1,0,0,0,1,0,0,0,1]; %d=3 (worker 3)
Days=10;
i=1;
while i<=Days
if Y1(i)==1
rectangle('Position',[(i-0.5) 0 1 1],'FaceColor',Face(1).Colours,'EdgeColor',Face(1).Colours,'LineWidth',0.5)
% axis([0 Days 0 1]);
elseif Y2(i)==1
rectangle('Position',[(i-0.5) 0 1 1],'FaceColor',Face(2).Colours,'EdgeColor',Face(2).Colours,'LineWidth',0.5)
% axis([0 Days 0 1]);
elseif Y3(i)==1
rectangle('Position',[(i-0.5) 0 1 1],'FaceColor',Face(3).Colours,'EdgeColor',Face(3).Colours,'LineWidth',0.5)
% axis([0 Days 0 1]);
end
i=i+1;
end
% (just set the axes limits once, and include the +/- 0.5)
axis([0.5 Days+0.5 0 1]);
% create three patches with NaN data, to be used for making the legend:
p = [patch(NaN,NaN,Face(1).Colours); patch(NaN,NaN,Face(2).Colours); patch(NaN,NaN,Face(3).Colours)];
% make a legend for those three patches
legend(p,{'Y1' 'Y2' 'Y3'}) % (call them what you like)

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Discrete Data Plots에 대해 자세히 알아보기

태그

Community Treasure Hunt

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

Start Hunting!

Translated by