diff --git a/doc/source/whatsnew/v1.5.0.rst b/doc/source/whatsnew/v1.5.0.rst index 73dc832e2007b..fdcba34a7ae42 100644 --- a/doc/source/whatsnew/v1.5.0.rst +++ b/doc/source/whatsnew/v1.5.0.rst @@ -577,6 +577,7 @@ Plotting - Bug in :meth:`DataFrame.boxplot` that prevented passing in ``xlabel`` and ``ylabel`` (:issue:`45463`) - Bug in :meth:`DataFrame.boxplot` that prevented specifying ``vert=False`` (:issue:`36918`) - Bug in :meth:`DataFrame.plot.scatter` that prevented specifying ``norm`` (:issue:`45809`) +- The function :meth:`DataFrame.plot.scatter` now accepts ``color`` as an alias for ``c`` and ``size`` as an alias for ``s`` for consistency to other plotting functions (:issue:`44670`) Groupby/resample/rolling ^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/pandas/plotting/_core.py b/pandas/plotting/_core.py index 5ade5501d47e4..29110f63787a6 100644 --- a/pandas/plotting/_core.py +++ b/pandas/plotting/_core.py @@ -1615,6 +1615,11 @@ def scatter(self, x, y, s=None, c=None, **kwargs): .. versionchanged:: 1.1.0 + size : str, scalar or array-like, optional + Alias for s. + + .. versionadded:: 1.5.0 + c : str, int or array-like, optional The color of each point. Possible values are: @@ -1628,6 +1633,10 @@ def scatter(self, x, y, s=None, c=None, **kwargs): - A column name or position whose values will be used to color the marker points according to a colormap. + color : str, int or array-like, optional + Alias for c. + + .. versionadded:: 1.5.0 **kwargs Keyword arguments to pass on to :meth:`DataFrame.plot`. @@ -1666,7 +1675,19 @@ def scatter(self, x, y, s=None, c=None, **kwargs): ... c='species', ... colormap='viridis') """ - return self(kind="scatter", x=x, y=y, s=s, c=c, **kwargs) + size = kwargs.pop("size", None) + if s is not None and size is not None: + raise TypeError("Specify exactly one of `s` and `size`") + elif s is not None or size is not None: + kwargs["s"] = s if s is not None else size + + color = kwargs.pop("color", None) + if c is not None and color is not None: + raise TypeError("Specify exactly one of `c` and `color`") + elif c is not None or color is not None: + kwargs["c"] = c if c is not None else color + + return self(kind="scatter", x=x, y=y, **kwargs) def hexbin(self, x, y, C=None, reduce_C_function=None, gridsize=None, **kwargs): """ diff --git a/pandas/tests/plotting/frame/test_frame.py b/pandas/tests/plotting/frame/test_frame.py index 4df503c243925..c4ce0b256cd41 100644 --- a/pandas/tests/plotting/frame/test_frame.py +++ b/pandas/tests/plotting/frame/test_frame.py @@ -1,4 +1,3 @@ -""" Test cases for DataFrame.plot """ from datetime import ( date, datetime, @@ -653,6 +652,11 @@ def test_plot_scatter(self): with pytest.raises(TypeError, match=msg): df.plot.scatter(y="y") + with pytest.raises(TypeError, match="Specify exactly one of `s` and `size`"): + df.plot.scatter(x="x", y="y", s=2, size=2) + with pytest.raises(TypeError, match="Specify exactly one of `c` and `color`"): + df.plot.scatter(x="a", y="b", c="red", color="green") + # GH 6951 axes = df.plot(x="x", y="y", kind="scatter", subplots=True) self._check_axes_shape(axes, axes_num=1, layout=(1, 1)) diff --git a/pandas/tests/plotting/frame/test_frame_color.py b/pandas/tests/plotting/frame/test_frame_color.py index ed0c94aa4dfa0..1cc8381642bbe 100644 --- a/pandas/tests/plotting/frame/test_frame_color.py +++ b/pandas/tests/plotting/frame/test_frame_color.py @@ -196,14 +196,15 @@ def test_if_scatterplot_colorbars_are_next_to_parent_axes(self): assert np.isclose(parent_distance, colorbar_distance, atol=1e-7).all() @pytest.mark.parametrize("cmap", [None, "Greys"]) - def test_scatter_with_c_column_name_with_colors(self, cmap): + @pytest.mark.parametrize("kw", ["c", "color"]) + def test_scatter_with_c_column_name_with_colors(self, cmap, kw): # https://github.com/pandas-dev/pandas/issues/34316 df = DataFrame( [[5.1, 3.5], [4.9, 3.0], [7.0, 3.2], [6.4, 3.2], [5.9, 3.0]], columns=["length", "width"], ) df["species"] = ["r", "r", "g", "g", "b"] - ax = df.plot.scatter(x=0, y=1, c="species", cmap=cmap) + ax = df.plot.scatter(x=0, y=1, cmap=cmap, **{kw: "species"}) assert ax.collections[0].colorbar is None def test_scatter_colors(self):