Closed
Description
In [30]: df = pd.DataFrame(dict(a=['A', 'B', 'C'], b=[2, 3, 4]))
In [31]: plt.scatter(df['a'], df['b'])
Out[31]: <matplotlib.collections.PathCollection at 0x7f17e17b41d0>
This works, and produces this:
On the other hand, this doesn't:
In [32]: df.plot.scatter(x='a', y='b')
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
/data/documents/uni/phd/projects/FluxnetTrafficLights/scripts/plots/predictability_plots.py in <module>()
----> 1 df.plot.scatter(x='a', y='b')
~/miniconda3/envs/science/lib/python3.6/site-packages/pandas/plotting/_core.py in scatter(self, x, y, s, c, **kwds)
2803 axes : matplotlib.AxesSubplot or np.array of them
2804 """
-> 2805 return self(kind='scatter', x=x, y=y, c=c, s=s, **kwds)
2806
2807 def hexbin(self, x, y, C=None, reduce_C_function=None, gridsize=None,
~/miniconda3/envs/science/lib/python3.6/site-packages/pandas/plotting/_core.py in __call__(self, x, y, kind, ax, subplots, sharex, sharey, layout, figsize, use_index, title, grid, legend, style, logx, logy, loglog, xticks, yticks, xlim, ylim, rot, fontsize, colormap, table, yerr, xerr, secondary_y, sort_columns, **kwds)
2625 fontsize=fontsize, colormap=colormap, table=table,
2626 yerr=yerr, xerr=xerr, secondary_y=secondary_y,
-> 2627 sort_columns=sort_columns, **kwds)
2628 __call__.__doc__ = plot_frame.__doc__
2629
~/miniconda3/envs/science/lib/python3.6/site-packages/pandas/plotting/_core.py in plot_frame(data, x, y, kind, ax, subplots, sharex, sharey, layout, figsize, use_index, title, grid, legend, style, logx, logy, loglog, xticks, yticks, xlim, ylim, rot, fontsize, colormap, table, yerr, xerr, secondary_y, sort_columns, **kwds)
1867 yerr=yerr, xerr=xerr,
1868 secondary_y=secondary_y, sort_columns=sort_columns,
-> 1869 **kwds)
1870
1871
~/miniconda3/envs/science/lib/python3.6/site-packages/pandas/plotting/_core.py in _plot(data, x, y, subplots, ax, kind, **kwds)
1650 if isinstance(data, DataFrame):
1651 plot_obj = klass(data, x=x, y=y, subplots=subplots, ax=ax,
-> 1652 kind=kind, **kwds)
1653 else:
1654 raise ValueError("plot kind %r can only be used for data frames"
~/miniconda3/envs/science/lib/python3.6/site-packages/pandas/plotting/_core.py in __init__(self, data, x, y, s, c, **kwargs)
808 # the handling of this argument later
809 s = 20
--> 810 super(ScatterPlot, self).__init__(data, x, y, s=s, **kwargs)
811 if is_integer(c) and not self.data.columns.holds_integer():
812 c = self.data.columns[c]
~/miniconda3/envs/science/lib/python3.6/site-packages/pandas/plotting/_core.py in __init__(self, data, x, y, **kwargs)
783 y = self.data.columns[y]
784 if len(self.data[x]._get_numeric_data()) == 0:
--> 785 raise ValueError(self._kind + ' requires x column to be numeric')
786 if len(self.data[y]._get_numeric_data()) == 0:
787 raise ValueError(self._kind + ' requires y column to be numeric')
ValueError: scatter requires x column to be numeric
Why does pandas require x to be numeric if matplotlib doesn't?
using versions from conda, on Kubuntu 17.10:
matplotlib 2.1.0 py36hba5de38_0
pandas 0.20.3 py36_0
python 3.6.3 h0ef2715_3