Hello, I have a graph with dates as X axis (datetime variables) I'm trying to stretch a rectangle over certain dates (I have the dates stored in a vector), but the problem is that the X axis is datetime and the Y axis is doubles, so MATLAB throws an error. How can I fix this?
for I = 1:1:length(main_idleDateMat(:,1))
startX = main_idleDateMat(I,1);
endX = main_idleDateMat(I,2);
rectangle('Position', [startX idleVecStartHeights(I)-80 (endX - startX) 160]);
end

 채택된 답변

dpb
dpb 2018년 9월 23일
편집: dpb 2018년 9월 24일

1 개 추천

Ayup, "no can do" it seems...another place TMW either hasn't yet got a round tuit or didn't think it needed to add an overloaded plotting function to take care of the new class object.
All is not lost, however, but it's a regression, indeed. :(
You'll have to revert to the venerable datenum form to plot to subsequently use rectangle or draw the lines directly with plot or line. If you do the former, then will have to also use datetick to format the x-axis as date. All in all, the direct-drawing option may turn out "more better".
ADDENDUM
Use patch. You'll have to provide X,Y vectors to outline the four corners, but it an aliased version has been created that is datetime-aware so TMW has, to their credit, done the most fundamental routine.
Mayhaps they'll eventually get to the rest...

댓글 수: 3

dpb
dpb 2018년 9월 24일
[Answer moved to Comment -- dpb]
Thank you! Using plot worked!
dpb
dpb 2018년 9월 24일
편집: dpb 2018년 9월 24일
Yeah, the overloaded plot functions know what to do with the datetime or timeseries axes; it's still a work in progress for some of the other specialty routines.
Not clear whether they "just haven't got there yet" or nobody's really thought about such and have simply overlooked the other functions. Probably worth enhancement request/feature shortage/quality of implementation/bug report depending on one's point of view of how to judge the failure.
Avi Michaely
Avi Michaely 2018년 9월 24일
Do you know if I can fill the rectangle somehow?

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

추가 답변 (3개)

Ian
Ian 2020년 4월 25일
편집: Ian 2020년 4월 25일

1 개 추천

There's a nice solution to drawing a semi-transparent colored rectangle over a plot at https://stackoverflow.com/questions/45266078/how-to-draw-a-colored-rectangle-on-a-plot-when-x-axis-is-time
Alternately, you can use area(...) ,setting 'basevalue' to define the bottom of the rectangle:
area([dates(1),dates(2)],[.4,.4],'facecolor',[.8,1,.8], ...
'facealpha',.5,'edgecolor','none', 'basevalue',-.2);
will draw a rectangle with x values between dates(1) and dates(2), and y values between -.2 (basevalue) and .4 .
Stephen23
Stephen23 2025년 6월 30일
편집: Stephen23 2025년 6월 30일
"How can I fix this?"
Use RULER2NUM, which converts from the ruler values (e.g. DATETIME) to numeric, correctly accounting for the ruler starting value:
ax = axes();
t = datetime(2015,1,1:10);
y = [0.2,0.3,0.5,0.2,0.8,0.2,0.3,0.1,0.3,0.4];
plot(ax, t,y,'-o')
x = ruler2num(t,ax.XAxis);
rectangle(ax, 'Position',[x(4),y(4),diff(x(4:5)),diff(y(4:5))], 'Curvature',[0.5,0.6])
Do not use DATENUM or other deprecated functions:
Laurent
Laurent 2025년 6월 30일
In case somebody still wants to use rectangle, it seems rectangle considers the origin as the low axis limit and the width in number of days (as datetime goes). Thus you have to work with your (rectangle) coordinates as difference from the low time axis limit. I tried plotting a month of data with the time being on x-axis and this works (at least for me):
% Defines dummy time series and plots
time = datetime( [2025 5 3] ) : 1/24 : datetime( [2025 5 28] );
data = rand( size( time ) );
plot( time, data, '.' ); XLim = xlim;
% Draws rectangle from May 15 to May 20 and 0.1 to 0.9
TimPos = datenum( diff( [ XLim(1) datetime( [2025 5 15; 2025 5 20] )' ] ) );
rectangle( 'Position', [ TimPos(1) 0.1 TimPos(2) 0.8 ] )
Be carefull: if you resize using zoom and want to redraw a rectangle, it is the original axis size that works (do not redo an xlim after zooming to determine the new TimPos).

카테고리

도움말 센터File Exchange에서 Dates and Time에 대해 자세히 알아보기

태그

질문:

2018년 9월 23일

편집:

2025년 6월 30일

Community Treasure Hunt

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

Start Hunting!

Translated by