Skip to content

Commit 9e5bdbf

Browse files
Merge pull request #486 from plotly/support-datetime-duration
Improve support for 'datetime/duration'
2 parents 7c79f04 + c60f544 commit 9e5bdbf

File tree

8 files changed

+44
-61
lines changed

8 files changed

+44
-61
lines changed

plotly/plotlyfig_aux/core/updateData.m

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,8 @@
196196
% check for xaxis dates
197197
if strcmpi(xaxis.type, 'date')
198198
obj.data{dataIndex}.x = convertDate(obj.data{dataIndex}.x);
199+
elseif xaxis.type == "duration"
200+
obj.data{dataIndex}.x = convertDuration(obj.data{dataIndex}.x);
199201
end
200202

201203
% check for xaxis categories
@@ -208,6 +210,8 @@
208210
% check for yaxis dates
209211
if strcmpi(yaxis.type, 'date')
210212
obj.data{dataIndex}.y = convertDate(obj.data{dataIndex}.y);
213+
elseif yaxis.type == "duration"
214+
obj.data{dataIndex}.y = convertDuration(obj.data{dataIndex}.y);
211215
end
212216

213217
% check for yaxis categories

plotly/plotlyfig_aux/handlegraphics/updateErrorbar.m

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@
88
plotData = obj.State.Plot(plotIndex).Handle;
99

1010
%-get error data-%
11-
yPositiveDelta = date2NumData(plotData.YPositiveDelta);
12-
yNegativeDelta = date2NumData(plotData.YNegativeDelta);
11+
yPositiveDelta = plotData.YPositiveDelta;
12+
yNegativeDelta = plotData.YNegativeDelta;
1313

14-
xPositiveDelta = date2NumData(plotData.XPositiveDelta);
15-
xNegativeDelta = date2NumData(plotData.XNegativeDelta);
14+
xPositiveDelta = plotData.XPositiveDelta;
15+
xNegativeDelta = plotData.XNegativeDelta;
1616

1717
%-------------------------------------------------------------------------%
1818

@@ -60,3 +60,4 @@
6060
%-------------------------------------------------------------------------%
6161

6262
end
63+

plotly/plotlyfig_aux/handlegraphics/updateHistogram2.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ function updateScene(obj, dataIndex)
168168
ax.showline = true;
169169
ax.showspikes = true;
170170
ax.linecolor = getStringColor(255*axx.Color);
171-
ax.range = eval(sprintf('date2NumData(axisData.%sLim)', axName));
171+
ax.range = eval(sprintf('axisData.%sLim', axName));
172172

173173
%-label-%
174174
label = eval(sprintf('axisData.%sLabel', axName));

plotly/plotlyfig_aux/handlegraphics/updateLineseries.m

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ function updateLineseries(obj, plotIndex)
3434
end
3535

3636
%-get trace data-%
37-
xData = date2NumData(plotData.XData);
38-
yData = date2NumData(plotData.YData);
37+
xData = plotData.XData;
38+
yData = plotData.YData;
3939

4040
if isPolar
4141
rData = sqrt(xData.^2 + yData.^2);
@@ -44,7 +44,7 @@ function updateLineseries(obj, plotIndex)
4444
end
4545

4646
if isPlot3D
47-
zData = date2NumData(plotData.ZData);
47+
zData = plotData.ZData;
4848
end
4949

5050
%-------------------------------------------------------------------------%
@@ -147,9 +147,9 @@ function updateScene(obj, dataIndex)
147147
%-------------------------------------------------------------------------%
148148

149149
%-scene axis configuration-%
150-
scene.xaxis.range = date2NumData(axisData.XLim);
151-
scene.yaxis.range = date2NumData(axisData.YLim);
152-
scene.zaxis.range = date2NumData(axisData.ZLim);
150+
scene.xaxis.range = axisData.XLim;
151+
scene.yaxis.range = axisData.YLim;
152+
scene.zaxis.range = axisData.ZLim;
153153

154154
scene.xaxis.zeroline = false;
155155
scene.yaxis.zeroline = false;

plotly/plotlyfig_aux/handlegraphics/updateScatter.m

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,9 @@ function updateScene(obj, dataIndex)
106106
%-------------------------------------------------------------------------%
107107

108108
%-scene axis configuration-%
109-
scene.xaxis.range = date2NumData(axisData.XLim);
110-
scene.yaxis.range = date2NumData(axisData.YLim);
111-
scene.zaxis.range = date2NumData(axisData.ZLim);
109+
scene.xaxis.range = axisData.XLim;
110+
scene.yaxis.range = axisData.YLim;
111+
scene.zaxis.range = axisData.ZLim;
112112

113113
scene.xaxis.zeroline = false;
114114
scene.yaxis.zeroline = false;

plotly/plotlyfig_aux/handlegraphics/updateStackedplot.m

Lines changed: 8 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,14 @@ function updateStackedplot(obj, plotIndex)
2323

2424
else
2525
if istimetable(sourceTable)
26-
xData = date2NumData(sourceTable.Properties.RowTimes);
26+
xData = sourceTable.Properties.RowTimes;
2727
else
2828
xData = 1:size(sourceTable, 1);
2929
end
3030

3131
for t = 1:nTraces
3232
n = nTraces - t + 1;
33-
yData{t} = date2NumData(sourceTable.(displayVariables{n}));
33+
yData{t} = sourceTable.(displayVariables{n});
3434
end
3535
end
3636

@@ -153,7 +153,7 @@ function updateStackedplotAxis(obj, plotIndex)
153153
axisDomain{nAxis} = min([axisPos(1) sum(axisPos([1,3]))], 1);
154154
axisAnchor{nAxis} = 'y1';
155155

156-
case {'x', 'Y'}
156+
case {'y', 'Y'}
157157
nAxis = length(plotData.AxesProperties);
158158
yPos = linspace(axisPos(2), sum(axisPos([2,4])), nAxis+1);
159159
yOffset = diff(yPos)*0.1; yOffset(1) = 0;
@@ -182,7 +182,7 @@ function updateStackedplotAxis(obj, plotIndex)
182182
%-general-%
183183
ax{a}.domain = axisDomain{a};
184184
ax{a}.anchor = axisAnchor{a};
185-
ax{a}.range = date2NumData(axisLim{a});
185+
ax{a}.range = axisLim{a};
186186

187187
ax{a}.side = 'left';
188188
ax{a}.mirror = false;
@@ -205,14 +205,11 @@ function updateStackedplotAxis(obj, plotIndex)
205205
if isnumeric(axisLim{a})
206206
[tickVals, tickText, expoFormat(a)] = getNumTicks(axisLim{a}, nTicks);
207207

208-
[tickVals, tickText] = rmTicks(ax{a}.range, tickVals, tickText, 's');
209-
[tickVals, tickText] = rmTicks(ax{a}.range, tickVals, tickText, 'e');
210208

211209
elseif isduration(axisLim{a}) || isdatetime(axisLim{a})
212210
[tickVals, tickText] = getDateTicks(axisLim{a}, nTicks);
213211
expoFormat(a) = 0;
214212

215-
[tickVals, tickText] = rmTicks(ax{a}.range, tickVals, tickText, 's');
216213
end
217214

218215
ax{a}.showticklabels = true;
@@ -242,23 +239,23 @@ function updateStackedplotAxis(obj, plotIndex)
242239
function [tickVals, tickText] = getDateTicks(axisLim, nTicks)
243240

244241
%-by year-%
245-
yearLim = year(date2NumData(axisLim));
242+
yearLim = year(axisLim);
246243
isYear = length(unique(yearLim)) > 1;
247244
refYear = [1, 2, 5];
248245

249246
if isYear
250247
yearTick = getTickVals(yearLim, refYear, 1, nTicks);
251248

252249
for n = 1:length(yearTick)
253-
tickVals(n) = datenum(datetime(yearTick(n),1,1,'Format','yy'));
250+
tickVals(n) = datetime(yearTick(n),1,1,'Format','yy');
254251
tickText{n} = num2str(yearTick(n));
255252
end
256253

257254
return;
258255
end
259256

260257
%-by month-%
261-
monthLim = month(date2NumData(axisLim));
258+
monthLim = month(axisLim);
262259
isMonth = length(unique(monthLim)) > 1;
263260

264261
if isMonth
@@ -267,7 +264,7 @@ function updateStackedplotAxis(obj, plotIndex)
267264
end
268265

269266
%-by day-%
270-
dayLim = day(date2NumData(axisLim));
267+
dayLim = day(axisLim);
271268
isDay = length(unique(dayLim)) > 1;
272269
refDay = [0.5, 1];
273270

@@ -282,7 +279,6 @@ function updateStackedplotAxis(obj, plotIndex)
282279
tickText{n} = datestr(tickVals(n), 'mmm dd, HH:MM');
283280
end
284281

285-
tickVals = datenum(tickVals);
286282
return;
287283
end
288284
end
@@ -392,23 +388,3 @@ function updateExponentFormat(obj, expoFormat, xySource, axName)
392388
obj.PlotlyDefaults.anIndex = anIndex;
393389
end
394390
end
395-
396-
function [tickVals, tickText] = rmTicks(axisLim, tickVals, tickText, rmCase)
397-
rangeLim = range(axisLim);
398-
399-
switch rmCase
400-
case 's'
401-
if abs(axisLim(1)-tickVals(1)) < rangeLim * 0.01
402-
tickVals = tickVals(2:end);
403-
tickText = tickText(2:end);
404-
end
405-
406-
case 'e'
407-
if abs(axisLim(end)-tickVals(end)) < rangeLim * 0.01
408-
tickVals = tickVals(1:end-1);
409-
tickText = tickText(1:end-1);
410-
end
411-
412-
end
413-
end
414-

plotly/plotlyfig_aux/helpers/date2NumData.m

Lines changed: 0 additions & 7 deletions
This file was deleted.

plotly/plotlyfig_aux/helpers/extractAxisData.m

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -90,10 +90,6 @@
9090
tickLabels = eval(sprintf('axisData.%sTickLabel', axisName));
9191
tickValues = eval(sprintf('axisData.%sTick', axisName));
9292

93-
if isduration(tickValues) || isdatetime(tickValues)
94-
tickValues = datenum(tickValues);
95-
end
96-
9793
%-------------------------------------------------------------------------%
9894

9995
%-there is not tick label case-%
@@ -133,8 +129,23 @@
133129
axis.range = log10(axisLim);
134130
end
135131

136-
elseif isduration(axisLim) || isdatetime(axisLim)
137-
axis.range = datenum(axisLim);
132+
elseif isduration(axisLim)
133+
[temp,type] = convertDuration(axisLim);
134+
if (~isduration(temp)) % duration class has specified .Format
135+
axis.range = temp;
136+
axis.type = 'duration';
137+
axis.title = type;
138+
axis.tickvals = convertDuration(axis.tickvals);
139+
else
140+
nticks = eval(['length(axisData.' axisName 'Tick)-1;']);
141+
delta = 0.1;
142+
axis.range = [-delta nticks+delta];
143+
axis.type = 'duration - specified format';
144+
end
145+
146+
elseif isdatetime(axisLim)
147+
axis.range = axisLim;
148+
axis.type = 'date';
138149

139150
elseif iscategorical(axisLim)
140151
axis.autorange = true;
@@ -289,5 +300,3 @@
289300

290301
%-------------------------------------------------------------------------%
291302
end
292-
293-

0 commit comments

Comments
 (0)