docs: private synchronized void reinitialize() {
      if(plot == null) {
        initializePlot();
      }
      else {
        final ActionEvent ev = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, OVERVIEW_REFRESHING);
        for(ActionListener actionListener : actionListeners) {
          actionListener.actionPerformed(ev);
        }
      }
  
      // Detach existing elements:
      for(Pair<Element, Visualization> pair : vistoelem.values()) {
        SVGUtil.removeFromParent(pair.first);
      }
      plotmap = arrangeVisualizations(ratio, 1.0);
  
      recalcViewbox();
      final int thumbsize = (int) Math.max(screenwidth / plotmap.getWidth(), screenheight / plotmap.getHeight());
      // TODO: cancel pending thumbnail requests!
  
      // Replace the layer map
      LayerMap oldlayers = vistoelem;
      vistoelem = new LayerMap();
  
      // Redo main layers
      SVGUtil.removeFromParent(plotlayer);
      SVGUtil.removeFromParent(hoverlayer);
      plotlayer = plot.svgElement(SVGConstants.SVG_G_TAG);
      hoverlayer = plot.svgElement(SVGConstants.SVG_G_TAG);
      hoverlayer.setAttribute(SVGPlot.NO_EXPORT_ATTRIBUTE, SVGPlot.NO_EXPORT_ATTRIBUTE);
  
      // Redo the layout
      for(Entry<PlotItem, double[]> e : plotmap.entrySet()) {
        final double basex = e.getValue()[0];
        final double basey = e.getValue()[1];
        for(Iterator<PlotItem> iter = e.getKey().itemIterator(); iter.hasNext();) {
          PlotItem it = iter.next();
  
          boolean hasDetails = false;
          // Container element for main plot item
          Element g = plot.svgElement(SVGConstants.SVG_G_TAG);
          SVGUtil.setAtt(g, SVGConstants.SVG_TRANSFORM_ATTRIBUTE, "translate(" + (basex + it.x) + " " + (basey + it.y) + ")");
          plotlayer.appendChild(g);
          vistoelem.put(it, null, g, null);
          // Add the actual tasks:
          for(VisualizationTask task : it.tasks) {
            if(!visibleInOverview(task)) {
              continue;
            }
            hasDetails |= !task.has(RenderFlag.NO_DETAIL);
            Pair<Element, Visualization> pair = oldlayers.remove(it, task);
            if(pair == null) {
              pair = new Pair<>(plot.svgElement(SVGConstants.SVG_G_TAG), null);
            }
            if(pair.second == null) {
              pair.second = embedOrThumbnail(thumbsize, it, task, pair.first);
            }
            g.appendChild(pair.first);
            vistoelem.put(it, task, pair);
          }
          // When needed, add a hover effect
          if(hasDetails && !single) {
            Element hover = plot.svgRect(basex + it.x, basey + it.y, it.w, it.h);
            SVGUtil.addCSSClass(hover, selcss.getName());
            // link hoverer.
            EventTarget targ = (EventTarget) hover;
            targ.addEventListener(SVGConstants.SVG_MOUSEOVER_EVENT_TYPE, hoverer, false);
            targ.addEventListener(SVGConstants.SVG_MOUSEOUT_EVENT_TYPE, hoverer, false);
            targ.addEventListener(SVGConstants.SVG_CLICK_EVENT_TYPE, hoverer, false);
            targ.addEventListener(SVGConstants.SVG_CLICK_EVENT_TYPE, (evt) -> triggerSubplotSelectEvent(it), false);
  
            hoverlayer.appendChild(hover);
          }
        }
      }
      for(Pair<Element, Visualization> pair : oldlayers.values()) {
        if(pair.second != null) {
          pair.second.destroy();
        }
      }
      plot.getRoot().appendChild(plotlayer);
      plot.getRoot().appendChild(hoverlayer);
      plot.updateStyleElement();
  
      // Notify listeners.
      final ActionEvent ev = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, OVERVIEW_REFRESHED);
      for(ActionListener actionListener : actionListeners) {
        actionListener.actionPerformed(ev);
      }
    }