title: Subclassing pandas.plotting._core.PlanePlot results in ValueError
body: <h2>Background</h2>
  <p>I'm trying to add my own plotting methods to <code>pandas.DataFrame.plot</code> in the example below I've copied and pasted the <a href="https://github.com/pandas-dev/pandas/blob/8a5830305d2d9a087fbe46bd968218104ffdfc49/pandas/plotting/_core.py#L829" rel="nofollow noreferrer"><code>ScatterPlot</code></a> from pandas and changed the name to <code>VscatterPlot</code>. Then I've added that class along with it's <a href="https://github.com/pandas-dev/pandas/blob/8a5830305d2d9a087fbe46bd968218104ffdfc49/pandas/plotting/_core.py#L3152" rel="nofollow noreferrer">corresponding helper function</a> to <code>pandas.DataFrame.plot</code> into their respective positions (see below).</p>
  <h2>Example class <code>VscatterPlot</code></h2>
  <pre><code>import pandas
  import numpy as np
  
  
  class VscatterPlot(pandas.plotting._core.PlanePlot):
      _kind = 'vscatter'
  
      def __init__(self, data, x, y, s=None, c=None, **kwargs):
          if s is None:
              # hide the matplotlib default for size, in case we want to change
              # the handling of this argument later
              s = 20
          
          super(VscatterPlot, self).__init__(data, x, y, s=s, **kwargs)
          
          if is_integer(c) and not self.data.columns.holds_integer():
              c = self.data.columns[c]
          
          self.c = c
  
      def _make_plot(self):
          x, y, c, data = self.x, self.y, self.c, self.data
          ax = self.axes[0]
  
          c_is_column = is_hashable(c) and c in self.data.columns
  
          # plot a colorbar only if a colormap is provided or necessary
          cb = self.kwds.pop('colorbar', self.colormap or c_is_column)
  
          # pandas uses colormap, matplotlib uses cmap.
          cmap = self.colormap or 'Greys'
          cmap = self.plt.cm.get_cmap(cmap)
          color = self.kwds.pop(&quot;color&quot;, None)
          
          if c is not None and color is not None:
              raise TypeError('Specify exactly one of `c` and `color`')
          
          elif c is None and color is None:
              c_values = self.plt.rcParams['patch.facecolor']
          
          elif color is not None:
              c_values = color
          
          elif c_is_column:
              c_values = self.data[c].values
          
          else:
              c_values = c
  
          if self.legend and hasattr(self, 'label'):
              label = self.label
          
          else:
              label = None
          
          scatter = ax.scatter(data[x].values, data[y].values, c=c_values,
                               label=label, cmap=cmap, **self.kwds)
          
          if cb:
              img = ax.collections[0]
              kws = dict(ax=ax)
              if self.mpl_ge_1_3_1():
                  kws['label'] = c if c_is_column else ''
              self.fig.colorbar(img, **kws)
  
          if label is not None:
              self._add_legend_handle(scatter, label)
          
          else:
              self.legend = False
  
          errors_x = self._get_errorbars(label=x, index=0, yerr=False)
          errors_y = self._get_errorbars(label=y, index=0, xerr=False)
          
          if len(errors_x) &gt; 0 or len(errors_y) &gt; 0:
              err_kwds = dict(errors_x, **errors_y)
              err_kwds['ecolor'] = scatter.get_facecolor()[0]
              ax.errorbar(data[x].values, data[y].values,
                          linestyle='none', **err_kwds)
  </code></pre>
  <h2>Amending the pandas.plotting._core</h2>
  <pre><code># Set VscatterPlot as an attribute of pandas.plotting._core
  setattr(pandas.plotting._core, &quot;VscatterPlot&quot;, VscatterPlot)
  
  # Create the vscatter helper function
  def vscatter(self, x, y, s=None, c=None, **kwds):
      return self(kind='vscatter', x=x, y=y, c=c, s=s, **kwds)
  
  # Set the helper function
  setattr(pandas.plotting._core.FramePlotMethods, &quot;vscatter&quot;, vscatter)
  
  # Append the class to pandas.plotting._core._klasses
  pandas.plotting._core._klasses.append(pandas.plotting._core.VscatterPlot)
  
  # Add the class to the pandas.plotting._core._plot_klass dict
  pandas.plotting._core._plot_klass[VscatterPlot._kind] = pandas.plotting._core.VscatterPlot
  </code></pre>
  <h2>Testing</h2>
  <pre><code>example = pandas.DataFrame(np.random.random((5,2)), columns=[&quot;x&quot;, &quot;y&quot;])
  example.plot.vscatter(x=&quot;x&quot;, y=&quot;y&quot;)
  </code></pre>
  <h2>Output</h2>
  <pre><code>ValueError: 'vscatter' is not a valid plot kind
  </code></pre>
  <h2>Question</h2>
  <p>What am I missing here? <code>vscatter</code> is in <code>pandas.plotting._core._plot_klass</code> so why is it throwing this ValueError?</p>