Skip to content

Commit 0db6a0f

Browse files
adding slice functionality to matlab_plotly and fix issue #312
1 parent 59dd6a0 commit 0db6a0f

File tree

2 files changed

+290
-0
lines changed

2 files changed

+290
-0
lines changed

plotly/plotlyfig_aux/core/updateData.m

+2
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,8 @@
107107
updateSurf(obj, dataIndex);
108108
elseif ismember('mesh', lower(obj.PlotOptions.TreatAs))
109109
updateMesh(obj, dataIndex);
110+
elseif ismember('slice', lower(obj.PlotOptions.TreatAs))
111+
updateSlice(obj, dataIndex);
110112
else
111113
updateSurfaceplot(obj,dataIndex);
112114
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,288 @@
1+
function obj = updateSlice(obj, dataIndex)
2+
3+
%-------------------------------------------------------------------------%
4+
5+
%-INITIALIZATIONS-%
6+
7+
axIndex = obj.getAxisIndex(obj.State.Plot(dataIndex).AssociatedAxis);
8+
plotData = get(obj.State.Plot(dataIndex).Handle);
9+
axisData = get(plotData.Parent);
10+
figureData = get(obj.State.Figure.Handle);
11+
[xSource, ~] = findSourceAxis(obj,axIndex);
12+
13+
%-update scene-%
14+
updateScene(obj, dataIndex)
15+
16+
%-get trace data-%
17+
xData = plotData.XData;
18+
yData = plotData.YData;
19+
zData = plotData.ZData;
20+
cData = plotData.CData;
21+
22+
xDataSurf = zeros(2*(size(xData)-1));
23+
yDataSurf = zeros(2*(size(xData)-1));
24+
zDataSurf = zeros(2*(size(xData)-1));
25+
cDataSurf = zeros(2*(size(xData)-1));
26+
27+
for n = 1:size(xData,2)-1
28+
n2 = 2*(n-1) + 1;
29+
30+
for m = 1:size(xData,1)-1
31+
m2 = 2*(m-1) + 1;
32+
33+
xDataSurf(m2:m2+1,n2:n2+1) = xData(m:m+1,n:n+1);
34+
yDataSurf(m2:m2+1,n2:n2+1) = yData(m:m+1,n:n+1);
35+
zDataSurf(m2:m2+1,n2:n2+1) = zData(m:m+1,n:n+1);
36+
37+
if strcmp(plotData.FaceColor, 'flat')
38+
cDataSurf(m2:m2+1,n2:n2+1) = ones(2,2)*cData(m,n);
39+
elseif strcmp(plotData.FaceColor, 'interp')
40+
cDataSurf(m2:m2+1,n2:n2+1) = cData(m:m+1,n:n+1);
41+
end
42+
43+
end
44+
end
45+
46+
%-------------------------------------------------------------------------%
47+
48+
%-set trace-%
49+
obj.data{dataIndex}.type = 'surface';
50+
obj.data{dataIndex}.name = plotData.DisplayName;
51+
obj.data{dataIndex}.visible = strcmp(plotData.Visible,'on');
52+
obj.data{dataIndex}.scene = sprintf('scene%d', xSource);
53+
obj.data{dataIndex}.showscale = false;
54+
obj.data{dataIndex}.surfacecolor = cDataSurf;
55+
56+
%-------------------------------------------------------------------------%
57+
58+
%-set trace data-%
59+
obj.data{dataIndex}.x = xDataSurf;
60+
obj.data{dataIndex}.y = yDataSurf;
61+
obj.data{dataIndex}.z = zDataSurf;
62+
63+
%-------------------------------------------------------------------------%
64+
65+
%-update face color-%
66+
updateSurfaceFaceColor(obj, dataIndex, cDataSurf);
67+
68+
%-update edge color-%
69+
if isnumeric(plotData.EdgeColor)
70+
updateSurfaceEdgeColor(obj, dataIndex);
71+
end
72+
73+
%-------------------------------------------------------------------------%
74+
end
75+
76+
function updateScene(obj, dataIndex)
77+
78+
%-------------------------------------------------------------------------%
79+
80+
%-INITIALIZATIONS-%
81+
axIndex = obj.getAxisIndex(obj.State.Plot(dataIndex).AssociatedAxis);
82+
plotData = get(obj.State.Plot(dataIndex).Handle);
83+
axisData = get(plotData.Parent);
84+
[xSource, ~] = findSourceAxis(obj, axIndex);
85+
scene = eval( sprintf('obj.layout.scene%d', xSource) );
86+
87+
aspectRatio = axisData.PlotBoxAspectRatio;
88+
cameraPosition = axisData.CameraPosition;
89+
dataAspectRatio = axisData.DataAspectRatio;
90+
cameraUpVector = axisData.CameraUpVector;
91+
cameraEye = cameraPosition./dataAspectRatio;
92+
normFac = 0.625*abs(min(cameraEye));
93+
94+
%-------------------------------------------------------------------------%
95+
96+
%-aspect ratio-%
97+
scene.aspectratio.x = 1.15*aspectRatio(1);
98+
scene.aspectratio.y = 1.0*aspectRatio(2);
99+
scene.aspectratio.z = 0.9*aspectRatio(3);
100+
101+
%-camera eye-%
102+
scene.camera.eye.x = cameraEye(1) / normFac;
103+
scene.camera.eye.y = cameraEye(2) / normFac;
104+
scene.camera.eye.z = cameraEye(3) / normFac;
105+
106+
%-camera up-%
107+
scene.camera.up.x = cameraUpVector(1);
108+
scene.camera.up.y = cameraUpVector(2);
109+
scene.camera.up.z = cameraUpVector(3);
110+
111+
%-camera projection-%
112+
% scene.camera.projection.type = axisData.Projection;
113+
114+
%-------------------------------------------------------------------------%
115+
116+
%-scene axis configuration-%
117+
scene.xaxis.range = axisData.XLim;
118+
scene.yaxis.range = axisData.YLim;
119+
scene.zaxis.range = axisData.ZLim;
120+
121+
scene.xaxis.zeroline = false;
122+
scene.yaxis.zeroline = false;
123+
scene.zaxis.zeroline = false;
124+
125+
scene.xaxis.showline = true;
126+
scene.yaxis.showline = true;
127+
scene.zaxis.showline = true;
128+
129+
scene.xaxis.ticklabelposition = 'outside';
130+
scene.yaxis.ticklabelposition = 'outside';
131+
scene.zaxis.ticklabelposition = 'outside';
132+
133+
scene.xaxis.title = axisData.XLabel.String;
134+
scene.yaxis.title = axisData.YLabel.String;
135+
scene.zaxis.title = axisData.ZLabel.String;
136+
137+
%-tick labels-%
138+
scene.xaxis.tickvals = axisData.XTick;
139+
scene.xaxis.ticktext = axisData.XTickLabel;
140+
scene.yaxis.tickvals = axisData.YTick;
141+
scene.yaxis.ticktext = axisData.YTickLabel;
142+
scene.zaxis.tickvals = axisData.ZTick;
143+
scene.zaxis.ticktext = axisData.ZTickLabel;
144+
145+
scene.xaxis.tickcolor = 'rgba(0,0,0,1)';
146+
scene.yaxis.tickcolor = 'rgba(0,0,0,1)';
147+
scene.zaxis.tickcolor = 'rgba(0,0,0,1)';
148+
scene.xaxis.tickfont.size = axisData.FontSize;
149+
scene.yaxis.tickfont.size = axisData.FontSize;
150+
scene.zaxis.tickfont.size = axisData.FontSize;
151+
scene.xaxis.tickfont.family = matlab2plotlyfont(axisData.FontName);
152+
scene.yaxis.tickfont.family = matlab2plotlyfont(axisData.FontName);
153+
scene.zaxis.tickfont.family = matlab2plotlyfont(axisData.FontName);
154+
155+
%-grid-%
156+
if strcmp(axisData.XGrid, 'off'), scene.xaxis.showgrid = false; end
157+
if strcmp(axisData.YGrid, 'off'), scene.yaxis.showgrid = false; end
158+
if strcmp(axisData.ZGrid, 'off'), scene.zaxis.showgrid = false; end
159+
160+
%-------------------------------------------------------------------------%
161+
162+
%-SET SCENE TO LAYOUT-%
163+
obj.layout = setfield(obj.layout, sprintf('scene%d', xSource), scene);
164+
165+
%-------------------------------------------------------------------------%
166+
end
167+
168+
function updateSurfaceEdgeColor(obj, dataIndex)
169+
170+
%-------------------------------------------------------------------------%
171+
172+
%-INITIALIZATIONS-%
173+
174+
axIndex = obj.getAxisIndex(obj.State.Plot(dataIndex).AssociatedAxis);
175+
plotData = get(obj.State.Plot(dataIndex).Handle);
176+
axisData = get(plotData.Parent);
177+
178+
xData = plotData.XData;
179+
yData = plotData.YData;
180+
zData = plotData.ZData;
181+
cData = plotData.CData;
182+
edgeColor = plotData.EdgeColor;
183+
cData = plotData.CData;
184+
cLim = axisData.CLim;
185+
colorMap = axisData.Colormap;
186+
187+
xConst = ( xData(:) - min(xData(:)) ) <= 1e-6;
188+
yConst = ( yData(:) - min(yData(:)) ) <= 1e-6;
189+
190+
%-------------------------------------------------------------------------%
191+
192+
%-edge lines in x direction-%
193+
xContourSize = mean(diff(xData(1,:)));
194+
xContourStard = min(xData(1,:));
195+
xContourEnd = max(xData(1,:));
196+
197+
obj.data{dataIndex}.contours.x.show = true;
198+
obj.data{dataIndex}.contours.x.start = xContourStard;
199+
obj.data{dataIndex}.contours.x.end = xContourEnd;
200+
obj.data{dataIndex}.contours.x.size = xContourSize;
201+
202+
%-edge lines in y direction-%
203+
yContourSize = mean(diff(yData(:,1)));
204+
yContourStard = min(yData(:,1));
205+
yContourEnd = max(yData(:,1));
206+
207+
obj.data{dataIndex}.contours.y.show = true;
208+
obj.data{dataIndex}.contours.y.start = yContourStard;
209+
obj.data{dataIndex}.contours.y.end = yContourEnd;
210+
obj.data{dataIndex}.contours.y.size = yContourSize;
211+
212+
%-edge lines in z direction-%
213+
214+
if all(xConst) || all(yConst)
215+
zContourSize = mean(diff(zData(1,:)));
216+
zContourStard = min(zData(1,:));
217+
zContourEnd = max(zData(1,:));
218+
219+
obj.data{dataIndex}.contours.z.show = true;
220+
obj.data{dataIndex}.contours.z.start = zContourStard;
221+
obj.data{dataIndex}.contours.z.end = zContourEnd;
222+
obj.data{dataIndex}.contours.z.size = zContourSize;
223+
end
224+
225+
%-------------------------------------------------------------------------%
226+
227+
%-coloring-%
228+
numColor = 255 * edgeColor;
229+
stringColor = getStringColor(numColor);
230+
231+
obj.data{dataIndex}.contours.x.color = stringColor;
232+
obj.data{dataIndex}.contours.y.color = stringColor;
233+
obj.data{dataIndex}.contours.z.color = stringColor;
234+
235+
%-------------------------------------------------------------------------%
236+
end
237+
238+
function updateSurfaceFaceColor(obj, dataIndex, surfaceColor)
239+
240+
%-------------------------------------------------------------------------%
241+
242+
%-INITIALIZATIONS-%
243+
244+
axIndex = obj.getAxisIndex(obj.State.Plot(dataIndex).AssociatedAxis);
245+
plotData = get(obj.State.Plot(dataIndex).Handle);
246+
axisData = get(plotData.Parent);
247+
248+
faceColor = plotData.FaceColor;
249+
cLim = axisData.CLim;
250+
colorMap = axisData.Colormap;
251+
252+
obj.data{dataIndex}.cauto = false;
253+
obj.data{dataIndex}.autocolorscale = false;
254+
255+
%-------------------------------------------------------------------------%
256+
257+
if isnumeric(faceColor)
258+
numColor = 255 * faceColor;
259+
stringColor = getStringColor(numColor);
260+
261+
colorScale{1} = {0, stringColor};
262+
colorScale{2} = {1, stringColor};
263+
obj.data{dataIndex}.colorscale = colorScale;
264+
265+
elseif ismember(faceColor, {'flat', 'interp'})
266+
267+
nColors = size(colorMap, 1);
268+
269+
for c = 1:nColors
270+
stringColor = getStringColor(255*colorMap(c,:));
271+
colorScale{c} = {(c-1)/(nColors-1), stringColor};
272+
end
273+
274+
obj.data{dataIndex}.cmin = cLim(1);
275+
obj.data{dataIndex}.cmax = cLim(2);
276+
277+
end
278+
279+
obj.data{dataIndex}.surfacecolor = surfaceColor;
280+
obj.data{dataIndex}.colorscale = colorScale;
281+
282+
%-------------------------------------------------------------------------%
283+
end
284+
285+
function stringColor = getStringColor(numColor)
286+
287+
stringColor = sprintf('rgb(%f,%f,%f)', numColor);
288+
end

0 commit comments

Comments
 (0)