docs: def draw_hist(self, metric, title=""):
          """Draw a series of histograms of the selected keys over different
          training steps.
          """
          # TODO: assert isinstance(list(values.values())[0], np.ndarray)
  
          rows = 1
          cols = 1
          limit = 10  # max steps to show
  
          # We need a 3D projection Subplot, so ignore the one provided to
          # as an create a new one.
          ax = self.figure.add_subplot(self.gs, projection="3d")
          ax.view_init(30, -80)
  
          # Compute histograms
          verts = []
          area_colors = []
          edge_colors = []
          for i, s in enumerate(metric.steps[-limit:]):
              hist, edges = np.histogram(metric.data[-i-1:])
              # X is bin centers
              x = np.diff(edges)/2 + edges[:-1]
              # Y is hist values
              y = hist
              x = np.concatenate([x[0:1], x, x[-1:]])
              y = np.concatenate([[0], y, [0]])
  
              # Ranges
              if i == 0:
                  x_min = x.min()
                  x_max = x.max()
                  y_min = y.min()
                  y_max = y.max()
              x_min = np.minimum(x_min, x.min())
              x_max = np.maximum(x_max, x.max())
              y_min = np.minimum(y_min, y.min())
              y_max = np.maximum(y_max, y.max())
  
              alpha = 0.8 * (i+1) / min(limit, len(metric.steps))
              verts.append(list(zip(x, y)))
              area_colors.append(np.array(self.theme["hist_color"] + [alpha]))
              edge_colors.append(np.array(self.theme["hist_outline_color"] + [alpha]))
  
          poly = PolyCollection(verts, facecolors=area_colors, edgecolors=edge_colors)
          ax.add_collection3d(poly, zs=list(range(min(limit, len(metric.steps)))), zdir='y')
  
          ax.set_xlim(x_min, x_max)
          ax.set_ylim(0, limit)
          ax.set_yticklabels(metric.formatted_steps[-limit:])
          ax.set_zlim(y_min, y_max)
          ax.set_title(metric.name)