diff --git a/plotly/plotlyfig_aux/handlegraphics/updateScatter.m b/plotly/plotlyfig_aux/handlegraphics/updateScatter.m index b62eabe4..81c9e82d 100644 --- a/plotly/plotlyfig_aux/handlegraphics/updateScatter.m +++ b/plotly/plotlyfig_aux/handlegraphics/updateScatter.m @@ -1,235 +1,81 @@ function updateScatter(obj,scatterIndex) -%check: http://undocumentedmatlab.com/blog/undocumented-scatter-plot-behavior - -%----SCATTER FIELDS----% - -% x - [DONE] -% y - [DONE] -% r - [HANDLED BY SCATTER] -% t - [HANDLED BY SCATTER] -% mode - [DONE] -% name - [DONE] -% text - [NOT SUPPORTED IN MATLAB] -% error_y - [HANDLED BY ERRORBAR] -% error_x - [NOT SUPPORTED IN MATLAB] -% textfont - [NOT SUPPORTED IN MATLAB] -% textposition - [NOT SUPPORTED IN MATLAB] -% xaxis [DONE] -% yaxis [DONE] -% showlegend [DONE] -% stream - [HANDLED BY PLOTLYSTREAM] -% visible [DONE] -% type [DONE] -% opacity ---[TODO] - -% MARKER -% marler.color - [DONE] -% marker.size - [DONE] -% marker.opacity - [NOT SUPPORTED IN MATLAB] -% marker.colorscale - [NOT SUPPORTED IN MATLAB] -% marker.sizemode - [DONE] -% marker.sizeref - [DONE] -% marker.maxdisplayed - [NOT SUPPORTED IN MATLAB] - -% MARKER LINE -% marker.line.color - [DONE] -% marker.line.width - [DONE] -% marker.line.dash - [NOT SUPPORTED IN MATLAB] -% marker.line.opacity - [DONE] -% marker.line.smoothing - [NOT SUPPORTED IN MATLAB] -% marker.line.shape - [NOT SUPPORTED IN MATLAB] - -% LINE -% line.color - [NA] -% line.width - [NA] -% line.dash - [NA] -% line.opacity [NA] -% line.smoothing - [NOT SUPPORTED IN MATLAB] -% line.shape - [NOT SUPPORTED IN MATLAB] -% connectgaps - [NOT SUPPORTED IN MATLAB] -% fill - [HANDLED BY AREA] -% fillcolor - [HANDLED BY AREA] - -%-AXIS INDEX-% -axIndex = obj.getAxisIndex(obj.State.Plot(scatterIndex).AssociatedAxis); - -%-SCATTER DATA STRUCTURE- % -scatter_data = get(obj.State.Plot(scatterIndex).Handle); - -%-CHECK FOR MULTIPLE AXES-% -[xsource, ysource] = findSourceAxis(obj,axIndex); - -if isfield(scatter_data,'ZData') - if isempty(scatter_data.ZData) - - %-AXIS DATA-% - eval(['xaxis = obj.layout.xaxis' num2str(xsource) ';']); - eval(['yaxis = obj.layout.yaxis' num2str(ysource) ';']); - - %-------------------------------------------------------------------------% - - %-scatter xaxis-% - obj.data{scatterIndex}.xaxis = ['x' num2str(xsource)]; - - %-------------------------------------------------------------------------% - - %-scatter yaxis-% - obj.data{scatterIndex}.yaxis = ['y' num2str(ysource)]; + %-------------------------------------------------------------------------% + + %-INITIALIZATIONS-% + axIndex = obj.getAxisIndex(obj.State.Plot(scatterIndex).AssociatedAxis); + [xSource, ySource] = findSourceAxis(obj,axIndex); + scatterData = get(obj.State.Plot(scatterIndex).Handle); + + try + isScatter3D = isfield(scatterData,'ZData'); + isScatter3D = isScatter3D & ~isempty(scatterData.ZData); + catch + isScatter3D = false; end + %-------------------------------------------------------------------------% -end - -%-------------------------------------------------------------------------% - -%-scatter type-% -obj.data{scatterIndex}.type = 'scatter'; - -%-------------------------------------------------------------------------% - -%-scatter mode-% -obj.data{scatterIndex}.mode = 'markers'; - -%-------------------------------------------------------------------------% - -%-scatter visible-% -obj.data{scatterIndex}.visible = strcmp(scatter_data.Visible,'on'); - -%-------------------------------------------------------------------------% - -%-scatter name-% -obj.data{scatterIndex}.name = scatter_data.DisplayName; + %-set trace-% + if ~isScatter3D + obj.data{scatterIndex}.type = 'scatter'; + obj.data{scatterIndex}.xaxis = sprintf('x%d', xSource); + obj.data{scatterIndex}.yaxis = sprintf('y%d', ySource); + else + obj.data{scatterIndex}.type = 'scatter3d'; + obj.data{scatterIndex}.scene = sprintf('scene%d', xSource); + end -%-------------------------------------------------------------------------% + obj.data{scatterIndex}.mode = 'markers'; + obj.data{scatterIndex}.visible = strcmp(scatterData.Visible,'on'); + obj.data{scatterIndex}.name = scatterData.DisplayName; -%-scatter patch data-% -for m = 1:length(scatter_data) + %-------------------------------------------------------------------------% + + %-set plot data-% + obj.data{scatterIndex}.x = scatterData.XData; + obj.data{scatterIndex}.y = scatterData.YData; - %reverse counter - n = length(scatter_data) - m + 1; - - %---------------------------------------------------------------------% - - %-scatter x-% - if length(scatter_data) > 1 - obj.data{scatterIndex}.x(m) = scatter_data(n).XData; - else - obj.data{scatterIndex}.x = scatter_data.XData; - end - - %---------------------------------------------------------------------% - - %-scatter y-% - if length(scatter_data) > 1 - obj.data{scatterIndex}.y(m) = scatter_data(n).YData; - else - obj.data{scatterIndex}.y = scatter_data.YData; + if isScatter3D + obj.data{scatterIndex}.z = scatterData.ZData; end + + %-------------------------------------------------------------------------% - %---------------------------------------------------------------------% - - %-scatter z-% - if isHG2() - if isfield(scatter_data,'ZData') - if any(scatter_data.ZData) - if length(scatter_data) > 1 - obj.data{scatterIndex}.z(m) = scatter_data(n).ZData; - else - obj.data{scatterIndex}.z = scatter_data.ZData; - end - % overwrite type - obj.data{scatterIndex}.type = 'scatter3d'; - end - end + %-set marker property-% + obj.data{scatterIndex}.marker = extractScatterMarker(scatterData); + markerSize = obj.data{scatterIndex}.marker.size; + markerColor = obj.data{scatterIndex}.marker.color; + markerLineColor = obj.data{scatterIndex}.marker.line.color; + + if length(markerSize) == 1 + obj.data{scatterIndex}.marker.size = markerSize * 0.15; end - - %---------------------------------------------------------------------% - - %-scatter showlegend-% - leg = get(scatter_data.Annotation); - legInfo = get(leg.LegendInformation); - - switch legInfo.IconDisplayStyle - case 'on' - showleg = true; - case 'off' - showleg = false; + + if length(markerColor) == 1 + obj.data{scatterIndex}.marker.color = markerColor{1}; end - - if isfield(scatter_data,'ZData') - if isempty(scatter_data.ZData) - obj.data{scatterIndex}.showlegend = showleg; - end + + if length(markerLineColor) == 1 + obj.data{scatterIndex}.marker.line.color = markerLineColor{1}; end - %---------------------------------------------------------------------% - - %-scatter marker-% - childmarker = extractScatterMarker(scatter_data(n)); - - %---------------------------------------------------------------------% - - %-line color-% - if length(scatter_data) > 1 - obj.data{scatterIndex}.marker.line.color{m} = childmarker.line.color{1}; - else - if length(childmarker.line.color) > 3 - obj.data{scatterIndex}.marker.line.color = childmarker.line.color; - else - obj.data{scatterIndex}.marker.line.color = childmarker.line.color{1}; + %-------------------------------------------------------------------------% + + %-set showlegend property-% + if isScatter3D + leg = get(scatterData.Annotation); + legInfo = get(leg.LegendInformation); + + switch legInfo.IconDisplayStyle + case 'on' + showleg = true; + case 'off' + showleg = false; end + + obj.data{scatterIndex}.showlegend = showleg; end - - %---------------------------------------------------------------------% - - %-marker color-% - if length(scatter_data) > 1 - obj.data{scatterIndex}.marker.color{m} = childmarker.color{1}; - else - obj.data{scatterIndex}.marker.color = childmarker.color; - end - - %---------------------------------------------------------------------% - - %-sizeref-% - obj.data{scatterIndex}.marker.sizeref = childmarker.sizeref; - - %---------------------------------------------------------------------% - - %-sizemode-% - obj.data{scatterIndex}.marker.sizemode = childmarker.sizemode; - - %---------------------------------------------------------------------% - - %-symbol-% - if length(scatter_data) > 1 - obj.data{scatterIndex}.marker.symbol{m} = childmarker.symbol; - else - obj.data{scatterIndex}.marker.symbol = childmarker.symbol; - end - - %---------------------------------------------------------------------% - - %-size-% - if length(scatter_data) > 1 - obj.data{scatterIndex}.marker.size = childmarker.size; - else - obj.data{scatterIndex}.marker.size = childmarker.size * 0.15; - end - - %---------------------------------------------------------------------% - - %-line width-% - - if length(scatter_data) > 1 || ischar(childmarker.line.color) - obj.data{scatterIndex}.marker.line.width(m) = childmarker.line.width; - else - obj.data{scatterIndex}.marker.line.width = childmarker.line.width; - % obj.data{scatterIndex}.marker.line.width(1:length(childmarker.line.color)) = childmarker.line.width; - end - - %---------------------------------------------------------------------% - -end + + %-------------------------------------------------------------------------% end diff --git a/plotly/plotlyfig_aux/helpers/extractScatterMarker.m b/plotly/plotlyfig_aux/helpers/extractScatterMarker.m index 2bb27cf3..73a3d8d6 100644 --- a/plotly/plotlyfig_aux/helpers/extractScatterMarker.m +++ b/plotly/plotlyfig_aux/helpers/extractScatterMarker.m @@ -1,209 +1,173 @@ -function marker = extractScatterMarker(patch_data) - -% EXTRACTS THE MARKER STYLE USED FOR MATLAB OBJECTS -% OF TYPE "PATCH". THESE OBJECTS ARE USED IN AREASERIES -% BARSERIES, CONTOURGROUP, SCATTERGROUP. - -%-------------------------------------------------------------------------% - -%-AXIS STRUCTURE-% -axis_data = get(ancestor(patch_data.Parent,'axes')); - -%-FIGURE STRUCTURE-% -figure_data = get(ancestor(patch_data.Parent,'figure')); - -%-INITIALIZE OUTPUT-% -marker = struct(); - -%-------------------------------------------------------------------------% - -%-MARKER SIZEREF-% -marker.sizeref = 1; - -%-------------------------------------------------------------------------% - -%-MARKER SIZEMODE-% -marker.sizemode = 'area'; - -%-------------------------------------------------------------------------% - -%-MARKER SIZE (STYLE)-% -marker.size = patch_data.SizeData; - -%-------------------------------------------------------------------------% - -%-MARKER SYMBOL (STYLE)-% -if ~strcmp(patch_data.Marker,'none') - - switch patch_data.Marker - case '.' - marksymbol = 'circle'; - case 'o' - marksymbol = 'circle'; - case 'x' - marksymbol = 'x-thin-open'; - case '+' - marksymbol = 'cross-thin-open'; - case '*' - marksymbol = 'asterisk-open'; - case {'s','square'} - marksymbol = 'square'; - case {'d','diamond'} - marksymbol = 'diamond'; - case 'v' - marksymbol = 'triangle-down'; - case '^' - marksymbol = 'triangle-up'; - case '<' - marksymbol = 'triangle-left'; - case '>' - marksymbol = 'triangle-right'; - case {'p','pentagram'} - marksymbol = 'star'; - case {'h','hexagram'} - marksymbol = 'hexagram'; +function marker = extractScatterMarker(plotData) + + %+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++% + % % + % %-DESCRIPTION-% % + % % + % EXTRACTS THE MARKER STYLE USED FOR MATLAB OBJECTS OF TYPE "PATCH". % + % THESE OBJECTS ARE USED IN AREASERIES BARSERIES, CONTOURGROUP, % + % SCATTERGROUP. % + % % + %+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++% + + %-INITIALIZATIONS-% + axisData = get(ancestor(plotData.Parent,'axes')); + figureData = get(ancestor(plotData.Parent,'figure')); + marker = struct(); + + marker.sizeref = 1; + marker.sizemode = 'area'; + marker.size = plotData.SizeData; + marker.line.width = plotData.LineWidth; + + markerFaceColor = plotData.MarkerFaceColor; + markerFaceAlpha = plotData.MarkerFaceAlpha; + markerEdgeColor = plotData.MarkerEdgeColor; + markerEdgeAlpha = plotData.MarkerEdgeAlpha; + cData = plotData.CData; + + colorMap = axisData.Colormap; + cLim = axisData.CLim; + + filledMarkerSet = {'o', 'square', 's', 'diamond', 'd', 'v', '^', ... + '<', '>', 'hexagram', 'pentagram'}; + filledMarker = ismember(plotData.Marker, filledMarkerSet); + nColors = size(colorMap, 1); + + %-------------------------------------------------------------------------% + + %-get marker symbol-% + if ~strcmp(plotData.Marker,'none') + + switch plotData.Marker + case '.' + markerSymbol = 'circle'; + case 'o' + markerSymbol = 'circle'; + case 'x' + markerSymbol = 'x-thin-open'; + case '+' + markerSymbol = 'cross-thin-open'; + case '*' + markerSymbol = 'asterisk-open'; + case {'s','square'} + markerSymbol = 'square'; + case {'d','diamond'} + markerSymbol = 'diamond'; + case 'v' + markerSymbol = 'triangle-down'; + case '^' + markerSymbol = 'triangle-up'; + case '<' + markerSymbol = 'triangle-left'; + case '>' + markerSymbol = 'triangle-right'; + case {'p','pentagram'} + markerSymbol = 'star'; + case {'h','hexagram'} + markerSymbol = 'hexagram'; + end + + marker.symbol = markerSymbol; end - - marker.symbol = marksymbol; -end -%-------------------------------------------------------------------------% + %-------------------------------------------------------------------------% -%-MARKER LINE WIDTH (STYLE)-% -marker.line.width = patch_data.LineWidth; + %-get marker fillColor-% + if filledMarker + + if isnumeric(markerFaceColor) + fillColor = sprintf('rgb(%f,%f,%f)', 255*markerFaceColor); -%-------------------------------------------------------------------------% + else + switch markerFaceColor + + case 'none' + fillColor = 'rgba(0,0,0,0)'; + + case 'auto' + if ~strcmp(axisData.Color,'none') + fillColor = 255*axisData.Color; + else + fillColor = 255*figureData.Color; + end + + fillColor = sprintf('rgb(%f,%f,%f)', fillColor); + + case 'flat' -%--MARKER FILL COLOR--% + for n = 1:size(cData, 1) + if size(cData, 2) == 1 + cIndex = max( min( cData(n), cLim(2) ), cLim(1) ); + scaleColor = (cIndex - cLim(1)) / diff(cLim); + cIndex = 1 + floor(scaleColor*(nColors-1)); + numColor = 255 * colorMap(cIndex, :); -%-figure colormap-% -colormap = figure_data.Colormap; + elseif size(cData, 2) == 3 + numColor = 255*cData(n, :); + end -% marker face color -MarkerColor = patch_data.MarkerFaceColor; + fillColor{n} = sprintf('rgb(%f,%f,%f)', numColor); + end -filledMarkerSet = {'o','square','s','diamond','d',... - 'v','^', '<','>','hexagram','pentagram'}; + end + end + + marker.color = fillColor; + marker.opacity = markerFaceAlpha; + + end + + %-------------------------------------------------------------------------% -filledMarker = ismember(patch_data.Marker,filledMarkerSet); + %-get marker lineColor-% + if isnumeric(markerEdgeColor) + lineColor = sprintf('rgb(%f,%f,%f)', 255*markerEdgeColor); -if filledMarker - - if isnumeric(MarkerColor) - col = 255*MarkerColor; - markercolor = ['rgb(' num2str(col(1)) ',' num2str(col(2)) ',' num2str(col(3)) ')']; else + switch markerEdgeColor - switch MarkerColor - case 'none' - - markercolor = 'rgba(0,0,0,0)'; + lineColor = 'rgba(0,0,0,0)'; case 'auto' - if ~strcmp(axis_data.Color,'none') - col = 255*axis_data.Color; + EdgeColor = plotData.EdgeColor; + + if ~strcmp(axisData.Color,'none') + lineColor = 255*axisData.Color; else - col = 255*figure_data.Color; + lineColor = 255*figureData.Color; end - - markercolor = ['rgb(' num2str(col(1)) ',' num2str(col(2)) ',' num2str(col(3)) ')']; - + + lineColor = sprintf('rgba(%f,%f,%f,%f)', lineColor, ... + markerEdgeAlpha); case 'flat' - - for n = 1:length(patch_data.CData) - - capCD = max(min(patch_data.CData(n),axis_data.CLim(2)),axis_data.CLim(1)); - scalefactor = (capCD - axis_data.CLim(1))/diff(axis_data.CLim); - col = 255*(colormap(1 + floor(scalefactor*(length(colormap)-1)),:)); - - markercolor{n} = ['rgb(' num2str(col(1)) ',' num2str(col(2)) ',' num2str(col(3)) ')']; - + + for n = 1:size(cData, 1) + if size(cData, 2) == 1 + cIndex = max( min( cData(n), cLim(2) ), cLim(1) ); + scaleColor = (cIndex - cLim(1)) / diff(cLim); + cIndex = 1 + floor(scaleColor*(nColors-1)); + numColor = 255 * colorMap(cIndex, :); + + elseif size(cData, 2) == 3 + numColor = 255*cData(n, :); + end + + lineColor{n} = sprintf('rgba(%f,%f,%f,%f)', numColor, ... + markerEdgeAlpha); end + end end - - marker.color = markercolor; - -end - -%-------------------------------------------------------------------------% - -%-MARKER LINE COLOR-% - -% marker edge color -MarkerLineColor = patch_data.MarkerEdgeColor; -filledMarker = ismember(patch_data.Marker,filledMarkerSet); - -if isnumeric(MarkerLineColor) - col = 255*MarkerLineColor; - markerlinecolor = ['rgb(' num2str(col(1)) ',' num2str(col(2)) ',' num2str(col(3)) ')']; -else - switch MarkerLineColor - - case 'none' - - markerlinecolor = 'rgba(0,0,0,0)'; - - case 'auto' - - EdgeColor = patch_data.EdgeColor; - - if isnumeric(EdgeColor) - col = 255*EdgeColor; - markerlinecolor = ['rgb(' num2str(col(1)) ',' num2str(col(2)) ',' num2str(col(3)) ')']; - else - - switch EdgeColor - - case 'none' - - markerlinecolor = 'rgba(0,0,0,0)'; - - case {'flat', 'interp'} - - for n = 1:length(patch_data.CData) - - capCD = max(min(patch_data.CData(n),axis_data.CLim(2)),axis_data.CLim(1)); - scalefactor = (capCD - axis_data.CLim(1))/diff(axis_data.CLim); - col = 255*(colormap(1 + floor(scalefactor*(length(colormap)-1)),:)); - - markerlinecolor{n} = ['rgb(' num2str(col(1)) ',' num2str(col(2)) ',' num2str(col(3)) ')']; - - end - - end - end - - case 'flat' - - for n = 1:length(patch_data.CData) - - try - capCD = max(min(patch_data.CData(n),axis_data.CLim(2)),axis_data.CLim(1)); - scalefactor = (capCD - axis_data.CLim(1))/diff(axis_data.CLim); - col = 255*(colormap(1+floor(scalefactor*(length(colormap)-1)),:)); - catch - capCD = patch_data.CData(n); - scalefactor = capCD; - col = 255*(colormap(1+floor(scalefactor*(length(colormap)-1)),:)); - end - - markerlinecolor{n} = ['rgb(' num2str(col(1)) ',' num2str(col(2)) ',' num2str(col(3)) ')']; - - end + if filledMarker + marker.line.color = lineColor; + else + marker.color = lineColor; end -end - -if filledMarker - marker.line.color = markerlinecolor; -else - marker.color = markerlinecolor; -end - -%-------------------------------------------------------------------------% + %-------------------------------------------------------------------------% end