diff --git a/plotly/plotlyfig.m b/plotly/plotlyfig.m index 8a332d92..ee7057d0 100644 --- a/plotly/plotlyfig.m +++ b/plotly/plotlyfig.m @@ -573,10 +573,10 @@ function validate(obj) % get number of nbars for pie3 if strcmpi(obj.PlotOptions.TreatAs, 'pie3') - obj.PlotOptions.nbars = 0; + obj.PlotOptions.nbars{a} = 0; for i = 1:length(plots) if strcmpi(getGraphClass(plots(i)), 'surface') - obj.PlotOptions.nbars = obj.PlotOptions.nbars + 1; + obj.PlotOptions.nbars{a} = obj.PlotOptions.nbars{a} + 1; end end end diff --git a/plotly/plotlyfig_aux/core/updateAnnotation.m b/plotly/plotlyfig_aux/core/updateAnnotation.m index 46e90139..4860eccd 100644 --- a/plotly/plotlyfig_aux/core/updateAnnotation.m +++ b/plotly/plotlyfig_aux/core/updateAnnotation.m @@ -91,15 +91,29 @@ %-------------------------------------------------------------------------% %-text-% -if ~strcmpi(obj.PlotOptions.TreatAs, 'pie3') +if obj.State.Text(anIndex).Title obj.layout.annotations{anIndex}.text = parseString(text_data.String,text_data.Interpreter); - if obj.State.Text(anIndex).Title && isempty(text_data.String) + if isempty(text_data.String) obj.layout.annotations{anIndex}.text = ''; %empty string annotation end else - obj.layout.annotations{anIndex}.text = ''; + if ~strcmpi(obj.PlotOptions.TreatAs, 'pie3') + obj.layout.annotations{anIndex}.text = parseString(text_data.String,text_data.Interpreter); + else + obj.layout.annotations{anIndex}.text = ''; + end end +%-optional code flow-% +% if ~strcmpi(obj.PlotOptions.TreatAs, 'pie3') +% obj.layout.annotations{anIndex}.text = parseString(text_data.String,text_data.Interpreter); +% if obj.State.Text(anIndex).Title && isempty(text_data.String) +% obj.layout.annotations{anIndex}.text = ''; %empty string annotation +% end +% else +% obj.layout.annotations{anIndex}.text = ''; +% end + %-------------------------------------------------------------------------% if obj.State.Text(anIndex).Title diff --git a/plotly/plotlyfig_aux/core/updateAxis.m b/plotly/plotlyfig_aux/core/updateAxis.m index cd41f86f..1aec4ca6 100644 --- a/plotly/plotlyfig_aux/core/updateAxis.m +++ b/plotly/plotlyfig_aux/core/updateAxis.m @@ -96,11 +96,13 @@ %-xaxis domain-% xaxis.domain = min([xo xo + w],1); +scene.domain.x = min([xo xo + w],1); %-------------------------------------------------------------------------% %-yaxis domain-% yaxis.domain = min([yo yo + h],1); +scene.domain.y = min([yo yo + h],1); %-------------------------------------------------------------------------% @@ -135,6 +137,7 @@ % update the layout field (do not overwrite source) if xsource == axIndex obj.layout = setfield(obj.layout,['xaxis' num2str(xsource)],xaxis); + obj.layout = setfield(obj.layout,['scene' num2str(xsource)],scene); else end diff --git a/plotly/plotlyfig_aux/core/updateData.m b/plotly/plotlyfig_aux/core/updateData.m index 1d0c8327..6b0c76ee 100644 --- a/plotly/plotlyfig_aux/core/updateData.m +++ b/plotly/plotlyfig_aux/core/updateData.m @@ -19,6 +19,8 @@ updateLineseries(obj, dataIndex); elseif strcmpi(obj.PlotOptions.TreatAs, 'ezpolar') updateLineseries(obj, dataIndex); + elseif strcmpi(obj.PlotOptions.TreatAs, 'streamtube') + updateStreamtube(obj, dataIndex); end %-update plot based on plot call class-% diff --git a/plotly/plotlyfig_aux/handlegraphics/updateContourProjection.m b/plotly/plotlyfig_aux/handlegraphics/updateContourProjection.m index 6ad5051c..e53bf56c 100644 --- a/plotly/plotlyfig_aux/handlegraphics/updateContourProjection.m +++ b/plotly/plotlyfig_aux/handlegraphics/updateContourProjection.m @@ -10,7 +10,7 @@ axis_data = get(obj.State.Plot(contourIndex).AssociatedAxis); %-PLOT DATA STRUCTURE- % -contour_data = get(obj.State.Plot(contourIndex).Handle) +contour_data = get(obj.State.Plot(contourIndex).Handle); %-CHECK FOR MULTIPLE AXES-% [xsource, ysource] = findSourceAxis(obj,axIndex); @@ -40,68 +40,29 @@ xdata = contour_data.XData; ydata = contour_data.YData; zdata = contour_data.ZData; - -if isvector(zdata) - - %-contour type-% - obj.data{contourIndex}.type = 'contour'; - %-contour x data-% - if ~isvector(x) - obj.data{contourIndex}.xdata = xdata(1,:); - else - obj.data{contourIndex}.xdata = xdata; - end +%-contour type-% +obj.data{contourIndex}.type = 'surface'; - %-contour y data-% - if ~isvector(y) - obj.data{contourIndex}.ydata = ydata'; - else - obj.data{contourIndex}.ydata = ydata'; - end - - %-contour z data-% - obj.data{contourIndex}.z = zdata; - -else - - %-contour type-% - obj.data{contourIndex}.type = 'surface'; - - %-contour x and y data -% [xmesh, ymesh] = meshgrid(xdata, ydata); - obj.data{contourIndex}.x = xdata; - obj.data{contourIndex}.y = ydata; - - %-contour z data-% - obj.data{contourIndex}.z = zdata;%-2*ones(size(zdata)); - - %-setting for contour lines z-direction-% - obj.data{contourIndex}.contours.z.start = contour_data.LevelList(1); - obj.data{contourIndex}.contours.z.end = contour_data.LevelList(end); - obj.data{contourIndex}.contours.z.size = contour_data.LevelStep; - obj.data{contourIndex}.contours.z.show = true; - obj.data{contourIndex}.contours.z.usecolormap = true; - obj.data{contourIndex}.hidesurface = true; - obj.data{contourIndex}.surfacecolor = zdata; - - obj.data{contourIndex}.contours.z.project.x = true; - obj.data{contourIndex}.contours.z.project.y = true; - obj.data{contourIndex}.contours.z.project.z = true; - -end +%-contour x and y data +obj.data{contourIndex}.x = xdata; +obj.data{contourIndex}.y = ydata; -%-------------------------------------------------------------------------% +%-contour z data-% +obj.data{contourIndex}.z = zdata;%-2*ones(size(zdata)); -%-contour x type-% +%-setting for contour lines z-direction-% +obj.data{contourIndex}.contours.z.start = contour_data.LevelList(1); +obj.data{contourIndex}.contours.z.end = contour_data.LevelList(end); +obj.data{contourIndex}.contours.z.size = contour_data.LevelStep; +obj.data{contourIndex}.contours.z.show = true; +obj.data{contourIndex}.contours.z.usecolormap = true; +obj.data{contourIndex}.hidesurface = true; +obj.data{contourIndex}.surfacecolor = zdata; -obj.data{contourIndex}.xtype = 'array'; - -%-------------------------------------------------------------------------% - -%-contour y type-% - -obj.data{contourIndex}.ytype = 'array'; +obj.data{contourIndex}.contours.z.project.x = true; +obj.data{contourIndex}.contours.z.project.y = true; +obj.data{contourIndex}.contours.z.project.z = true; %-------------------------------------------------------------------------% @@ -116,21 +77,6 @@ %-------------------------------------------------------------------------% -%-zauto-% -obj.data{contourIndex}.zauto = false; - -%-------------------------------------------------------------------------% - -%-zmin-% -obj.data{contourIndex}.zmin = axis_data.CLim(1); - -%-------------------------------------------------------------------------% - -%-zmax-% -obj.data{contourIndex}.zmax = axis_data.CLim(2); - -%-------------------------------------------------------------------------% - %-colorscale (ASSUMES PATCH CDATAMAP IS 'SCALED')-% colormap = figure_data.Colormap; @@ -144,69 +90,53 @@ %-contour reverse scale-% obj.data{contourIndex}.reversescale = false; -%-------------------------------------------------------------------------% - -%-autocontour-% -obj.data{contourIndex}.autocontour = false; +%---------------------------------------------------------------------% -%-------------------------------------------------------------------------% +%-aspect ratio-% +ar = obj.PlotOptions.AspectRatio; -%-contour contours-% +if ~isempty(ar) + if ischar(ar) + obj.layout.scene.aspectmode = ar; + elseif isvector(ar) && length(ar) == 3 + xar = ar(1); + yar = ar(2); + zar = ar(3); + end +else -%-coloring-% -switch contour_data.Fill - case 'off' - obj.data{contourIndex}.contours.coloring = 'lines'; - case 'on' - obj.data{contourIndex}.contours.coloring = 'fill'; + %-define as default-% + xar = max(xdata(:)); + yar = max(ydata(:)); + xyar = max([xar, yar]); + zar = 0.6*xyar; end -%-start-% -obj.data{contourIndex}.contours.start = contour_data.TextList(1); +obj.layout.scene.aspectratio.x = xyar; +obj.layout.scene.aspectratio.y = xyar; +obj.layout.scene.aspectratio.z = zar; -%-end-% -obj.data{contourIndex}.contours.end = contour_data.TextList(end); +%---------------------------------------------------------------------% -%-step-% -obj.data{contourIndex}.contours.size = diff(contour_data.TextList(1:2)); +%-camera eye-% +ey = obj.PlotOptions.CameraEye; -%-------------------------------------------------------------------------% - -if(~strcmp(contour_data.LineStyle,'none')) - - %-contour line colour-% - if isnumeric(contour_data.LineColor) - col = 255*contour_data.LineColor; - obj.data{contourIndex}.line.color = ['rgb(' num2str(col(1)) ',' num2str(col(2)) ',' num2str(col(3)) ')']; - else - obj.data{contourIndex}.line.color = 'rgba(0,0,0,0)'; - end - - %-contour line width-% - obj.data{contourIndex}.line.width = contour_data.LineWidth; - - %-contour line dash-% - switch contour_data.LineStyle - case '-' - LineStyle = 'solid'; - case '--' - LineStyle = 'dash'; - case ':' - LineStyle = 'dot'; - case '-.' - LineStyle = 'dashdot'; +if ~isempty(ey) + if isvector(ey) && length(ey) == 3 + obj.layout.scene.camera.eye.x = ey(1); + obj.layout.scene.camera.eye.y = ey(2); + obj.layout.scene.camera.eye.z = ey(3); end - - obj.data{contourIndex}.line.dash = LineStyle; - - %-contour smoothing-% - obj.data{contourIndex}.line.smoothing = 0; - else + + %-define as default-% + xey = - xyar; if xey>0 xfac = -0.2; else xfac = 0.2; end + yey = - xyar; if yey>0 yfac = -0.2; else yfac = 0.2; end + if zar>0 zfac = 0.2; else zfac = -0.2; end - %-contours showlines-% - obj.data{contourIndex}.contours.showlines = false; - + obj.layout.scene.camera.eye.x = xey + xfac*xey; + obj.layout.scene.camera.eye.y = yey + yfac*yey; + obj.layout.scene.camera.eye.z = zar + zfac*zar; end %-------------------------------------------------------------------------% diff --git a/plotly/plotlyfig_aux/handlegraphics/updatePie3.m b/plotly/plotlyfig_aux/handlegraphics/updatePie3.m index 60d94f50..c5ad57c8 100644 --- a/plotly/plotlyfig_aux/handlegraphics/updatePie3.m +++ b/plotly/plotlyfig_aux/handlegraphics/updatePie3.m @@ -6,34 +6,37 @@ function updatePie3(obj,plotIndex) else updateSurfacePie3(obj, plotIndex); end - + %-hide axis-x-% - obj.layout.scene.xaxis.title = ''; - obj.layout.scene.xaxis.autotick = false; - obj.layout.scene.xaxis.zeroline = false; - obj.layout.scene.xaxis.showline = false; - obj.layout.scene.xaxis.showticklabels = false; - obj.layout.scene.xaxis.showgrid = false; + obj.PlotOptions.scene.xaxis.title = ''; + obj.PlotOptions.scene.xaxis.autotick = false; + obj.PlotOptions.scene.xaxis.zeroline = false; + obj.PlotOptions.scene.xaxis.showline = false; + obj.PlotOptions.scene.xaxis.showticklabels = false; + obj.PlotOptions.scene.xaxis.showgrid = false; %-hide axis-y-% - obj.layout.scene.yaxis.title = ''; - obj.layout.scene.yaxis.autotick = false; - obj.layout.scene.yaxis.zeroline = false; - obj.layout.scene.yaxis.showline = false; - obj.layout.scene.yaxis.showticklabels = false; - obj.layout.scene.yaxis.showgrid = false; + obj.PlotOptions.scene.yaxis.title = ''; + obj.PlotOptions.scene.yaxis.autotick = false; + obj.PlotOptions.scene.yaxis.zeroline = false; + obj.PlotOptions.scene.yaxis.showline = false; + obj.PlotOptions.scene.yaxis.showticklabels = false; + obj.PlotOptions.scene.yaxis.showgrid = false; %-hide axis-z-% - obj.layout.scene.zaxis.title = ''; - obj.layout.scene.zaxis.autotick = false; - obj.layout.scene.zaxis.zeroline = false; - obj.layout.scene.zaxis.showline = false; - obj.layout.scene.zaxis.showticklabels = false; - obj.layout.scene.zaxis.showgrid = false; + obj.PlotOptions.scene.zaxis.title = ''; + obj.PlotOptions.scene.zaxis.autotick = false; + obj.PlotOptions.scene.zaxis.zeroline = false; + obj.PlotOptions.scene.zaxis.showline = false; + obj.PlotOptions.scene.zaxis.showticklabels = false; + obj.PlotOptions.scene.zaxis.showgrid = false; %-put text-% obj.data{plotIndex}.hoverinfo = 'text'; obj.data{plotIndex}.hovertext = obj.PlotOptions.perc; + + obj.layout = setfield(obj.layout,['scene' obj.PlotOptions.scene_anchor(end)], obj.PlotOptions.scene); + obj.data{plotIndex}.scene = obj.PlotOptions.scene_anchor; end @@ -42,285 +45,317 @@ function updatePie3(obj,plotIndex) function obj = updatePatchPie3(obj, patchIndex) -%-AXIS INDEX-% -axIndex = obj.getAxisIndex(obj.State.Plot(patchIndex).AssociatedAxis); - -%-PATCH DATA STRUCTURE- % -patch_data = get(obj.State.Plot(patchIndex).Handle); - -%-get the percentage-% -if ~any(nonzeros(patch_data.ZData)) - t1 = atan2(patch_data.YData(2), patch_data.XData(2)); - t2 = atan2(patch_data.YData(end-1), patch_data.XData(end-1)); - - a = rad2deg(t2-t1); - if a < 0 - a = a+360; - end - - obj.PlotOptions.perc = sprintf('%d %%', round(100*a/360)); -end - -%-CHECK FOR MULTIPLE AXES-% -[xsource, ysource] = findSourceAxis(obj,axIndex); - -%-AXIS DATA-% -eval(['xaxis = obj.layout.xaxis' num2str(xsource) ';']); -eval(['yaxis = obj.layout.yaxis' num2str(ysource) ';']); - -%-------------------------------------------------------------------------% - -%-patch xaxis-% -obj.data{patchIndex}.xaxis = ['x' num2str(xsource)]; - -%-------------------------------------------------------------------------% - -%-patch yaxis-% -obj.data{patchIndex}.yaxis = ['y' num2str(ysource)]; - -%-------------------------------------------------------------------------% - -%-patch type-% -obj.data{patchIndex}.type = 'scatter3d'; - -%-------------------------------------------------------------------------% - -%-patch x-% -xdata = patch_data.XData; -if isvector(xdata) - obj.data{patchIndex}.x = [xdata' xdata(1)]; -else - xtemp = reshape(xdata,[],1); - xnew = []; - for n = 1:size(xdata,2) - xnew = [xnew ; xdata(:,n) ; xdata(1,n); NaN]; - end - obj.data{patchIndex}.x = xnew; -end - -%---------------------------------------------------------------------% - -%-patch y-% -ydata = patch_data.YData; -if isvector(ydata) - obj.data{patchIndex}.y = [ydata' ydata(1)]; -else - ytemp = reshape(ydata,[],1); - ynew = []; - for n = 1:size(ydata,2) - ynew = [ynew ; ydata(:,n) ; ydata(1,n); NaN]; - end - obj.data{patchIndex}.y = ynew; -end - -%---------------------------------------------------------------------% - -%-patch z-% -zdata = patch_data.ZData; - -if isvector(ydata) - obj.data{patchIndex}.z = [zdata' zdata(1)]; -else - ztemp = reshape(zdata,[],1); - znew = []; - for n = 1:size(zdata,2) - znew = [znew ; zdata(:,n) ; zdata(1,n); NaN]; - end - obj.data{patchIndex}.z = znew; -end - -%---------------------------------------------------------------------% - -%-patch name-% -if ~isempty(patch_data.DisplayName) - obj.data{patchIndex}.name = patch_data.DisplayName; -else - obj.data{patchIndex}.name = patch_data.DisplayName; -end - -%---------------------------------------------------------------------% + %-AXIS INDEX-% + axIndex = obj.getAxisIndex(obj.State.Plot(patchIndex).AssociatedAxis); + + %-PATCH DATA STRUCTURE- % + patch_data = get(obj.State.Plot(patchIndex).Handle); + + %-get the percentage-% + if ~any(nonzeros(patch_data.ZData)) + t1 = atan2(patch_data.YData(2), patch_data.XData(2)); + t2 = atan2(patch_data.YData(end-1), patch_data.XData(end-1)); + + a = rad2deg(t2-t1); + if a < 0 + a = a+360; + end + + obj.PlotOptions.perc = sprintf('%d %%', round(100*a/360)); + end + + %-CHECK FOR MULTIPLE AXES-% + [xsource, ysource] = findSourceAxis(obj,axIndex); + + %-AXIS DATA-% + eval(['scene = obj.layout.scene' num2str(xsource) ';']); + obj.PlotOptions.scene_anchor = ['scene' num2str(xsource)]; + + %-------------------------------------------------------------------------% + + %-scene to be set-% + obj.PlotOptions.scene = scene; + + %-------------------------------------------------------------------------% + + %-patch type-% + obj.data{patchIndex}.type = 'scatter3d'; + + %-------------------------------------------------------------------------% + + %-patch x-% + xdata = patch_data.XData; + if isvector(xdata) + obj.data{patchIndex}.x = [xdata' xdata(1)]; + else + xtemp = reshape(xdata,[],1); + xnew = []; + for n = 1:size(xdata,2) + xnew = [xnew ; xdata(:,n) ; xdata(1,n); NaN]; + end + obj.data{patchIndex}.x = xnew; + end + + %---------------------------------------------------------------------% + + %-patch y-% + ydata = patch_data.YData; + if isvector(ydata) + obj.data{patchIndex}.y = [ydata' ydata(1)]; + else + ytemp = reshape(ydata,[],1); + ynew = []; + for n = 1:size(ydata,2) + ynew = [ynew ; ydata(:,n) ; ydata(1,n); NaN]; + end + obj.data{patchIndex}.y = ynew; + end + + %---------------------------------------------------------------------% + + %-patch z-% + zdata = patch_data.ZData; + + if isvector(ydata) + obj.data{patchIndex}.z = [zdata' zdata(1)]; + else + ztemp = reshape(zdata,[],1); + znew = []; + for n = 1:size(zdata,2) + znew = [znew ; zdata(:,n) ; zdata(1,n); NaN]; + end + obj.data{patchIndex}.z = znew; + end + + %---------------------------------------------------------------------% + + %-patch name-% + if ~isempty(patch_data.DisplayName) + obj.data{patchIndex}.name = patch_data.DisplayName; + else + obj.data{patchIndex}.name = patch_data.DisplayName; + end + + %---------------------------------------------------------------------% + + %-patch visible-% + obj.data{patchIndex}.visible = strcmp(patch_data.Visible,'on'); + + %---------------------------------------------------------------------% + + %-patch fill-% + % obj.data{patchIndex}.fill = 'tozeroy'; + + %-PATCH MODE-% + if ~strcmpi('none', patch_data.Marker) && ~strcmpi('none', patch_data.LineStyle) + mode = 'lines+markers'; + elseif ~strcmpi('none', patch_data.Marker) + mode = 'markers'; + elseif ~strcmpi('none', patch_data.LineStyle) + mode = 'lines'; + else + mode = 'none'; + end + + obj.data{patchIndex}.mode = mode; + + %---------------------------------------------------------------------% + + %-patch marker-% + obj.data{patchIndex}.marker = extractPatchMarker(patch_data); -%-patch visible-% -obj.data{patchIndex}.visible = strcmp(patch_data.Visible,'on'); + %---------------------------------------------------------------------% + + %-patch line-% + obj.data{patchIndex}.line = extractPatchLine(patch_data); + + %---------------------------------------------------------------------% -%---------------------------------------------------------------------% + %-patch fillcolor-% + fill = extractPatchFace(patch_data); + + if strcmp(obj.data{patchIndex}.type,'scatter') + obj.data{patchIndex}.fillcolor = fill.color; + else + obj.data{patchIndex}.surfacecolor = fill.color; + end + + %---------------------------------------------------------------------% + + %-surfaceaxis-% + if strcmp(obj.data{patchIndex}.type,'scatter3d') + minstd = min([std(patch_data.XData) std(patch_data.YData) std(patch_data.ZData)]); + ind = find([std(patch_data.XData) std(patch_data.YData) std(patch_data.ZData)] == minstd)-1; + obj.data{patchIndex}.surfaceaxis = ind; + end + + %-------------------------------------------------------------------------% + + %-patch showlegend-% + leg = get(patch_data.Annotation); + legInfo = get(leg.LegendInformation); -%-patch fill-% -% obj.data{patchIndex}.fill = 'tozeroy'; + switch legInfo.IconDisplayStyle + case 'on' + showleg = true; + case 'off' + showleg = false; + end + + obj.data{patchIndex}.showlegend = showleg; -%-PATCH MODE-% -if ~strcmpi('none', patch_data.Marker) && ~strcmpi('none', patch_data.LineStyle) - mode = 'lines+markers'; -elseif ~strcmpi('none', patch_data.Marker) - mode = 'markers'; -elseif ~strcmpi('none', patch_data.LineStyle) - mode = 'lines'; -else - mode = 'none'; -end - -obj.data{patchIndex}.mode = mode; - -%---------------------------------------------------------------------% - -%-patch marker-% -obj.data{patchIndex}.marker = extractPatchMarker(patch_data); - -%---------------------------------------------------------------------% - -%-patch line-% -obj.data{patchIndex}.line = extractPatchLine(patch_data); - -%---------------------------------------------------------------------% - -%-patch fillcolor-% -fill = extractPatchFace(patch_data); - -if strcmp(obj.data{patchIndex}.type,'scatter') - obj.data{patchIndex}.fillcolor = fill.color; -else - obj.data{patchIndex}.surfacecolor = fill.color; -end - -%---------------------------------------------------------------------% - -%-surfaceaxis-% -if strcmp(obj.data{patchIndex}.type,'scatter3d') - minstd = min([std(patch_data.XData) std(patch_data.YData) std(patch_data.ZData)]); - ind = find([std(patch_data.XData) std(patch_data.YData) std(patch_data.ZData)] == minstd)-1; - obj.data{patchIndex}.surfaceaxis = ind; -end - -%-------------------------------------------------------------------------% - -%-patch showlegend-% -leg = get(patch_data.Annotation); -legInfo = get(leg.LegendInformation); - -switch legInfo.IconDisplayStyle - case 'on' - showleg = true; - case 'off' - showleg = false; -end - -obj.data{patchIndex}.showlegend = showleg; - -%-------------------------------------------------------------------------% + %-------------------------------------------------------------------------% end function obj = updateSurfacePie3(obj, surfaceIndex) -%-AXIS INDEX-% -axIndex = obj.getAxisIndex(obj.State.Plot(surfaceIndex).AssociatedAxis); - -%-CHECK FOR MULTIPLE AXES-% -[xsource, ysource] = findSourceAxis(obj,axIndex); - -%-SURFACE DATA STRUCTURE- % -image_data = get(obj.State.Plot(surfaceIndex).Handle); -figure_data = get(obj.State.Figure.Handle); - -%-AXIS DATA-% -eval(['xaxis = obj.layout.xaxis' num2str(xsource) ';']); -eval(['yaxis = obj.layout.yaxis' num2str(ysource) ';']); + %-AXIS INDEX-% + axIndex = obj.getAxisIndex(obj.State.Plot(surfaceIndex).AssociatedAxis); + + %-CHECK FOR MULTIPLE AXES-% + [xsource, ysource] = findSourceAxis(obj,axIndex); + + %-SURFACE DATA STRUCTURE- % + image_data = get(obj.State.Plot(surfaceIndex).Handle); + figure_data = get(obj.State.Figure.Handle); + + %-AXIS DATA-% + eval(['scene = obj.layout.scene' num2str(xsource) ';']); + obj.PlotOptions.scene_anchor = ['scene' num2str(xsource)]; + + %-------------------------------------------------------------------------% + + %-surface type-% + obj.data{surfaceIndex}.type = 'surface'; + + %------------------------------------------------------------------------% + + %-surface x-% + obj.data{surfaceIndex}.x = image_data.XData; + + %------------------------------------------------------------------------% + + %-surface y-% + obj.data{surfaceIndex}.y = image_data.YData; + + %------------------------------------------------------------------------% + + %-surface z-% + obj.data{surfaceIndex}.z = image_data.ZData; + + %------------------------------------------------------------------------% + + %-image colorscale-% + + cmap = figure_data.Colormap; + len = length(cmap)-1; + + for c = 1:length(cmap) + col = 255 * cmap(c, :); + obj.data{surfaceIndex}.colorscale{c} = { (c-1)/len , ['rgb(' num2str(col(1)) ',' num2str(col(2)) ',' num2str(col(3)) ')' ] }; + end + + obj.data{surfaceIndex}.surfacecolor = 255*(image_data.CData-1) / (obj.PlotOptions.nbars{xsource} - 1); + obj.data{surfaceIndex}.cmax = 255; + obj.data{surfaceIndex}.cmin = 0; + + %------------------------------------------------------------------------% + + %-get data-% + xdata = image_data.XData; + ydata = image_data.YData; + + %-aspect ratio-% + ar = obj.PlotOptions.AspectRatio; + + if ~isempty(ar) + if ischar(ar) + scene.aspectmode = ar; + elseif isvector(ar) && length(ar) == 3 + xar = ar(1); + yar = ar(2); + zar = ar(3); + end + else + + %-define as default-% + xar = max(xdata(:)); + yar = max(ydata(:)); + zar = max([xar, yar]); + end + + fac1 = 0.75; + fac2 = 0.175; + nax = length(obj.PlotOptions.nbars); + + scene.aspectratio.x = xar + fac1*(nax-1)*xar; + scene.aspectratio.y = yar + fac1*(nax-1)*yar; + scene.aspectratio.z = (zar + fac1*(nax-1)*zar)*fac2; + + % optional equations + % scene.aspectratio.x = xar*(1+fac1); + % scene.aspectratio.y = yar*(1+fac1); + % scene.aspectratio.z = zar*fac2*(1+fac1); + + %---------------------------------------------------------------------% + + %-camera eye-% + ey = obj.PlotOptions.CameraEye; + + if ~isempty(ey) + if isvector(ey) && length(ey) == 3 + scene.camera.eye.x = ey(1); + scene.camera.eye.y = ey(2); + scene.camera.eye.z = ey(3); + end + else + + %-define as default-% + xey = - xar; if xey>0 xfac = -0.2; else xfac = 0.2; end + yey = - yar; if yey>0 yfac = -0.2; else yfac = 0.2; end + if zar>0 zfac = 0.2; else zfac = -0.2; end + + scene.camera.eye.x = xey + xfac*xey; + scene.camera.eye.y = yey + yfac*yey; + scene.camera.eye.z = zar + zfac*zar; + end + + %-------------------------------------------------------------------------% + + %-scene to be set-% + obj.PlotOptions.scene = scene; + + %-------------------------------------------------------------------------% + + %-surface name-% + obj.data{surfaceIndex}.name = image_data.DisplayName; + + %-------------------------------------------------------------------------% + + %-surface showscale-% + obj.data{surfaceIndex}.showscale = false; + + %-------------------------------------------------------------------------% -%-------------------------------------------------------------------------% + %-surface visible-% + obj.data{surfaceIndex}.visible = strcmp(image_data.Visible,'on'); -%-surface xaxis-% -obj.data{surfaceIndex}.xaxis = ['x' num2str(xsource)]; + %-------------------------------------------------------------------------% -%-------------------------------------------------------------------------% - -%-surface yaxis-% -obj.data{surfaceIndex}.yaxis = ['y' num2str(ysource)]; - -%-------------------------------------------------------------------------% - -% check for 3D -if any(nonzeros(image_data.ZData)) - - %-surface type-% - obj.data{surfaceIndex}.type = 'surface'; - - %---------------------------------------------------------------------% - - %-surface x-% - obj.data{surfaceIndex}.x = image_data.XData; - - %---------------------------------------------------------------------% - - %-surface y-% - obj.data{surfaceIndex}.y = image_data.YData; - - %---------------------------------------------------------------------% - - %-surface z-% - obj.data{surfaceIndex}.z = image_data.ZData; - - %---------------------------------------------------------------------% - -else - - %-surface type-% - obj = updateImage(obj, surfaceIndex); - - %-surface x-% - obj.data{surfaceIndex}.x = image_data.XData(1,:); - - %-surface y-% - obj.data{surfaceIndex}.y = image_data.YData(:,1); -end - -%-------------------------------------------------------------------------% - -%-image colorscale-% - -cmap = figure_data.Colormap; -len = length(cmap)-1; - -for c = 1:length(cmap) - col = 255 * cmap(c, :); - obj.data{surfaceIndex}.colorscale{c} = { (c-1)/len , ['rgb(' num2str(col(1)) ',' num2str(col(2)) ',' num2str(col(3)) ')' ] }; -end - -obj.data{surfaceIndex}.surfacecolor = 255*(image_data.CData-1) / obj.PlotOptions.nbars; -obj.data{surfaceIndex}.cmax = 255; -obj.data{surfaceIndex}.cmin = 0; -obj.layout.scene.aspectmode = 'data'; - -%-------------------------------------------------------------------------% - -%-surface name-% -obj.data{surfaceIndex}.name = image_data.DisplayName; - -%-------------------------------------------------------------------------% - -%-surface showscale-% -obj.data{surfaceIndex}.showscale = false; - -%-------------------------------------------------------------------------% - -%-surface visible-% -obj.data{surfaceIndex}.visible = strcmp(image_data.Visible,'on'); - -%-------------------------------------------------------------------------% - -leg = get(image_data.Annotation); -legInfo = get(leg.LegendInformation); - -switch legInfo.IconDisplayStyle - case 'on' - showleg = true; - case 'off' - showleg = false; -end + leg = get(image_data.Annotation); + legInfo = get(leg.LegendInformation); -obj.data{surfaceIndex}.showlegend = showleg; + switch legInfo.IconDisplayStyle + case 'on' + showleg = true; + case 'off' + showleg = false; + end -%-------------------------------------------------------------------------% + obj.data{surfaceIndex}.showlegend = showleg; + %-------------------------------------------------------------------------% end diff --git a/plotly/plotlyfig_aux/handlegraphics/updateStreamtube.m b/plotly/plotlyfig_aux/handlegraphics/updateStreamtube.m new file mode 100644 index 00000000..f19ab522 --- /dev/null +++ b/plotly/plotlyfig_aux/handlegraphics/updateStreamtube.m @@ -0,0 +1,156 @@ +function obj = updateStreamtube(obj, surfaceIndex) +if strcmpi(obj.State.Plot(surfaceIndex).Class, 'surface') + updateSurfaceStreamtube(obj, surfaceIndex) +end +end + +function updateSurfaceStreamtube(obj, surfaceIndex) + +%-AXIS INDEX-% +axIndex = obj.getAxisIndex(obj.State.Plot(surfaceIndex).AssociatedAxis); + +%-CHECK FOR MULTIPLE AXES-% +[xsource, ysource] = findSourceAxis(obj,axIndex); + +%-SURFACE DATA STRUCTURE- % +image_data = get(obj.State.Plot(surfaceIndex).Handle); +figure_data = get(obj.State.Figure.Handle); + +%-AXIS DATA-% +eval(['xaxis = obj.layout.xaxis' num2str(xsource) ';']); +eval(['yaxis = obj.layout.yaxis' num2str(ysource) ';']); + +%-------------------------------------------------------------------------% + +%-surface xaxis-% +obj.data{surfaceIndex}.xaxis = ['x' num2str(xsource)]; + +%-------------------------------------------------------------------------% + +%-surface yaxis-% +obj.data{surfaceIndex}.yaxis = ['y' num2str(ysource)]; + + +%---------------------------------------------------------------------% + +%-surface type-% +obj.data{surfaceIndex}.type = 'surface'; + +%---------------------------------------------------------------------% + +%-format x an y data-% +ymax = 100; +x = image_data.XData; +y = image_data.YData; +z = image_data.ZData; +cdata = image_data.CData; + +ysize = size(x,1); +xsize = size(x,2); + +if ysize > ymax + ystep = round(ysize/ymax); + x = x(1:ystep:end, :); + y = y(1:ystep:end, :); + z = z(1:ystep:end, :); + cdata = cdata(1:ystep:end, :); +end + +if isvector(x) + [x, y] = meshgrid(x,y); +end + +%---------------------------------------------------------------------% + +%-surface x-% +obj.data{surfaceIndex}.x = x; + +%---------------------------------------------------------------------% + +%-surface y-% +obj.data{surfaceIndex}.y = y; + +%---------------------------------------------------------------------% + +%-surface z-% +obj.data{surfaceIndex}.z = z; + +%---------------------------------------------------------------------% + +%-if image comes would a 3D plot-% +obj.PlotOptions.Image3D = true; + +%-if contour comes would a ContourProjection-% +obj.PlotOptions.ContourProjection = true; + +%---------------------------------------------------------------------% + +%- setting grid mesh by default -% +% x-direction +xmin = min(x(:)); +xmax = max(x(:)); +xsize = (xmax - xmin) / (size(x, 2)-1); +obj.data{surfaceIndex}.contours.x.start = xmin; +obj.data{surfaceIndex}.contours.x.end = xmax; +obj.data{surfaceIndex}.contours.x.size = xsize; +obj.data{surfaceIndex}.contours.x.show = true; +obj.data{surfaceIndex}.contours.x.color = 'black'; +% y-direction +ymin = min(y(:)); +ymax = max(y(:)); +ysize = (ymax - ymin) / (size(y, 1)-1); +obj.data{surfaceIndex}.contours.y.start = ymin; +obj.data{surfaceIndex}.contours.y.end = ymax; +obj.data{surfaceIndex}.contours.y.size = ysize; +obj.data{surfaceIndex}.contours.y.show = true; +obj.data{surfaceIndex}.contours.y.color = 'black'; + +%-------------------------------------------------------------------------% + +%-image colorscale-% + +cmap = figure_data.Colormap; +len = length(cmap)-1; + +for c = 1: length(cmap) + col = 255 * cmap(c, :); + obj.data{surfaceIndex}.colorscale{c} = { (c-1)/len , ['rgb(' num2str(col(1)) ',' num2str(col(2)) ',' num2str(col(3)) ')' ] }; +end + +%-------------------------------------------------------------------------% + +%-surface coloring-% +obj.data{surfaceIndex}.surfacecolor = cdata; + +%-------------------------------------------------------------------------% + +%-surface name-% +obj.data{surfaceIndex}.name = image_data.DisplayName; + +%-------------------------------------------------------------------------% + +%-surface showscale-% +obj.data{surfaceIndex}.showscale = false; + +%-------------------------------------------------------------------------% + +%-surface visible-% +obj.data{surfaceIndex}.visible = strcmp(image_data.Visible,'on'); + +%-------------------------------------------------------------------------% + +leg = get(image_data.Annotation); +legInfo = get(leg.LegendInformation); + +switch legInfo.IconDisplayStyle + case 'on' + showleg = true; + case 'off' + showleg = false; +end + +obj.data{surfaceIndex}.showlegend = showleg; + +%-------------------------------------------------------------------------% + +end