Using Trapz on datetime
Show older comments
Hi, I have this graph with the Power value on the y-axis and the datetime on the x-axis (overall a week is shown). I want to caluculate various areas below the curves and plot these. Up to now, I have used the "fill" function to do so, but in the last graph I need to calculate the area beneath one curve dependent on the area beneath another of the curves.
I don't know how to create that dependency with fill, or how to actually evaluate the integral that the fill function shows.
Now I saw that I could use the trapz function to calculate the integral, but somehow that does not plot a graph when I use it. I do not get an error message, but I don't get a plot either. What can I do?
I have also tried to convert the datetime values to datenum, I thought that might be the problem, but that does not work either!

9 Comments
dpb
on 11 Dec 2021
trapz isn't a plotting routine at all -- it just calculates the area/integral of the waveform it is provided Also NB: from the documentation
"trapz reduces the size of the dimension it operates on to 1, and returns only the final integration value. cumtrapz also returns the intermediate integration values, preserving the size of the dimension it operates on"
Eric Sofen
on 13 Dec 2021
Also, trapz/cumtrapz don't support datetime. You'll want to convert your x data to numeric:
xForInt = x - x(1); % duration
xForInt = hours(xForInt); % double representing hours
cumtrapz(xForInt,y)
dpb
on 13 Dec 2021
Would seem a useful/reasonable enhancement request???
Eric Sofen
on 13 Dec 2021
Yes. I've created an enhancement request for it for us to reason on. The OP needs datetimes as the ordinate values. There are some conceptual issues to be worked out if the values being integrated are datetimes, but that's probably much less common.
dpb
on 13 Dec 2021
"some conceptual issues to be worked out if the values being integrated are datetimes, ..."
Indeed -- I'm not sure what that would be, either, otomh.
I'd think there would be very few issues raised if were to simply restrict it to the integrating variable and not even bother to try to support the other.
Noush
on 15 Dec 2021
dpb
on 15 Dec 2021
" I need to calculate the area beneath one curve dependent on the area beneath another of the curves."
But you've given us no klew at all upon what that dependence is...nor did you attach your data (use paperclip and a .mat file or attach the input file that contains the data) to make it simpler for somebody to try to solve your problem once you do get it defined.
@Eric Sofen converted the datetime variable to a duration by the expedient of subtracting the first time value -- that leaves the elapsed time from the beginning of the trace. The second line simply does return the values of the duration as a double that cumtrapz can integrate over as the ordinate since it has not been updated to handle durations nor datetimes The reason to use cumtrapz is the one I outlined earlier -- it returns the value of the cumulative integral at the input points that is a usable variable for plotting.
However, lacking the definition of just what/how this is to be done, precisely, to satisfy your wishes/needs, the above will be the integral over the entire time trace, not over subset regions within it. To do that, you'll have to define the start and stop times inside the overall time trace and iterate over those intervals to accumulate the integrals individually -- or subtract the total of the overall integral up to the wanted start time for each -- either would amount to the same thing.
You'll need to build a grouping variable by day or whatever section of the day is desired and use it to select the subsections...there are tools built into the timetable object or use findgroups and splitapply or perhaps even groupsummary with a user function could be adapted...
Noush
on 15 Dec 2021
dpb
on 15 Dec 2021
I'm extremely pressed for time at the moment, so don't have time to delve into the guts of the above myself at the moment, but somebody else may come along before I can get back...
However, from your above description, if you have boundaries of these areas defined so that you can use fill to color the areas desired, then perhaps polyshape and its companion area may solve your problem. They, too, will require the time axis variable be treated as a double, but if you have a set of vertices, the above may be more direct route to your goal.
Answers (0)
Categories
Find more on Discrete Data Plots in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!