1
+ function updateGeobubble(obj ,geoIndex )
2
+
3
+ % -AXIS INDEX-%
4
+ axIndex = obj .getAxisIndex(obj .State .Plot(geoIndex ).AssociatedAxis);
5
+
6
+ % -GET STRUCTURES-%
7
+ geoData = get(obj .State .Plot(geoIndex ).Handle);
8
+
9
+ % -CHECK FOR MULTIPLE AXES-%
10
+ [xsource , ysource ] = findSourceAxis(obj ,axIndex );
11
+
12
+ % -----------------------------------------------------------------------------%
13
+
14
+ % -PASE DATA-%
15
+ bubbleRange = geoData .BubbleWidthRange ;
16
+ allLats = geoData .LatitudeData ;
17
+ allLons = geoData .LongitudeData ;
18
+ allSizes = rescale(geoData .SizeData , bubbleRange(1 ), bubbleRange(2 ));
19
+
20
+ if ~isempty(geoData .ColorData )
21
+ allNames = geoData .ColorData ;
22
+
23
+ [groupNames , ~ , allNamesIdx ] = unique(allNames );
24
+ nGroups = length(groupNames );
25
+ byGroups = true ;
26
+
27
+ for g= 1 : nGroups
28
+
29
+ idx = g == allNamesIdx ;
30
+
31
+ group{g } = char(groupNames(g ));
32
+ lat{g } = allLats(idx );
33
+ lon{g } = allLons(idx );
34
+ sData{g } = allSizes(idx );
35
+
36
+ if length(lat{g }) < 2
37
+ lat{g } = [allLats(idx ); NaN ; NaN ];
38
+ lon{g } = [allLons(idx ); NaN ; NaN ];
39
+ sData{g } = [allSizes(idx ); NaN ; NaN ];
40
+ end
41
+
42
+ end
43
+
44
+ else
45
+ lat{1 } = allLats ;
46
+ lon{1 } = allLons ;
47
+ sData{1 } = allSizes ;
48
+ nGroups = 1 ;
49
+ byGroups = false ;
50
+ end
51
+
52
+ % -----------------------------------------------------------------------------%
53
+
54
+ % =============================================================================%
55
+ %
56
+ % -SETTING GEOBBUBLE PLOT-%
57
+ %
58
+ % =============================================================================%
59
+
60
+ for g = 1 : nGroups
61
+
62
+ % -------------------------------------------------------------------------%
63
+
64
+ % -get current trace index-%
65
+ p = geoIndex ;
66
+
67
+ if g > 1
68
+ obj.PlotOptions.nPlots = obj .PlotOptions .nPlots + 1 ;
69
+ p = obj .PlotOptions .nPlots ;
70
+ end
71
+
72
+ % -------------------------------------------------------------------------%
73
+
74
+ % -set scattergeo type-%
75
+ obj.data{p }.type = ' scattergeo' ;
76
+
77
+ % -------------------------------------------------------------------------%
78
+
79
+ % -set scattergeo mode-%
80
+ obj.data{p }.mode = ' markers' ;
81
+
82
+ % -------------------------------------------------------------------------%
83
+
84
+ % -set plot data-%
85
+ obj.data{p }.lat = lat{g };
86
+ obj.data{p }.lon = lon{g };
87
+
88
+ % -------------------------------------------------------------------------%
89
+
90
+ % -get marker setting-%
91
+ marker = struct();
92
+ marker.size = sData{g }*1.25 ;
93
+ marker.color = sprintf(' rgb(%f ,%f ,%f )' , 255 * geoData .BubbleColorList(g ,: ));
94
+ marker.line.color = ' rgb(255, 255, 255)' ;
95
+
96
+ % -------------------------------------------------------------------------%
97
+
98
+ % -set marker field-%
99
+ obj.data{p }.marker = marker ;
100
+
101
+ % -------------------------------------------------------------------------%
102
+
103
+ % -ASSOCIATE GEO-AXES LAYOUT-%
104
+ obj.data{p }.geo = sprintf(' geo%d ' , xsource + 1 );
105
+
106
+ % -------------------------------------------------------------------------%
107
+
108
+ % -legend-%
109
+ if byGroups
110
+ obj.data{p }.name = group{g };
111
+ obj.data{p }.legendgroup = obj.data{p }.name;
112
+ obj.data{p }.showlegend = true ;
113
+ end
114
+
115
+ % -------------------------------------------------------------------------%
116
+
117
+ end
118
+
119
+ % =============================================================================%
120
+ %
121
+ % -SETTING LAYOUT-%
122
+ %
123
+ % =============================================================================%
124
+
125
+ % -set domain geo plot-%
126
+ xo = geoData .Position(1 );
127
+ yo = geoData .Position(2 );
128
+ w = geoData .Position(3 );
129
+ h = geoData .Position(4 );
130
+
131
+ geo.domain.x = min([xo xo + w ],1 );
132
+ geo.domain.y = min([yo yo + h ],1 );
133
+
134
+ % -----------------------------------------------------------------------------%
135
+
136
+ % -setting projection-%
137
+ geo.projection.type = ' mercator' ;
138
+
139
+ % -----------------------------------------------------------------------------%
140
+
141
+ % -setting basemap-%
142
+ geo.framecolor = ' rgb(120,120,120)' ;
143
+
144
+ if strcmpi(geoData .Basemap , ' streets-light' )
145
+ geo.oceancolor = ' rgba(20,220,220,1)' ;
146
+ geo.landcolor = ' rgba(20,220,220,0.2)' ;
147
+ elseif strcmpi(geoData .Basemap , ' colorterrain' )
148
+ geo.oceancolor = ' rgba(118,165,225,0.6)' ;
149
+ geo.landcolor = ' rgba(190,180,170,1)' ;
150
+ geo.showcountries = true ;
151
+ geo.showlakes = true ;
152
+ end
153
+
154
+ geo.showocean = true ;
155
+ geo.showcoastlines = false ;
156
+ geo.showland = true ;
157
+
158
+ % -----------------------------------------------------------------------------%
159
+
160
+ % -setting latitude axis-%
161
+ geo.lataxis.range = geoData .LatitudeLimits ;
162
+
163
+ if strcmpi(geoData .GridVisible , ' on' )
164
+ geo.lataxis.showgrid = true ;
165
+ geo.lataxis.gridwidth = 0.5 ;
166
+ geo.lataxis.gridcolor = ' rgba(38.250000,38.250000,38.250000,0.150000)' ;
167
+ end
168
+
169
+ % -----------------------------------------------------------------------------%
170
+
171
+ % -setting longitude axis-%
172
+ geo.lonaxis.range = geoData .LongitudeLimits ;
173
+
174
+ if strcmpi(geoData .GridVisible , ' on' )
175
+ geo.lonaxis.showgrid = true ;
176
+ geo.lonaxis.gridwidth = 0.5 ;
177
+ geo.lonaxis.gridcolor = ' rgba(38.250000,38.250000,38.250000,0.150000)' ;
178
+ end
179
+
180
+ % -----------------------------------------------------------------------------%
181
+
182
+ % -set map center-%
183
+ geo.center.lat = geoData .MapCenter(1 );
184
+ geo.center.lon = geoData .MapCenter(2 );
185
+
186
+ % -----------------------------------------------------------------------------%
187
+
188
+ % -set better resolution-%
189
+ geo.resolution = ' 50' ;
190
+
191
+ % -----------------------------------------------------------------------------%
192
+
193
+ % -set geo axes to layout-%
194
+ obj.layout = setfield(obj .layout , sprintf(' geo%d ' , xsource + 1 ), geo );
195
+
196
+ % -----------------------------------------------------------------------------%
197
+
198
+ % -remove any annotation text-%
199
+ istitle = length(geoData .Title ) > 0 ;
200
+ obj.layout.annotations{1 }.text = ' ' ;
201
+ obj.layout.annotations{1 }.showarrow = false ;
202
+
203
+ % -----------------------------------------------------------------------------%
204
+
205
+ % -layout title-%
206
+ if istitle
207
+ obj.layout.annotations{1 }.text = sprintf(' <b>%s </b>' , geoData .Title );
208
+ obj.layout.annotations{1 }.xref = ' paper' ;
209
+ obj.layout.annotations{1 }.yref = ' paper' ;
210
+ obj.layout.annotations{1 }.yanchor = ' top' ;
211
+ obj.layout.annotations{1 }.xanchor = ' middle' ;
212
+ obj.layout.annotations{1 }.x = mean(geo .domain .x );
213
+ obj.layout.annotations{1 }.y = 0.96 ;
214
+ obj.layout.annotations{1 }.font.color = ' black' ;
215
+ obj.layout.annotations{1 }.font.family = matlab2plotlyfont(geoData .FontName );
216
+ obj.layout.annotations{1 }.font.size = 1.5 * geoData .FontSize ;
217
+ end
218
+
219
+ % -----------------------------------------------------------------------------%
220
+
221
+ % -setting legend-%
222
+ if byGroups
223
+ obj.layout.showlegend = true ;
224
+ obj.layout.legend.borderwidth = 1 ;
225
+ obj.layout.legend.bordercolor = ' rgba(0,0,0,0.2)' ;
226
+ obj.layout.legend.font.family = matlab2plotlyfont(geoData .FontName );
227
+ obj.layout.legend.font.size = 1.0 * geoData .FontSize ;
228
+
229
+ if length(geoData .ColorLegendTitle ) > 0
230
+ obj.layout.legend.title.text = sprintf(' <b>%s </b>' , geoData .ColorLegendTitle );
231
+ obj.layout.legend.title.side = ' top' ;
232
+ obj.layout.legend.title.font.family = matlab2plotlyfont(geoData .FontName );
233
+ obj.layout.legend.title.font.size = 1.2 * geoData .SizeLegendTitle ;
234
+ obj.layout.legend.title.font.color = ' black' ;
235
+ end
236
+
237
+ obj.layout.legend.x = geo .domain .x(end ) * 0.980 ;
238
+ obj.layout.legend.y = geo .domain .y(end ) * 1.001 ;
239
+ obj.layout.legend.xanchor = ' left' ;
240
+ obj.layout.legend.yanchor = ' top' ;
241
+ obj.layout.legend.itemsizing = ' constant' ;
242
+ obj.layout.legend.itemwidth = 30 ;
243
+ obj.layout.legend.tracegroupgap = 0.01 ;
244
+ obj.layout.legend.traceorder = ' normal' ;
245
+ obj.layout.legend.valign = ' middle' ;
246
+ end
247
+
248
+ % -----------------------------------------------------------------------------%
249
+ end
0 commit comments