Skip to content

Commit 9a4a3d9

Browse files
Merge pull request #371 from plotly/fix_issues_improvements_stem3
fix issues with stem3 for data-distribution
2 parents 7a060e9 + f0873ac commit 9a4a3d9

File tree

2 files changed

+257
-71
lines changed

2 files changed

+257
-71
lines changed
+256-69
Original file line numberDiff line numberDiff line change
@@ -1,97 +1,284 @@
1-
function obj = updateStem(obj,dataIndex)
1+
function obj = updateStem3(obj,dataIndex)
22

3-
%------------------------------------------------------------------------%
3+
%-------------------------------------------------------------------------%
44

5-
%-update line-%
6-
updateLineseries(obj,dataIndex);
7-
stem_temp_data = obj.data{dataIndex};
8-
isstem3d = obj.PlotOptions.is3d;
5+
%-AXIS INDEX-%
6+
axIndex = obj.getAxisIndex(obj.State.Plot(dataIndex).AssociatedAxis);
97

10-
%------------------------------------------------------------------------%
8+
%-PLOT DATA STRUCTURE- %
9+
data = get(obj.State.Plot(dataIndex).Handle);
1110

12-
%-scatter mode-%
13-
stem_temp_data.mode = 'lines+markers';
11+
%-CHECK FOR MULTIPLE AXES-%
12+
[xsource, ysource] = findSourceAxis(obj,axIndex);
1413

15-
%------------------------------------------------------------------------%
14+
%------------------------------------------------------------------------%
1615

17-
%-allocated space for extended data-%
18-
xdata_extended = zeros(1,3*length(stem_temp_data.x));
19-
ydata_extended = zeros(1,3*length(stem_temp_data.y));
16+
%-get coordenate x,y,z data-%
17+
xdata = data.XData;
18+
ydata = data.YData;
19+
zdata = data.ZData;
20+
npoints = length(xdata);
2021

21-
if isstem3d
22-
zdata_extended = zeros(1,3*length(stem_temp_data.z));
23-
end
22+
%------------------------------------------------------------------------%
2423

25-
%-format x data-%
26-
m = 1;
27-
for n = 1:length(stem_temp_data.x)
28-
xdata_extended(m) = stem_temp_data.x(n);
29-
xdata_extended(m+1) = stem_temp_data.x(n);
24+
%-check if stem3-%
25+
isstem3 = ~isempty(zdata);
26+
27+
%------------------------------------------------------------------------%
28+
29+
%-SCENE-%
30+
if isstem3
31+
eval(['scene = obj.layout.scene' num2str(xsource) ';']);
32+
else
33+
eval(['xaxis = obj.layout.xaxis' num2str(xsource) ';']);
34+
eval(['yaxis = obj.layout.yaxis' num2str(xsource) ';']);
35+
end
36+
37+
%-------------------------------------------------------------------------%
38+
39+
%-scatter3d scene-%
40+
if isstem3
41+
stem_data.scene = sprintf('scene%d', xsource);
42+
else
43+
stem_data.xaxis = sprintf('x%d', xsource);
44+
stem_data.yaxis = sprintf('y%d', xsource);
45+
end
46+
47+
%------------------------------------------------------------------------%
48+
49+
%-scatter3d type-%
50+
if isstem3
51+
stem_data.type = 'scatter3d';
52+
else
53+
stem_data.type = 'scatter';
54+
end
55+
56+
%-------------------------------------------------------------------------%
57+
58+
%-scatter3d visible-%
59+
stem_data.visible = strcmp(data.Visible,'on');
60+
61+
%-------------------------------------------------------------------------%
62+
63+
%-scatter3d name-%
64+
stem_data.name = data.DisplayName;
65+
66+
%------------------------------------------------------------------------%
67+
68+
%-scatter mode-%
69+
stem_data.mode = 'lines+markers';
70+
71+
%------------------------------------------------------------------------%
72+
73+
%-allocated space for extended data-%
74+
xdata_extended = zeros(3*npoints, 1);
75+
ydata_extended = zeros(3*npoints, 1);
76+
77+
if isstem3
78+
zdata_extended = zeros(3*npoints, 1);
79+
end
80+
81+
%-format data-%
82+
m = 1;
83+
for n = 1:npoints
84+
%-x data-%
85+
xdata_extended(m) = xdata(n);
86+
xdata_extended(m+1) = xdata(n);
3087
xdata_extended(m+2) = nan;
31-
m = m + 3;
32-
end
3388

34-
%-format y data-%
35-
m = 1;
36-
for n = 1:length(stem_temp_data.y)
89+
%-y data-%
3790
ydata_extended(m) = 0;
38-
39-
if isstem3d
40-
ydata_extended(m) = stem_temp_data.y(n);
91+
if isstem3
92+
ydata_extended(m) = ydata(n);
4193
end
42-
43-
ydata_extended(m+1) = stem_temp_data.y(n);
94+
ydata_extended(m+1) = ydata(n);
4495
ydata_extended(m+2) = nan;
96+
97+
%-z data-%
98+
if isstem3
99+
zdata_extended(m) = 0;
100+
zdata_extended(m+1) = zdata(n);
101+
zdata_extended(m+2) = nan;
102+
end
103+
45104
m = m + 3;
46-
end
47-
48-
%-format z data-%
49-
if isstem3d
50-
m = 1;
51-
for n = 1:length(stem_temp_data.z)
52-
zdata_extended(m) = 0;
53-
zdata_extended(m+1) = stem_temp_data.z(n);
54-
zdata_extended(m+2) = nan;
55-
m = m + 3;
105+
end
106+
107+
%------------------------------------------------------------------------%
108+
109+
%-scatter3d line-%
110+
stem_data.line = extractLineLine(data);
111+
112+
%-------------------------------------------------------------------------%
113+
114+
%-scatter3d marker-%
115+
stem_data.marker = extractLineMarker(data);
116+
117+
%-------------------------------------------------------------------------%
118+
119+
if isstem3
120+
121+
%-fix marker symbol-%
122+
symbol = stem_data.marker.symbol;
123+
124+
if strcmpi(symbol, 'asterisk-open') || strcmpi(symbol, 'cross-thin-open')
125+
stem_data.marker.symbol = 'cross';
126+
end
127+
128+
stem_data.marker.size = stem_data.marker.size * 0.6;
129+
130+
%-fix dash line-%
131+
dash = stem_data.line.dash;
132+
133+
if strcmpi(dash, 'dash')
134+
stem_data.line.dash = 'dot';
135+
end
136+
end
137+
138+
%-------------------------------------------------------------------------%
139+
140+
%-hide every other marker-%
141+
markercolor = cell(3*npoints,1);
142+
linecolor = cell(3*npoints,1);
143+
hidecolor = 'rgba(0,0,0,0)';
144+
145+
markercolor(1:3:3*npoints) = {hidecolor};
146+
markercolor(2:3:3*npoints) = {stem_data.marker.color};
147+
markercolor(3:3:3*npoints) = {hidecolor};
148+
149+
linecolor(1:3:3*npoints) = {hidecolor};
150+
linecolor(2:3:3*npoints) = {stem_data.marker.line.color};
151+
linecolor(3:3:3*npoints) = {hidecolor};
152+
153+
%-add new marker/line colors-%
154+
stem_data.marker.color = markercolor;
155+
stem_data.marker.line.color = linecolor;
156+
157+
stem_data.marker.line.width = stem_data.marker.line.width * 2;
158+
stem_data.line.width = stem_data.line.width * 2;
159+
160+
%------------------------------------------------------------------------%
161+
162+
%-set x y z data-%
163+
stem_data.x = xdata_extended;
164+
stem_data.y = ydata_extended;
165+
166+
if isstem3
167+
stem_data.z = zdata_extended;
168+
end
169+
170+
%------------------------------------------------------------------------%
171+
172+
%-set plotly data-%
173+
obj.data{dataIndex} = stem_data;
174+
175+
%------------------------------------------------------------------------%
176+
177+
%-SETTING SCENE-%
178+
179+
if isstem3
180+
%-aspect ratio-%
181+
asr = obj.PlotOptions.AspectRatio;
182+
183+
if ~isempty(asr)
184+
if ischar(asr)
185+
scene.aspectmode = asr;
186+
elseif isvector(asr) && length(asr) == 3
187+
xar = asr(1);
188+
yar = asr(2);
189+
zar = asr(3);
190+
end
191+
else
192+
193+
%-define as default-%
194+
xar = max(xdata(:));
195+
yar = max(ydata(:));
196+
xyar = max([xar, yar]);
197+
xar = xyar; yar = xyar;
198+
zar = 0.7*max([xar, yar]);
56199
end
57-
end
58200

59-
%-hide every other marker-%
60-
color_temp = cell(1,3*length(stem_temp_data.y));
61-
line_color_temp = cell(1,3*length(stem_temp_data.y));
201+
scene.aspectratio.x = xar;
202+
scene.aspectratio.y = yar;
203+
scene.aspectratio.z = zar;
204+
205+
%---------------------------------------------------------------------%
206+
207+
%-camera eye-%
208+
ey = obj.PlotOptions.CameraEye;
209+
210+
if ~isempty(ey)
211+
if isvector(ey) && length(ey) == 3
212+
scene.camera.eye.x = ey(1);
213+
scene.camera.eye.y = ey(2);
214+
scene.camera.eye.z = ey(3);
215+
end
216+
else
217+
218+
%-define as default-%
219+
xey = - xar; if xey>0 xfac = 0.2; else xfac = -0.2; end
220+
yey = - yar; if yey>0 yfac = -0.2; else yfac = 0.2; end
221+
if zar>0 zfac = 0.2; else zfac = -0.2; end
222+
223+
scene.camera.eye.x = xey + xfac*xey;
224+
scene.camera.eye.y = yey + yfac*yey;
225+
scene.camera.eye.z = zar + zfac*zar;
226+
end
227+
228+
%---------------------------------------------------------------------%
229+
230+
%-zerolines hidded-%
231+
scene.xaxis.zeroline = false;
232+
scene.yaxis.zeroline = false;
233+
scene.zaxis.zeroline = false;
234+
235+
scene.xaxis.linecolor = 'rgba(0,0,0,0.8)';
236+
scene.yaxis.linecolor = 'rgba(0,0,0,0.8)';
237+
scene.zaxis.linecolor = 'rgba(0,0,0,0.5)';
238+
239+
scene.xaxis.ticklen = 5;
240+
scene.yaxis.ticklen = 5;
241+
scene.zaxis.ticklen = 5;
242+
243+
scene.xaxis.tickcolor = 'rgba(0,0,0,0.8)';
244+
scene.yaxis.tickcolor = 'rgba(0,0,0,0.8)';
245+
scene.zaxis.tickcolor = 'rgba(0,0,0,0.8)';
246+
247+
scene.xaxis.range = data.Parent.XLim;
248+
scene.yaxis.range = data.Parent.YLim;
249+
scene.zaxis.range = data.Parent.ZLim;
62250

63-
for n = 1:3:length(color_temp)
64-
color_temp{n} = 'rgba(0,0,0,0)';
65-
color_temp{n+1} = stem_temp_data.marker.color;
66-
color_temp{n+2} = 'rgba(0,0,0,0)';
67-
line_color_temp{n} = 'rgba(0,0,0,0)';
68-
line_color_temp{n+1} = stem_temp_data.marker.line.color;
69-
line_color_temp{n+2} = 'rgba(0,0,0,0)';
70-
end
251+
scene.xaxis.tickvals = data.Parent.XTick;
252+
scene.yaxis.tickvals = data.Parent.YTick;
253+
scene.zaxis.tickvals = data.Parent.ZTick;
71254

72-
% add new marker/line colors
73-
stem_temp_data.marker.color = color_temp;
74-
stem_temp_data.marker.line.color = line_color_temp;
255+
scene.xaxis.title = data.Parent.XLabel.String;
256+
scene.yaxis.title = data.Parent.YLabel.String;
257+
scene.zaxis.title = data.Parent.ZLabel.String;
75258

76-
%------------------------------------------------------------------------%
259+
%-update scene-%
260+
obj.layout = setfield(obj.layout, sprintf('scene%d', xsource), scene);
77261

78-
stem_temp_data.x = xdata_extended;
79-
stem_temp_data.y = ydata_extended;
262+
else
263+
yaxis.zeroline = true;
80264

81-
if isstem3d
82-
stem_temp_data.z = zdata_extended;
83-
end
265+
xaxis.linecolor = 'rgba(0,0,0,0.4)';
266+
yaxis.linecolor = 'rgba(0,0,0,0.4)';
84267

85-
%------------------------------------------------------------------------%
268+
xaxis.tickcolor = 'rgba(0,0,0,0.4)';
269+
yaxis.tickcolor = 'rgba(0,0,0,0.4)';
86270

87-
obj.data{dataIndex} = stem_temp_data;
271+
xaxis.tickvals = data.Parent.XTick;
272+
yaxis.tickvals = data.Parent.YTick;
88273

89-
%------------------------------------------------------------------------%
274+
xaxis.title = data.Parent.XLabel.String;
275+
yaxis.title = data.Parent.YLabel.String;
90276

91-
%-put y-zeroline-%
92-
[~, ysource] = findSourceAxis(obj,dataIndex);
93-
eval(['obj.layout.yaxis' num2str(ysource) '.zeroline = true;']);
277+
%-update axis-%
278+
obj.layout = setfield(obj.layout, sprintf('xaxis%d', xsource), xaxis);
279+
obj.layout = setfield(obj.layout, sprintf('yaxis%d', ysource), yaxis);
280+
end
94281

95-
%------------------------------------------------------------------------%
282+
%------------------------------------------------------------------------%
96283

97284
end

plotly/plotlyfig_aux/helpers/extractLineMarker.m

+1-2
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
marker.size = 0.4*line_data.MarkerSize;
3232
case 'o'
3333
marksymbol = 'circle';
34-
marker.size = 0.4*line_data.MarkerSize;
3534
case 'x'
3635
marksymbol = 'x-thin-open';
3736
case '+'
@@ -70,7 +69,7 @@
7069
%-------------------------------------------------------------------------%
7170

7271
filledMarkerSet = {'o','square','s','diamond','d',...
73-
'v','^', '<','>','hexagram','pentagram'};
72+
'v','^', '<','>','hexagram','pentagram', '*', '+'};
7473

7574
filledMarker = ismember(line_data.Marker,filledMarkerSet);
7675

0 commit comments

Comments
 (0)