From e1f962f053715f437b0f5ac0de85017459b9e57d Mon Sep 17 00:00:00 2001 From: Justin Zheng Date: Sun, 23 Dec 2018 09:31:01 -0800 Subject: [PATCH] ENH GH11978 access pd.plotting._misc from plot accessor (#23811) --- doc/source/whatsnew/v0.24.0.rst | 1 + pandas/plotting/_core.py | 23 +++++++++++++++++++++++ pandas/tests/plotting/test_frame.py | 16 ++++++++++++++++ pandas/tests/plotting/test_series.py | 13 +++++++++++++ 4 files changed, 53 insertions(+) diff --git a/doc/source/whatsnew/v0.24.0.rst b/doc/source/whatsnew/v0.24.0.rst index 724cfddb1b94c0..a2abda019812a2 100644 --- a/doc/source/whatsnew/v0.24.0.rst +++ b/doc/source/whatsnew/v0.24.0.rst @@ -371,6 +371,7 @@ Other Enhancements - :meth:`MultiIndex.to_flat_index` has been added to flatten multiple levels into a single-level :class:`Index` object. - :meth:`DataFrame.to_stata` and :class:`pandas.io.stata.StataWriter117` can write mixed sting columns to Stata strl format (:issue:`23633`) - :meth:`DataFrame.between_time` and :meth:`DataFrame.at_time` have gained the an ``axis`` parameter (:issue:`8839`) +- The ``scatter_matrix``, ``andrews_curves``, ``parallel_coordinates``, ``lag_plot``, ``autocorrelation_plot``, ``bootstrap_plot``, and ``radviz`` plots from the ``pandas.plotting`` module are now accessible from calling :meth:`DataFrame.plot` (:issue:`11978`) - :class:`IntervalIndex` has gained the :attr:`~IntervalIndex.is_overlapping` attribute to indicate if the ``IntervalIndex`` contains any overlapping intervals (:issue:`23309`) .. _whatsnew_0240.api_breaking: diff --git a/pandas/plotting/_core.py b/pandas/plotting/_core.py index 846d1f35027529..38807d921c8291 100644 --- a/pandas/plotting/_core.py +++ b/pandas/plotting/_core.py @@ -26,6 +26,7 @@ from pandas.core.generic import _shared_doc_kwargs, _shared_docs from pandas.io.formats.printing import pprint_thing +from pandas.plotting import _misc as misc from pandas.plotting._compat import _mpl_ge_3_0_0 from pandas.plotting._style import _get_standard_colors, plot_params from pandas.plotting._tools import ( @@ -2905,6 +2906,15 @@ def pie(self, **kwds): """ return self(kind='pie', **kwds) + def lag(self, *args, **kwds): + return misc.lag_plot(self._parent, *args, **kwds) + + def autocorrelation(self, *args, **kwds): + return misc.autocorrelation_plot(self._parent, *args, **kwds) + + def bootstrap(self, *args, **kwds): + return misc.bootstrap_plot(self._parent, *args, **kwds) + class FramePlotMethods(BasePlotMethods): """DataFrame plotting accessor and method @@ -3600,3 +3610,16 @@ def hexbin(self, x, y, C=None, reduce_C_function=None, gridsize=None, if gridsize is not None: kwds['gridsize'] = gridsize return self(kind='hexbin', x=x, y=y, C=C, **kwds) + + def scatter_matrix(self, *args, **kwds): + return misc.scatter_matrix(self._parent, *args, **kwds) + + def andrews_curves(self, class_column, *args, **kwds): + return misc.andrews_curves(self._parent, class_column, *args, **kwds) + + def parallel_coordinates(self, class_column, *args, **kwds): + return misc.parallel_coordinates(self._parent, class_column, + *args, **kwds) + + def radviz(self, class_column, *args, **kwds): + return misc.radviz(self._parent, class_column, *args, **kwds) diff --git a/pandas/tests/plotting/test_frame.py b/pandas/tests/plotting/test_frame.py index 4e047cd44c1e28..350d1bb153274a 100644 --- a/pandas/tests/plotting/test_frame.py +++ b/pandas/tests/plotting/test_frame.py @@ -2988,6 +2988,22 @@ def test_secondary_axis_font_size(self, method): self._check_ticks_props(axes=ax.right_ax, ylabelsize=fontsize) + def test_misc_bindings(self, mock): + df = pd.DataFrame(randn(10, 10), columns=list('abcdefghij')) + p1 = mock.patch('pandas.plotting._misc.scatter_matrix', + return_value=2) + p2 = mock.patch('pandas.plotting._misc.andrews_curves', + return_value=2) + p3 = mock.patch('pandas.plotting._misc.parallel_coordinates', + return_value=2) + p4 = mock.patch('pandas.plotting._misc.radviz', + return_value=2) + with p1, p2, p3, p4: + assert df.plot.scatter_matrix() == 2 + assert df.plot.andrews_curves('a') == 2 + assert df.plot.parallel_coordinates('a') == 2 + assert df.plot.radviz('a') == 2 + def _generate_4_axes_via_gridspec(): import matplotlib.pyplot as plt diff --git a/pandas/tests/plotting/test_series.py b/pandas/tests/plotting/test_series.py index cc8aa2018b1a07..b5c69bb9e64433 100644 --- a/pandas/tests/plotting/test_series.py +++ b/pandas/tests/plotting/test_series.py @@ -877,3 +877,16 @@ def test_custom_business_day_freq(self): freq=CustomBusinessDay(holidays=['2014-05-26']))) _check_plot_works(s.plot) + + def test_misc_bindings(self, mock): + s = Series(randn(10)) + p1 = mock.patch('pandas.plotting._misc.lag_plot', + return_value=2) + p2 = mock.patch('pandas.plotting._misc.autocorrelation_plot', + return_value=2) + p3 = mock.patch('pandas.plotting._misc.bootstrap_plot', + return_value=2) + with p1, p2, p3: + assert s.plot.lag() == 2 + assert s.plot.autocorrelation() == 2 + assert s.plot.bootstrap() == 2