changeset 22752:ee34028f63fc stable

datetick.m: Fix unequal spacing of months and years (bug #39727). * datetick.m: For else clauses covering months and years, construct an appropriate datevec entity and then convert that with datenum.
author Rik <rik@octave.org>
date Sat, 12 Nov 2016 15:34:29 -0800
parents e078f5607762
children 708a4fcb7382
files scripts/plot/appearance/datetick.m
diffstat 1 files changed, 16 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/scripts/plot/appearance/datetick.m	Thu Nov 10 20:30:00 2016 -0800
+++ b/scripts/plot/appearance/datetick.m	Sat Nov 12 15:34:29 2016 -0800
@@ -188,6 +188,7 @@
       nticks = (xmax - xmin) / sep + 1;
       xmin *= scl;
       xmax *= scl;
+      ticks = xmin + [0 : nticks - 1] / (nticks - 1) * (xmax - xmin);
     else
       [ymin, mmin, dmin] = datevec (xmin);
       [ymax, mmax, dmax] = datevec (xmax);
@@ -201,19 +202,25 @@
         xmin = sep * floor (xmin / sep);
         xmax = sep * ceil (xmax / sep);
         nticks = (xmax - xmin) / sep + 1;
+        ticks = xmin + [0 : nticks - 1] / (nticks - 1) * (xmax - xmin);
       elseif (maxyear - minyear < N)
-        sep = __calc_tick_sep__ (minmonth , maxmonth);
-        xmin = datenum (ymin, sep * floor (minmonth / sep), 1);
-        xmax = datenum (ymax, sep * ceil (maxmonth / sep), 1);
-        nticks = ceil (maxmonth / sep) - floor (minmonth / sep) + 1;
+        sep = __calc_tick_sep__ (minmonth, maxmonth);
+        minyear = floor (minyear);
+        minmonth = sep * floor (minmonth / sep);
+        minmonth = ifelse (minmonth == 0, 1, minmonth);
+        maxmonth = sep * ceil (maxmonth / sep);
+        rangemonth = (minmonth:sep:maxmonth)';
+        ticks = datenum ([repmat(minyear, size(rangemonth)), ...
+                          rangemonth, ...
+                          ones(size (rangemonth))]);
       else
-        sep = __calc_tick_sep__ (minyear , maxyear);
-        xmin = datenum (sep * floor (minyear / sep), 1, 1);
-        xmax = datenum (sep * ceil (maxyear / sep), 1, 1);
-        nticks = ceil (maxyear / sep) - floor (minyear / sep) + 1;
+        sep = __calc_tick_sep__ (minyear, maxyear);
+        minyear = sep * floor (minyear / sep);
+        maxyear = sep * ceil (maxyear / sep);
+        rangeyear = (minyear:sep:maxyear)';
+        ticks = datenum ([rangeyear, ones(rows(rangeyear),2)]);
       endif
     endif
-    ticks = xmin + [0 : nticks - 1] / (nticks - 1) * (xmax - xmin);
   endif
 
   if (isempty (form))