Creating transparent rectangles when x values are times with dates

36 views (last 30 days)
I understand how to use the patch function to create a shaded transparent rectangle when the x and y values are just numbers. For example, the code
plot([1 2],[2 1])
x = [1.25 1.5 1.5 1.25];
y = [1 1 1.75 1.75];
p=patch(x,y,'r');
set(p,'FaceAlpha',0.5);
creates a graph with the plotted line and a transparent red rectangle. My actual plot has the x values (which are a time and date) exported from excel, and then converted to matlab date and time by using datetime and stored in the vector Time. After plotting my data, I tried to do something like this to add the shaded rectangle:
x = [Time(1) Time(2) Time(2) Time(1)];
y = [30 30 35 35];
p=patch(x,y,'r');
set(p,'FaceAlpha',0.5);
This gives me the error: "Error using patch. Vectors must be the same length." The vectors x and y are both length 4, so I don't understand why I get this error. Since it worked in the simple example, I am assuming it has something to do with the x values being in the datetime form.
  5 Comments
James
James on 18 Jan 2017
Edited: James on 18 Jan 2017
Digging some into the source code for stairs, it looks like there's an undocumented function to do this: matlab.graphics.internal.makeNumeric.
[XData, YData] = matlab.graphics.internal.makeNumeric(axis_handle, XData, YData);
Like all undocumented/internal functionality, your mileage may vary and it's subject to change at any time.

Sign in to comment.

Answers (2)

James Uber
James Uber on 20 Jan 2018
I had the same problem using patch. fill() has no such limitation with date time axes, so perhaps that will work for you as well.

Jan
Jan on 18 Jan 2017
Please try to convert the time to a numerical format:
TimeNum = datenum(Time);
Or create it directly with x2mdate
TimeNum = x2mdate(xlsread('timesheet.xlsx', sheet, 'E:E'));
Then plotting should work. To get rid of the ugly axis lables, use datetick.

Community Treasure Hunt

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

Start Hunting!