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

Lines changed: 2 additions & 0 deletions
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
Lines changed: 288 additions & 0 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy