@@ -192,20 +192,24 @@ function plotOne(gd, plotinfo, cdSubplot, transitionOpts, makeOnCompleteCallback
192192 // remaining plot traces should also be able to do this. Once implemented,
193193 // we won't need this - which should sometimes be a big speedup.
194194 if ( plotinfo . plot ) {
195- plotinfo . plot . selectAll ( 'g:not(.scatterlayer)' ) . selectAll ( 'g.trace' ) . remove ( ) ;
195+ plotinfo . plot . selectAll ( 'g:not(.scatterlayer):not(.ohlclayer) ' ) . selectAll ( 'g.trace' ) . remove ( ) ;
196196 }
197197
198198 // plot all traces for each module at once
199199 for ( var j = 0 ; j < modules . length ; j ++ ) {
200200 var _module = modules [ j ] ;
201201
202202 // skip over non-cartesian trace modules
203- if ( _module . basePlotModule . name !== 'cartesian' ) continue ;
203+ if ( ! _module . plot || _module . basePlotModule . name !== 'cartesian' ) continue ;
204204
205205 // plot all traces of this type on this subplot at once
206- var cdModule = getModuleCalcData ( cdSubplot , _module ) ;
206+ var cdModuleAndOthers = getModuleCalcData ( cdSubplot , _module ) ;
207+ var cdModule = cdModuleAndOthers [ 0 ] ;
208+ // don't need to search the found traces again - in fact we need to NOT
209+ // so that if two modules share the same plotter we don't double-plot
210+ cdSubplot = cdModuleAndOthers [ 1 ] ;
207211
208- if ( _module . plot ) _module . plot ( gd , plotinfo , cdModule , transitionOpts , makeOnCompleteCallback ) ;
212+ _module . plot ( gd , plotinfo , cdModule , transitionOpts , makeOnCompleteCallback ) ;
209213 }
210214}
211215
@@ -215,6 +219,7 @@ exports.clean = function(newFullData, newFullLayout, oldFullData, oldFullLayout)
215219 var oldPlots = oldFullLayout . _plots || { } ;
216220
217221 var hadScatter , hasScatter ;
222+ var hadOHLC , hasOHLC ;
218223 var hadGl , hasGl ;
219224 var i , k , subplotInfo , moduleName ;
220225
@@ -232,28 +237,36 @@ exports.clean = function(newFullData, newFullLayout, oldFullData, oldFullLayout)
232237 moduleName = oldModules [ i ] . name ;
233238 if ( moduleName === 'scatter' ) hadScatter = true ;
234239 else if ( moduleName === 'scattergl' ) hadGl = true ;
240+ else if ( moduleName === 'ohlc' ) hadOHLC = true ;
235241 }
236242
237243 for ( i = 0 ; i < newModules . length ; i ++ ) {
238244 moduleName = newModules [ i ] . name ;
239245 if ( moduleName === 'scatter' ) hasScatter = true ;
240246 else if ( moduleName === 'scattergl' ) hasGl = true ;
247+ else if ( moduleName === 'ohlc' ) hasOHLC = true ;
241248 }
242249
243- if ( hadScatter && ! hasScatter ) {
244- for ( k in oldPlots ) {
245- subplotInfo = oldPlots [ k ] ;
246- if ( subplotInfo . plot ) {
247- subplotInfo . plot . select ( 'g.scatterlayer' )
248- . selectAll ( 'g.trace' )
249- . remove ( ) ;
250+ var layersToEmpty = [ ] ;
251+ if ( hadScatter && ! hasScatter ) layersToEmpty . push ( 'g.scatterlayer' ) ;
252+ if ( hadOHLC && ! hasOHLC ) layersToEmpty . push ( 'g.ohlclayer' ) ;
253+
254+ if ( layersToEmpty . length ) {
255+ for ( var layeri = 0 ; layeri < layersToEmpty . length ; layeri ++ ) {
256+ for ( k in oldPlots ) {
257+ subplotInfo = oldPlots [ k ] ;
258+ if ( subplotInfo . plot ) {
259+ subplotInfo . plot . select ( layersToEmpty [ layeri ] )
260+ . selectAll ( 'g.trace' )
261+ . remove ( ) ;
262+ }
250263 }
251- }
252264
253- oldFullLayout . _infolayer . selectAll ( 'g.rangeslider-container' )
254- . select ( 'g.scatterlayer' )
255- . selectAll ( 'g.trace' )
256- . remove ( ) ;
265+ oldFullLayout . _infolayer . selectAll ( 'g.rangeslider-container' )
266+ . select ( layersToEmpty [ layeri ] )
267+ . selectAll ( 'g.trace' )
268+ . remove ( ) ;
269+ }
257270 }
258271
259272 if ( hadGl && ! hasGl ) {
0 commit comments