1
- function obj = updateHistogram2(obj ,histIndex )
1
+ function obj = updateHistogram2(obj ,dataIndex )
2
2
3
- % ---------------------------------------------------------------------%
3
+ % ----- ---------------------------------------------------------------------%
4
4
5
- % -AXIS INDEX-%
6
- axIndex = obj .getAxisIndex(obj .State .Plot(histIndex ).AssociatedAxis);
5
+ % -INITIALIZATIONS-%
7
6
8
- % ---------------------------------------------------------------------%
7
+ axIndex = obj .getAxisIndex(obj .State .Plot(dataIndex ).AssociatedAxis);
8
+ [xSource , ~ ] = findSourceAxis(obj , axIndex );
9
+ plotData = get(obj .State .Plot(dataIndex ).Handle);
10
+ axisData = get(plotData .Parent );
9
11
10
- % -HIST DATA STRUCTURE- %
11
- hist_data = get( obj . State .Plot( histIndex ).Handle) ;
12
+ colorMap = axisData . Colormap ;
13
+ barGap = 0.05 ;
12
14
13
- % ---------------------------------------------------------------------%
15
+ % -get trace data-%
16
+ values = plotData .Values ;
17
+ xEdges = plotData .XBinEdges ;
18
+ yEdges = plotData .YBinEdges ;
14
19
15
- % -hist type-%
16
- obj.data{ histIndex }.type = ' mesh3d ' ;
20
+ dx = diff(xEdges( 2 : end - 1 ));
21
+ dy = diff(yEdges( 2 : end - 1 )) ;
17
22
18
- % ---------------------------------------------------------------------%
23
+ if isinf(xEdges(1 )) xEdges(1 ) = xEdges(2 ) - dx(1 ); end
24
+ if isinf(yEdges(1 )) yEdges(1 ) = yEdges(2 ) - dy(1 ); end
19
25
20
- % -required parameters-%
21
- values = hist_data .Values ;
22
- xedges = hist_data .XBinEdges ;
23
- yedges = hist_data .YBinEdges ;
26
+ if isinf(xEdges(end )) xEdges(end ) = xEdges(end - 1 ) + dx(1 ); end
27
+ if isinf(yEdges(end )) yEdges(end ) = yEdges(end - 1 ) + dy(1 ); end
24
28
25
- sx = diff(xedges( 2 : end - 1 ));
26
- sy = diff(yedges( 2 : end - 1 ) );
29
+ [ xData , yData , zData , iData , jData , kData ] = ...
30
+ getPlotlyMesh3d( xEdges , yEdges , values , barGap ) ;
27
31
28
- if isinf(xedges( 1 )) xedges( 1 ) = xedges( 2 ) - sx( 1 ); end
29
- if isinf(yedges( 1 )) yedges( 1 ) = yedges( 2 ) - sy( 1 ); end
32
+ cData = zeros(size( zData ));
33
+ for n = 1 : 2 : length( zData ), cData( n : n + 1 ) = max(zData( n : n + 1 ) ); end
30
34
31
- if isinf(xedges(end )) xedges(end ) = xedges(end - 1 ) + sx(1 ); end
32
- if isinf(yedges(end )) yedges(end ) = yedges(end - 1 ) + sy(1 ); end
35
+ % --------------------------------------------------------------------------%
33
36
34
- % ---------------------------------------------------------------------%
37
+ % -set trace-%
38
+ updateScene(obj , dataIndex );
35
39
36
- % -get the values to use plotly's mesh3D-%
37
- bargap = 0.05 ;
38
- [X , Y , Z , I , J , K ] = get_plotly_mesh3d(xedges , yedges , values , bargap );
40
+ obj.data{dataIndex }.type = ' mesh3d' ;
41
+ obj.data{dataIndex }.scene = sprintf(' scene%d ' , xSource );
42
+ obj.data{dataIndex }.name = plotData .DisplayName ;
43
+ obj.data{dataIndex }.visible = strcmp(plotData .Visible ,' on' );
44
+ obj.layout.bargap = barGap ;
39
45
40
- % ---------------------------------------------------------------------%
46
+ % ----- ---------------------------------------------------------------------%
41
47
42
- % -passing parameters to mesh3D -%
43
- obj.data{histIndex }.x = X ;
44
- obj.data{histIndex }.y = Y ;
45
- obj.data{histIndex }.z = Z ;
46
- obj.data{histIndex }.i = int16(I - 1 );
47
- obj.data{histIndex }.j = int16(J - 1 );
48
- obj.data{histIndex }.k = int16(K - 1 );
48
+ % -set trace data -%
49
+ obj.data{dataIndex }.x = xData ;
50
+ obj.data{dataIndex }.y = yData ;
51
+ obj.data{dataIndex }.z = zData ;
52
+ obj.data{dataIndex }.i = int16(iData - 1 );
53
+ obj.data{dataIndex }.j = int16(jData - 1 );
54
+ obj.data{dataIndex }.k = int16(kData - 1 );
49
55
50
- % ---------------------------------------------------------------------%
56
+ % ----- ---------------------------------------------------------------------%
51
57
52
- % -some settings-%
53
- % obj.data{histIndex}.color='rgb(0,255,0)';
54
- obj.data{histIndex }.contour.show = true ;
55
- obj.data{histIndex }.contour.width = 6 ;
56
- obj.data{histIndex }.contour.color= ' rgb(0,0,0)' ;
57
- obj.data{histIndex }.flatshading = true ;
58
+ % -set trace coloring-%
59
+ faceColor = plotData .FaceColor ;
58
60
59
- % ---------------------------------------------------------------------%
61
+ if isnumeric(faceColor )
62
+ obj.data{dataIndex }.color = getStringColor(255 * faceColor );
63
+ elseif strcmp(faceColor , ' none' )
64
+ obj.data{dataIndex }.color = getStringColor(255 * zeros(1 ,3 ), 0.1 );
65
+ elseif strcmp(faceColor , ' flat' )
66
+ obj.data{dataIndex }.intensity = cData ;
67
+ obj.data{dataIndex }.colorscale = getColorScale(colorMap );
68
+ obj.data{dataIndex }.showscale = false ;
69
+ end
60
70
61
- % -lighting settings-%
62
- obj.data{histIndex }.lighting.diffuse = 0.92 ;
63
- obj.data{histIndex }.lighting.ambient = 0.54 ;
64
- obj.data{histIndex }.lighting.specular = 1.42 ;
65
- obj.data{histIndex }.lighting.roughness = 0.52 ;
66
- obj.data{histIndex }.lighting.fresnel = 0.2 ;
67
- obj.data{histIndex }.lighting.vertexnormalsepsilon = 1e- 12 ;
68
- obj.data{histIndex }.lighting.facenormalsepsilon = 1e-6 ;
71
+ obj.data{ dataIndex }.flatshading = true ;
72
+ obj.data{dataIndex }.lighting.diffuse = 0.92 ;
73
+ obj.data{dataIndex }.lighting.ambient = 0.54 ;
74
+ obj.data{dataIndex }.lighting.specular = 1.42 ;
75
+ obj.data{dataIndex }.lighting.roughness = 0.52 ;
76
+ obj.data{dataIndex }.lighting.fresnel = 0.2 ;
77
+ obj.data{dataIndex }.lighting.vertexnormalsepsilon = 1e- 12 ;
78
+ obj.data{dataIndex }.lighting.facenormalsepsilon = 1e-6 ;
69
79
70
- % ---------------------------------------------------------------------%
80
+ % --------------------------------------------------------------------------%
81
+ end
71
82
72
- % -aspect ratio-%
73
- ar = obj .PlotOptions .AspectRatio ;
83
+ function updateScene(obj , dataIndex )
74
84
75
- if ~isempty(ar )
76
- if ischar(ar )
77
- obj.layout.scene.aspectmode = ar ;
78
- elseif isvector(ar ) && length(ar ) == 3
79
- xar = ar(1 );
80
- yar = ar(2 );
81
- zar = ar(3 );
82
- end
83
- else
85
+ % -------------------------------------------------------------------------%
84
86
85
- % -define as default-%
86
- xar = max(xedges(: ));
87
- yar = max(yedges(: ));
88
- zar = 0.7 * max([xar , yar ]);
89
- end
87
+ % -INITIALIZATIONS-%
90
88
91
- obj.layout.scene.aspectratio.x = xar ;
92
- obj.layout.scene.aspectratio.y = yar ;
93
- obj.layout.scene.aspectratio.z = zar ;
89
+ axIndex = obj .getAxisIndex(obj .State .Plot(dataIndex ).AssociatedAxis);
90
+ plotData = get(obj .State .Plot(dataIndex ).Handle);
91
+ axisData = get(plotData .Parent );
92
+ [xSource , ~ ] = findSourceAxis(obj , axIndex );
93
+ scene = eval( sprintf(' obj.layout.scene%d ' , xSource ) );
94
94
95
- % ---------------------------------------------------------------------%
95
+ aspectRatio = axisData .PlotBoxAspectRatio ;
96
+ cameraPosition = axisData .CameraPosition ;
97
+ dataAspectRatio = axisData .DataAspectRatio ;
98
+ cameraUpVector = axisData .CameraUpVector ;
99
+ cameraEye = cameraPosition ;
96
100
97
- % -camera eye-%
98
- ey = obj .PlotOptions .CameraEye ;
101
+ rangeXLim = range(axisData .XLim );
102
+ rangeYLim = range(axisData .YLim );
103
+ rangeZLim = range(axisData .ZLim );
104
+ cameraEye = cameraEye ./[rangeXLim , rangeYLim rangeZLim ];
105
+ eyeNorm = max(abs(cameraEye )) - 1.4 ;
99
106
100
- if ~isempty( ey )
101
- if isvector( ey ) && length( ey ) == 3
102
- obj.layout.scene.camera.eye.x = ey( 1 );
103
- obj.layout.scene.camera.eye.y = ey( 2 );
104
- obj.layout.scene.camera.eye.z = ey( 3 ) ;
107
+ if strcmp( plotData . DisplayStyle , ' tile ' )
108
+ aspectRatio( 3 ) = 1e-6 ;
109
+ else
110
+ eyeNorm2 = min([norm(aspectRatio([ 1 , 3 ])), norm(aspectRatio([ 2 , 3 ]))] );
111
+ eyeNorm = eyeNorm - eyeNorm2 + 0.6 ;
105
112
end
106
- else
107
-
108
- % -define as default-%
109
- xey = - xar ; if xey > 0 xfac = - 0.2 ; else xfac = 0.2 ; end
110
- yey = - yar ; if yey > 0 yfac = - 0.2 ; else yfac = 0.2 ; end
111
- if zar > 0 zfac = 0.2 ; else zfac = - 0.2 ; end
112
-
113
- obj.layout.scene.camera.eye.x = xey + xfac * xey ;
114
- obj.layout.scene.camera.eye.y = yey + yfac * yey ;
115
- obj.layout.scene.camera.eye.z = zar + zfac * zar ;
116
- end
117
113
118
- % ---------------------------------------------------------------------%
114
+ cameraEye = cameraEye / eyeNorm ;
115
+
116
+ % -------------------------------------------------------------------------%
119
117
118
+ % -aspect ratio-%
119
+ scene.aspectratio.x = aspectRatio(1 );
120
+ scene.aspectratio.y = aspectRatio(2 );
121
+ scene.aspectratio.z = aspectRatio(3 );
120
122
121
- % -zerolines hidded -%
122
- obj.layout. scene.xaxis.zeroline = false ;
123
- obj.layout. scene.yaxis.zeroline = false ;
124
- obj.layout. scene.zaxis.zeroline = false ;
123
+ % -camera eye -%
124
+ scene.camera.eye.x = cameraEye( 1 ) ;
125
+ scene.camera.eye.y = cameraEye( 2 ) ;
126
+ scene.camera.eye.z = cameraEye( 3 ) ;
125
127
126
- % ---------------------------------------------------------------------%
128
+ % -camera up-%
129
+ scene.camera.up.x = cameraUpVector(1 );
130
+ scene.camera.up.y = cameraUpVector(2 );
131
+ scene.camera.up.z = cameraUpVector(3 );
127
132
128
- % -layout bargap-%
129
- obj.layout.bargap = bargap ;
133
+ % -------------------------------------------------------------------------%
130
134
131
- % -hist name-%
132
- obj.data{histIndex }.name = hist_data .DisplayName ;
135
+ % -get each scene axis-%
136
+ scene.xaxis = getSceneAxis(axisData , ' X' );
137
+ scene.yaxis = getSceneAxis(axisData , ' Y' );
138
+ scene.zaxis = getSceneAxis(axisData , ' Z' );
139
+
140
+ if strcmp(plotData .DisplayStyle , ' tile' )
141
+ scene.zaxis.visible = false ;
142
+ end
133
143
134
- % -hist visible-%
135
- obj.data{histIndex }.visible = strcmp(hist_data .Visible ,' on' );
144
+ % -------------------------------------------------------------------------%
136
145
137
- % ---------------------------------------------------------------------%
146
+ % -SET SCENE TO LAYOUT-%
147
+ obj.layout = setfield(obj .layout , sprintf(' scene%d ' , xSource ), scene );
138
148
149
+ % -------------------------------------------------------------------------%
139
150
end
140
151
152
+ function ax = getSceneAxis(axisData , axName )
153
+
154
+ % -initializations-%
155
+ axx = eval(sprintf(' axisData.%s Axis' , axName ));
156
+ ax.zeroline = false ;
157
+ ax.showline = true ;
158
+ ax.showspikes = true ;
159
+ ax.linecolor = getStringColor(255 * axx .Color );
160
+ ax.range = eval(sprintf(' date2NumData(axisData.%s Lim)' , axName ));
161
+
162
+ % -label-%
163
+ label = eval(sprintf(' axisData.%s Label' , axName ));
164
+ ax.title = label .String ;
165
+ if ~isempty(ax .title ), ax.title = parseString(ax .title ); end
166
+ ax.titlefont.size = label .FontSize ;
167
+ ax.titlefont.color = getStringColor(255 * label .Color );
168
+ ax.titlefont.family = matlab2plotlyfont(label .FontName );
169
+
170
+ % -ticks-%
171
+ ax.tickvals = axx .TickValues ;
172
+ ax.ticktext = axx .TickLabels ;
173
+
174
+ ax.tickcolor = getStringColor(255 * axx .Color );
175
+ ax.tickfont.size = axx .FontSize ;
176
+ ax.tickfont.family = matlab2plotlyfont(axx .FontName );
177
+
178
+ switch axx .TickDirection
179
+ case ' in'
180
+ ax.ticks = ' inside' ;
181
+ case ' out'
182
+ ax.ticks = ' outside' ;
183
+ end
184
+
185
+ % -grid-%
186
+ axGrid = eval(sprintf(' axisData.%s Grid' , axName ));
187
+ if strcmp(axGrid , ' off' ), ax.showgrid = false ; end
188
+
189
+ % -box-%
190
+ if strcmp(axisData .Box , ' on' ), ax.mirror = true ; end
191
+ end
141
192
142
- function bar_ = bar_data (position3d , size_ )
193
+ function bar_ = barData (position3d , size_ )
143
194
% position3d - 3-list or array of shape (3,) that represents the point of coords (x, y, 0), where a bar is placed
144
195
% size = a 3-tuple whose elements are used to scale a unit cube to get a paralelipipedic bar
145
196
% returns - an array of shape(8,3) representing the 8 vertices of a bar at position3d
167
218
bar_ = bar_ + position3d ; % translate each bar_ on the directio OP, with P=position3d
168
219
end
169
220
170
- function [vertices , I , J , K ] = triangulate_bar_faces (positions , sizes )
221
+ function [vertices , I , J , K ] = triangulateBarFaces (positions , sizes )
171
222
% positions - array of shape (N, 3) that contains all positions in the plane z=0, where a histogram bar is placed
172
223
% sizes - array of shape (N,3); each row represents the sizes to scale a unit cube to get a bar
173
224
% returns the array of unique vertices, and the lists i, j, k to be used in instantiating the go.Mesh3d class
183
234
c = 1 ;
184
235
for n = 1 : size(positions , 1 )
185
236
if sizes(n , 3 ) ~= 0
186
- all_bars(: ,: ,c ) = bar_data (positions(n ,: ), sizes(n ,: ))' ;
237
+ all_bars(: ,: ,c ) = barData (positions(n ,: ), sizes(n ,: ))' ;
187
238
c = c + 1 ;
188
239
end
189
240
end
190
241
191
- % all_bars = [bar_data (pos, size) for pos, size in zip(positions, sizes) if size[2]!=0]
242
+ % all_bars = [barData (pos, size) for pos, size in zip(positions, sizes) if size[2]!=0]
192
243
[r , q , p ] = size(all_bars );
193
244
194
245
% extract unique vertices from the list of all bar vertices
208
259
aux = ixr([1 + 8 * k + 2 , 1 + 8 * k , 1 + 8 * k + 5 , 1 + 8 * k , 1 + 8 * k + 7 , 1 + 8 * k , 1 + 8 * k + 2 , 1 + 8 * k + 5 , 1 + 8 * k + 6 , 1 + 8 * k + 3 , 1 + 8 * k + 5 , 1 + 8 * k + 7 ]);
209
260
K = [ K ; aux(: )];
210
261
end
211
-
212
262
end
213
263
214
- function [X , Y , Z , I , J , K ] = get_plotly_mesh3d (xedges , yedges , values , bargap )
264
+ function [X , Y , Z , I , J , K ] = getPlotlyMesh3d (xedges , yedges , values , bargap )
215
265
% x, y- array-like of shape (n,), defining the x, and y-ccordinates of data set for which we plot a 3d hist
216
266
217
267
xsize = xedges(2 )-xedges(1 )-bargap ;
233
283
sizes = [sizes ; xsize , ysize , h(n )];
234
284
end
235
285
236
- [vertices , I , J , K ] = triangulate_bar_faces (positions , sizes );
286
+ [vertices , I , J , K ] = triangulateBarFaces (positions , sizes );
237
287
X = vertices(: ,1 );
238
288
Y = vertices(: ,2 );
239
289
Z = vertices(: ,3 );
290
+ end
240
291
292
+ function colorScale = getColorScale(colorMap )
293
+ nColors = size(colorMap , 1 );
294
+ normInd = rescale([1 : nColors ], 0 , 1 );
295
+ colorScale = cell(nColors , 1 );
296
+
297
+ for n = 1 : nColors
298
+ colorScale{n } = {normInd(n ), getStringColor(255 * colorMap(n , : ))};
299
+ end
241
300
end
0 commit comments