code: def _fast_plot_ica_properties(
      ica,
      inst,
      picks=None,
      axes=None,
      dB=True,
      plot_std=True,
      log_scale=False,
      topomap_args=None,
      image_args=None,
      psd_args=None,
      figsize=None,
      show=True,
      reject="auto",
      precomputed_data=None,
      reject_by_annotation=True,
      *,
      verbose=None,
  ):
      """Display component properties."""
      from ..preprocessing import ICA
  
      # input checks and defaults
      # -------------------------
      _validate_type(ica, ICA, "ica", "ICA")
      _validate_type(plot_std, (bool, "numeric"), "plot_std")
      if isinstance(plot_std, bool):
          num_std = 1.0 if plot_std else 0.0
      else:
          plot_std = True
      num_std = float(plot_std)
  
      limit = (
          min(5, ica.n_components_)
          if picks is None
          else ica.n_components_
      )
      picks = _picks_to_idx(
          ica.n_components_, picks, picks_on="components"
      )[:limit]
  
      if axes is None:
          fig, axes = _create_properties_layout(figsize=figsize)
      else:
          if len(picks) > 1:
              raise ValueError(
                  "Only a single pick can be drawn " "to a set of axes."
              )
          from .utils import _validate_if_list_of_axes
  
          _validate_if_list_of_axes(axes, obligatory_len=5)
          fig = axes[0].get_figure()
  
      psd_args = dict() if psd_args is None else psd_args
      topomap_args = dict() if topomap_args is None else topomap_args
      image_args = dict() if image_args is None else image_args
      image_args["ts_args"] = dict(
          truncate_xaxis=False, show_sensors=False
      )
      if plot_std:
          from ..stats.parametric import _parametric_ci
  
          image_args["ts_args"]["ci"] = _parametric_ci
      elif (
          "ts_args" not in image_args
          or "ci" not in image_args["ts_args"]
      ):
          image_args["ts_args"]["ci"] = False
  
      for item_name, item in (
          ("psd_args", psd_args),
          ("topomap_args", topomap_args),
          ("image_args", image_args),
      ):
          _validate_type(item, dict, item_name, "dictionary")
      _validate_type(dB, (bool, None), "dB")
      _validate_type(log_scale, (bool, None), "log_scale")
  
      # calculations
      # ------------
      if isinstance(precomputed_data, tuple):
          kind, dropped_indices, epochs_src, data = precomputed_data
      else:
          (
              kind,
              dropped_indices,
              epochs_src,
              data,
          ) = _prepare_data_ica_properties(
              inst, ica, reject_by_annotation, reject
          )
      del reject
      ica_data = np.swapaxes(data[:, picks, :], 0, 1)
      dropped_src = ica_data
  
      # spectrum
      Nyquist = inst.info["sfreq"] / 2.0
      lp = inst.info["lowpass"]
      if "fmax" not in psd_args:
          psd_args["fmax"] = min(lp * 1.25, Nyquist)
      plot_lowpass_edge = lp < Nyquist and (psd_args["fmax"] > lp)
      spectrum = epochs_src.compute_psd(picks=picks, **psd_args)
      # we've already restricted picks  ↑↑↑↑↑↑↑↑↑↑↑
      # in the spectrum object, so here we do picks=all  ↓↓↓↓↓↓↓↓↓↓↓
      psds, freqs = spectrum.get_data(
          return_freqs=True, picks="all", exclude=[]
      )
      # we also pass exclude=[] so that when this is called by right-clicking in
      # a plot_sources() window on an ICA component name that has been marked as
      # bad, we can still get a plot of it.
  
      def set_title_and_labels(ax, title, xlab, ylab):
          if title:
              ax.set_title(title)
          if xlab:
              ax.set_xlabel(xlab)
          if ylab:
              ax.set_ylabel(ylab)
          ax.axis("auto")
          ax.tick_params("both", labelsize=8)
          ax.axis("tight")
  
      # plot
      # ----
      all_fig = list()
      for idx, pick in enumerate(picks):
          # calculate component-specific spectrum stuff
          psd_ylabel, psds_mean, spectrum_std = _get_psd_label_and_std(
              psds[:, idx, :].copy(), dB, ica, num_std
          )
  
          # if more than one component, spawn additional figures and axes
          if idx > 0:
              fig, axes = _create_properties_layout(figsize=figsize)
  
          # we reconstruct an epoch_variance with 0 where indexes where dropped
          epoch_var = np.var(ica_data[idx], axis=1)
          drop_var = np.var(dropped_src[idx], axis=1)
          drop_indices_corrected = (
              dropped_indices - np.arange(len(dropped_indices))
          ).astype(int)
          epoch_var = np.insert(
              arr=epoch_var,
              obj=drop_indices_corrected,
              values=drop_var[dropped_indices],
              axis=0,
          )
  
          # the actual plot
          fig = _plot_ica_properties(
              pick,
              ica,
              inst,
              psds_mean,
              freqs,
              ica_data.shape[1],
              epoch_var,
              plot_lowpass_edge,
              epochs_src,
              set_title_and_labels,
              plot_std,
              psd_ylabel,
              spectrum_std,
              log_scale,
              topomap_args,
              image_args,
              fig,
              axes,
              kind,
              dropped_indices,
          )
          all_fig.append(fig)
  
      plt_show(show)
      return all_fig
  
imports: import warnings
  from functools import partial
  import numpy
  from scipy.stats import gaussian_kde
  from .._fiff.meas_info import create_info
  from .._fiff.pick import _picks_to_idx, pick_types
  from .._fiff.proj import _has_eeg_average_ref_proj
  from ..defaults import DEFAULTS, _handle_default
  from ..utils import _reject_data_segments, _validate_type, fill_doc, verbose
  from .epochs import plot_epochs_image
  from .evoked import _butterfly_on_button_press, _butterfly_onpick
  from .topomap import _plot_ica_topomap
  from .utils import _compute_scalings, _convert_psds, _get_cmap, _get_plot_ch_type, _handle_precompute, _make_event_color_dict, plt_show
label_desc: Use image node_id 6 for calling a global function with example usage: _fast_plot_ica_properties(ica, inst, picks, axes, dB, plot_std, log_scale, topomap_args, image_args, psd_args, figsize, show, reject, precomputed_data, reject_by_annotation) and returns: all_fig