BUG: repair 'style' kwd handling in DataFrame.plot (#21003)
State: closed

- [x] closes #21003
- [x] tests added / passed
- [x] passes `black pandas`
    => `command not found`
- [ ] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
    => `command not found`
- [x] whatsnew entry


Labels:
name: Visualization
description: plotting

Comments:
Hello @joooeey! Thanks for updating this PR. We checked the lines you've touched for [PEP 8](https://www.python.org/dev/peps/pep-0008) issues, and found:







There are currently no PEP 8 issues detected in this Pull Request. Cheers! :beers: 

##### Comment last updated at 2020-09-05 10:38:05 UTC
Looks like there's one issue left but I have no idea how to resolve it. `pytest pandas` yields the lengthy Access Violation error given below at 70% progress.

Does anyone know what's going on there?

<details><summary> Anaconda prompt output </summary>
<p>

```
pandas\tests\io\excel\test_readers.py ........ss........ss........ss.... [ 69%]
............................................ssssssssssss................ [ 69%]
ssss........ss........ss........ss........ss........ss................ss [ 69%]
ss........ss........ss........ss........ss........ss........ss........ss [ 69%]
........ss................ssss........ss........ss........ss........ss.. [ 69%]
......ss........ss...xx...ss...xx...ss........ss........ss........ssssss [ 70%]
ssssss........ss...Windows fatal exception: access violation

Thread 0x000007b8 (most recent call first):
  File "C:\ProgramData\Anaconda3\lib\multiprocessing\pool.py", line 470 in _handle_results
  File "C:\ProgramData\Anaconda3\lib\threading.py", line 870 in run
  File "C:\ProgramData\Anaconda3\lib\threading.py", line 926 in _bootstrap_inner
  File "C:\ProgramData\Anaconda3\lib\threading.py", line 890 in _bootstrap

Thread 0x00002340 (most recent call first):
  File "C:\ProgramData\Anaconda3\lib\multiprocessing\pool.py", line 422 in _handle_tasks
  File "C:\ProgramData\Anaconda3\lib\threading.py", line 870 in run
  File "C:\ProgramData\Anaconda3\lib\threading.py", line 926 in _bootstrap_inner
  File "C:\ProgramData\Anaconda3\lib\threading.py", line 890 in _bootstrap

Thread 0x00003404 (most recent call first):
  File "C:\ProgramData\Anaconda3\lib\multiprocessing\pool.py", line 413 in _handle_workers
  File "C:\ProgramData\Anaconda3\lib\threading.py", line 870 in run
  File "C:\ProgramData\Anaconda3\lib\threading.py", line 926 in _bootstrap_inner
  File "C:\ProgramData\Anaconda3\lib\threading.py", line 890 in _bootstrap

Thread 0x00003c08 (most recent call first):
  File "C:\ProgramData\Anaconda3\lib\multiprocessing\pool.py", line 110 in worker
  File "C:\ProgramData\Anaconda3\lib\threading.py", line 870 in run
  File "C:\ProgramData\Anaconda3\lib\threading.py", line 926 in _bootstrap_inner
  File "C:\ProgramData\Anaconda3\lib\threading.py", line 890 in _bootstrap

Thread 0x00003920 (most recent call first):
  File "C:\ProgramData\Anaconda3\lib\multiprocessing\pool.py", line 110 in worker
  File "C:\ProgramData\Anaconda3\lib\threading.py", line 870 in run
  File "C:\ProgramData\Anaconda3\lib\threading.py", line 926 in _bootstrap_inner
  File "C:\ProgramData\Anaconda3\lib\threading.py", line 890 in _bootstrap

Thread 0x0000168c (most recent call first):
  File "C:\ProgramData\Anaconda3\lib\multiprocessing\pool.py", line 110 in worker
  File "C:\ProgramData\Anaconda3\lib\threading.py", line 870 in run
  File "C:\ProgramData\Anaconda3\lib\threading.py", line 926 in _bootstrap_inner
  File "C:\ProgramData\Anaconda3\lib\threading.py", line 890 in _bootstrap

Thread 0x00000450 (most recent call first):
  File "C:\ProgramData\Anaconda3\lib\multiprocessing\pool.py", line 110 in worker
  File "C:\ProgramData\Anaconda3\lib\threading.py", line 870 in run
  File "C:\ProgramData\Anaconda3\lib\threading.py", line 926 in _bootstrap_inner
  File "C:\ProgramData\Anaconda3\lib\threading.py", line 890 in _bootstrap

Current thread 0x000019cc (most recent call first):
  File "C:\ProgramData\Anaconda3\lib\site-packages\psutil\_pswindows.py", line 993 in open_files
  File "C:\ProgramData\Anaconda3\lib\site-packages\psutil\_pswindows.py", line 679 in wrapper
  File "C:\ProgramData\Anaconda3\lib\site-packages\psutil\__init__.py", line 1154 in open_files
  File "C:\Users\Joey\pandas-joooeey\pandas\tests\io\excel\conftest.py", line 62 in check_for_file_leaks
  File "C:\ProgramData\Anaconda3\lib\site-packages\_pytest\fixtures.py", line 788 in call_fixture_func
  File "C:\ProgramData\Anaconda3\lib\site-packages\_pytest\fixtures.py", line 964 in pytest_fixture_setup
  File "C:\ProgramData\Anaconda3\lib\site-packages\pluggy\callers.py", line 187 in _multicall
  File "C:\ProgramData\Anaconda3\lib\site-packages\pluggy\manager.py", line 87 in <lambda>
  File "C:\ProgramData\Anaconda3\lib\site-packages\pluggy\manager.py", line 93 in _hookexec
  File "C:\ProgramData\Anaconda3\lib\site-packages\pluggy\hooks.py", line 286 in __call__
  File "C:\ProgramData\Anaconda3\lib\site-packages\_pytest\fixtures.py", line 914 in execute
  File "C:\ProgramData\Anaconda3\lib\site-packages\_pytest\fixtures.py", line 584 in _compute_fixture_value
  File "C:\ProgramData\Anaconda3\lib\site-packages\_pytest\fixtures.py", line 503 in _get_active_fixturedef
  File "C:\ProgramData\Anaconda3\lib\site-packages\_pytest\fixtures.py", line 487 in getfixturevalue
  File "C:\ProgramData\Anaconda3\lib\site-packages\_pytest\fixtures.py", line 477 in _fillfixtures
  File "C:\ProgramData\Anaconda3\lib\site-packages\_pytest\fixtures.py", line 297 in fillfixtures
  File "C:\ProgramData\Anaconda3\lib\site-packages\_pytest\python.py", line 1485 in setup
  File "C:\ProgramData\Anaconda3\lib\site-packages\_pytest\runner.py", line 373 in prepare
  File "C:\ProgramData\Anaconda3\lib\site-packages\_pytest\runner.py", line 123 in pytest_runtest_setup
  File "C:\ProgramData\Anaconda3\lib\site-packages\pluggy\callers.py", line 187 in _multicall
  File "C:\ProgramData\Anaconda3\lib\site-packages\pluggy\manager.py", line 87 in <lambda>
  File "C:\ProgramData\Anaconda3\lib\site-packages\pluggy\manager.py", line 93 in _hookexec
  File "C:\ProgramData\Anaconda3\lib\site-packages\pluggy\hooks.py", line 286 in __call__
  File "C:\ProgramData\Anaconda3\lib\site-packages\_pytest\runner.py", line 217 in <lambda>
  File "C:\ProgramData\Anaconda3\lib\site-packages\_pytest\runner.py", line 244 in from_call
  File "C:\ProgramData\Anaconda3\lib\site-packages\_pytest\runner.py", line 217 in call_runtest_hook
  File "C:\ProgramData\Anaconda3\lib\site-packages\_pytest\runner.py", line 186 in call_and_report
  File "C:\ProgramData\Anaconda3\lib\site-packages\_pytest\runner.py", line 94 in runtestprotocol
  File "C:\ProgramData\Anaconda3\lib\site-packages\_pytest\runner.py", line 85 in pytest_runtest_protocol
  File "C:\ProgramData\Anaconda3\lib\site-packages\pluggy\callers.py", line 187 in _multicall
  File "C:\ProgramData\Anaconda3\lib\site-packages\pluggy\manager.py", line 87 in <lambda>
  File "C:\ProgramData\Anaconda3\lib\site-packages\pluggy\manager.py", line 93 in _hookexec
  File "C:\ProgramData\Anaconda3\lib\site-packages\pluggy\hooks.py", line 286 in __call__
  File "C:\ProgramData\Anaconda3\lib\site-packages\_pytest\main.py", line 272 in pytest_runtestloop
  File "C:\ProgramData\Anaconda3\lib\site-packages\pluggy\callers.py", line 187 in _multicall
  File "C:\ProgramData\Anaconda3\lib\site-packages\pluggy\manager.py", line 87 in <lambda>
  File "C:\ProgramData\Anaconda3\lib\site-packages\pluggy\manager.py", line 93 in _hookexec
  File "C:\ProgramData\Anaconda3\lib\site-packages\pluggy\hooks.py", line 286 in __call__
  File "C:\ProgramData\Anaconda3\lib\site-packages\_pytest\main.py", line 247 in _main
  File "C:\ProgramData\Anaconda3\lib\site-packages\_pytest\main.py", line 191 in wrap_session
  File "C:\ProgramData\Anaconda3\lib\site-packages\_pytest\main.py", line 240 in pytest_cmdline_main
  File "C:\ProgramData\Anaconda3\lib\site-packages\pluggy\callers.py", line 187 in _multicall
  File "C:\ProgramData\Anaconda3\lib\site-packages\pluggy\manager.py", line 87 in <lambda>
  File "C:\ProgramData\Anaconda3\lib\site-packages\pluggy\manager.py", line 93 in _hookexec
  File "C:\ProgramData\Anaconda3\lib\site-packages\pluggy\hooks.py", line 286 in __call__
  File "C:\ProgramData\Anaconda3\lib\site-packages\_pytest\config\__init__.py", line 125 in main
  File "C:\ProgramData\Anaconda3\Scripts\pytest-script.py", line 10 in <module>

(base) C:\Users\Joey\pandas-joooeey>
```
</p>
</details>
This is odd. CI reports two test failures in `pandas.tests.series`:

- `.test_constructors.TestSeriesConstructors.test_constructor_generic_timestamp_no_frequency`
- `.test_dtypes.TestSeriesDtypes.test_astype_generic_timestamp_no_frequency`

These tests run fine on my machine.
CI pipeline is currently broken, the errors were probably unrelated
Yea looks like the extensions need to be rebuilt. @charlesdong1991 instructions above should work; maybe not even need the second line if you launch Python from the pandas repo

> On May 19, 2020, at 1:17 PM, Kaiqi Dong <notifications@github.com> wrote:
> 
> 
> @charlesdong1991 commented on this pull request.
> 
> In pandas/tests/plotting/test_frame.py <https://github.com/pandas-dev/pandas/pull/33821#discussion_r427573721>:
> 
> > +    def test_color_and_marker(self):
> +        # GH21003 - code sample from 2018-05-10 is equivalent to this test
> +        df = DataFrame(np.random.random((7, 4)))
> +        # combining a color string and a marker letter should be allowed
> +        df.plot(color="green", style="d")  # d for diamond
> +
> +    def test_color_list_and_marker(self):
> +        # GH21003 - code sample from 2020-04-23 is equivalent to this test
> +        df = DataFrame(np.random.random((7, 4)))
> +        color_list = ["yellow", "red", "green", "blue"]
> +        ax = df.plot(color=color_list, style="d")
> +        # Before this patch was introduced, the previous line of code resulted
> +        # in a plot where each individual line was assigned a list of colors:
> +        # ax.lines[i].get_color() == ['yellow', 'red', 'green', 'blue']
> +        # which resulted in a ValueError when plt.draw() was called.
> +        assert [line.get_color() for line in ax.lines] == color_list
> emm, have no idea, i really think
> 
> python setup.py build_ext --inplace -j 4
> python -m pip install -e . --no-build-isolation --no-use-pep517
> would solve the issue
> 
> @WillAyd <https://github.com/WillAyd> could you help with the environment issue?
> 
> —
> You are receiving this because you were mentioned.
> Reply to this email directly, view it on GitHub <https://github.com/pandas-dev/pandas/pull/33821#discussion_r427573721>, or unsubscribe <https://github.com/notifications/unsubscribe-auth/AAEU4UNW7DTC32C2KAWVF2LRSLSNZANCNFSM4MR622DA>.
> 


I still can't even import pandas. see #34280 .
Hi @joooeey , is this still active? Are you able to import pandas now or are there still issues with setting up your dev environment?
> Hi @joooeey , is this still active? Are you able to import pandas now or are there still issues with setting up your dev environment?

Still no working dev environment. I can `import pandas`. There's something off with the build extensions:
```
(base) C:\ProgramData\Anaconda3\Lib\site-packages>pytest pandas
ImportError while loading conftest 'C:\ProgramData\Anaconda3\Lib\site-packages\pandas\conftest.py'.
pandas\conftest.py:14: in <module>
    import pandas.util._test_decorators as td
pandas\util\_test_decorators.py:86: in <module>
    and LooseVersion(tables.__version__) < LooseVersion("3.5.1"),
E   AttributeError: module 'tables' has no attribute '__version__'
```
I'll see if they can be updated but first I gotta wait for the Visual Studio Installer to update.
OK - if that doesn't work, can I suggest that you either try working in the WSL (and follow the Linux instructions), or follow the [Docker instructions](https://pandas.pydata.org/pandas-docs/dev/development/contributing.html#using-a-docker-container) and work in a container?
> OK - if that doesn't work, can I suggest that you either try working in the WSL (and follow the Linux instructions), or follow the [Docker instructions](https://pandas.pydata.org/pandas-docs/dev/development/contributing.html#using-a-docker-container) and work in a container?

What's the WSL?

I got the VS C extensions running which took about an hour (install VS Studio Installer, Update VS C build tools, try `python setup.py build_ext ...`, install Cython, run `python setup.py build_ext`). This solved that error,

But there's a new error when running PyTest:

```
(base) C:\ProgramData\Anaconda3\Lib\site-packages>pytest pandas
ImportError while loading conftest 'C:\ProgramData\Anaconda3\Lib\site-packages\pandas\conftest.py'.
pandas\conftest.py:14: in <module>
    import pandas.util._test_decorators as td
pandas\util\_test_decorators.py:86: in <module>
    and LooseVersion(tables.__version__) < LooseVersion("3.5.1"),
E   AttributeError: module 'tables' has no attribute '__version__'
```

It's late here, I'll look into doing things with Docker one of the next days.

@joooeey it looks like you're running `pytest` from the `base` environment. Can you do `conda activate pandas-dev` first?
> @joooeey it looks like you're running `pytest` from the `base` environment. Can you do `conda activate pandas-dev` first?

Thanks, good catch! Activating `pandas-dev` helped a little. Now the test suite fails at 22% with a stack overflow: #35218  
For now I don't intend to bother with Docker or WSL as the instructions you linked to are too vague for me to follow. I'm really not keen on more experiments. Or how would I set up the Docker container? Would that make my dev environment more stable?
You probably don't need to run all the tests, just the plotting ones

pytest pandas/tests/plotting
> You probably don't need to run all the tests, just the plotting ones
> 
> pytest pandas/tests/plotting

Running `pytest pandas/tests/plotting` on my local master branch results in two test failures which I don't understand where they come from:

<details>

```
(pandas-dev) C:\Users\Joey\pandas-joooeey>pytest pandas/tests/plotting
======================================= test session starts =======================================
platform win32 -- Python 3.8.2, pytest-5.4.2, py-1.8.1, pluggy-0.13.1
rootdir: C:\Users\Joey\pandas-joooeey, inifile: setup.cfg
plugins: hypothesis-5.15.0, asyncio-0.12.0, cov-2.8.1, forked-1.1.2, xdist-1.32.0
collected 418 items

pandas\tests\plotting\test_backend.py ...F.s.                                                [  1%]
pandas\tests\plotting\test_boxplot_method.py .........................                       [  7%]
pandas\tests\plotting\test_converter.py ............................                         [ 14%]
pandas\tests\plotting\test_datetimelike.py F................................................ [ 26%]
.......................................................x.                                    [ 39%]
pandas\tests\plotting\test_frame.py .........................x.............................. [ 53%]
.................................................................x.......................... [ 75%]
....                                                                                         [ 76%]
pandas\tests\plotting\test_groupby.py .....                                                  [ 77%]
pandas\tests\plotting\test_hist_method.py .....................                              [ 82%]
pandas\tests\plotting\test_misc.py s...............                                          [ 86%]
pandas\tests\plotting\test_series.py ....................................................x.. [ 99%]
...                                                                                          [100%]

============================================ FAILURES =============================================
____________________________________ test_register_entrypoint _____________________________________

restore_backend = None

    @td.skip_if_no_mpl
    def test_register_entrypoint(restore_backend):

>       dist = pkg_resources.get_distribution("pandas")

pandas\tests\plotting\test_backend.py:52:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
C:\ProgramData\Anaconda3\envs\pandas-dev\lib\site-packages\pkg_resources\__init__.py:482: in get_distribution
    dist = get_provider(dist)
C:\ProgramData\Anaconda3\envs\pandas-dev\lib\site-packages\pkg_resources\__init__.py:358: in get_provider
    return working_set.find(moduleOrReq) or require(str(moduleOrReq))[0]
C:\ProgramData\Anaconda3\envs\pandas-dev\lib\site-packages\pkg_resources\__init__.py:901: in require
    needed = self.resolve(parse_requirements(requirements))
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <pkg_resources.WorkingSet object at 0x000001E7D20E0D90>, requirements = []
env = <pkg_resources.Environment object at 0x000001E7D4D64BB0>, installer = None
replace_conflicting = False, extras = None

    def resolve(self, requirements, env=None, installer=None,
                replace_conflicting=False, extras=None):
        """List all distributions needed to (recursively) meet `requirements`

        `requirements` must be a sequence of ``Requirement`` objects.  `env`,
        if supplied, should be an ``Environment`` instance.  If
        not supplied, it defaults to all distributions available within any
        entry or distribution in the working set.  `installer`, if supplied,
        will be invoked with each requirement that cannot be met by an
        already-installed distribution; it should return a ``Distribution`` or
        ``None``.

        Unless `replace_conflicting=True`, raises a VersionConflict exception
        if
        any requirements are found on the path that have the correct name but
        the wrong version.  Otherwise, if an `installer` is supplied it will be
        invoked to obtain the correct version of the requirement and activate
        it.

        `extras` is a list of the extras to be used with these requirements.
        This is important because extra requirements may look like `my_req;
        extra = "my_extra"`, which would otherwise be interpreted as a purely
        optional requirement.  Instead, we want to be able to assert that these
        requirements are truly required.
        """

        # set up the stack
        requirements = list(requirements)[::-1]
        # set of processed requirements
        processed = {}
        # key -> dist
        best = {}
        to_activate = []

        req_extras = _ReqExtras()

        # Mapping of requirement to set of distributions that required it;
        # useful for reporting info about conflicts.
        required_by = collections.defaultdict(set)

        while requirements:
            # process dependencies breadth-first
            req = requirements.pop(0)
            if req in processed:
                # Ignore cyclic or redundant dependencies
                continue

            if not req_extras.markers_pass(req, extras):
                continue

            dist = best.get(req.key)
            if dist is None:
                # Find the best distribution and add it to the map
                dist = self.by_key.get(req.key)
                if dist is None or (dist not in req and replace_conflicting):
                    ws = self
                    if env is None:
                        if dist is None:
                            env = Environment(self.entries)
                        else:
                            # Use an empty environment and workingset to avoid
                            # any further conflicts with the conflicting
                            # distribution
                            env = Environment([])
                            ws = WorkingSet([])
                    dist = best[req.key] = env.best_match(
                        req, ws, installer,
                        replace_conflicting=replace_conflicting
                    )
                    if dist is None:
                        requirers = required_by.get(req, None)
>                       raise DistributionNotFound(req, requirers)
E                       pkg_resources.DistributionNotFound: The 'pandas' distribution was not found and is required by the application

C:\ProgramData\Anaconda3\envs\pandas-dev\lib\site-packages\pkg_resources\__init__.py:787: DistributionNotFound
_____________________________ TestTSPlot.test_ts_plot_with_tz['UTC'] ______________________________

self = <pandas.tests.plotting.test_datetimelike.TestTSPlot object at 0x000001E7DCE814C0>
tz_aware_fixture = 'UTC'

    @pytest.mark.slow
    def test_ts_plot_with_tz(self, tz_aware_fixture):
        # GH2877, GH17173, GH31205, GH31580
        tz = tz_aware_fixture
        index = date_range("1/1/2011", periods=2, freq="H", tz=tz)
        ts = Series([188.5, 328.25], index=index)
        with tm.assert_produces_warning(None):
            _check_plot_works(ts.plot)
            ax = ts.plot()
            xdata = list(ax.get_lines())[0].get_xdata()
            # Check first and last points' labels are correct
>           assert (xdata[0].hour, xdata[0].minute) == (0, 0)
E           AttributeError: 'numpy.datetime64' object has no attribute 'hour'

pandas\tests\plotting\test_datetimelike.py:57: AttributeError
======================================== warnings summary =========================================
pandas/tests/plotting/test_frame.py::TestDataFramePlots::test_mpl2_color_cycle_str
  C:\Users\Joey\pandas-joooeey\pandas\plotting\_matplotlib\style.py:64: MatplotlibDeprecationWarning: Support for uppercase single-letter colors is deprecated since Matplotlib 3.1 and will be removed in 3.3; please use lowercase instead.
    [conv.to_rgba(c) for c in colors]

pandas/tests/plotting/test_frame.py::TestDataFramePlots::test_errorbar_plot
pandas/tests/plotting/test_frame.py::TestDataFramePlots::test_errorbar_plot
pandas/tests/plotting/test_frame.py::TestDataFramePlots::test_errorbar_plot
pandas/tests/plotting/test_frame.py::TestDataFramePlots::test_errorbar_timeseries
pandas/tests/plotting/test_frame.py::TestDataFramePlots::test_errorbar_timeseries
pandas/tests/plotting/test_frame.py::TestDataFramePlots::test_errorbar_timeseries
  C:\Users\Joey\pandas-joooeey\pandas\plotting\_matplotlib\__init__.py:61: UserWarning: To output multiple subplots, the figure containing the passed axes is being cleared
    plot_obj.generate()

pandas/tests/plotting/test_hist_method.py::TestSeriesPlots::test_hist_legacy
pandas/tests/plotting/test_hist_method.py::TestSeriesPlots::test_hist_legacy
pandas/tests/plotting/test_hist_method.py::TestSeriesPlots::test_hist_legacy
pandas/tests/plotting/test_series.py::TestSeriesPlots::test_hist_legacy
pandas/tests/plotting/test_series.py::TestSeriesPlots::test_hist_legacy
pandas/tests/plotting/test_series.py::TestSeriesPlots::test_hist_legacy
  C:\Users\Joey\pandas-joooeey\pandas\tests\plotting\common.py:535: MatplotlibDeprecationWarning: Adding an axes using the same arguments as a previous axes currently reuses the earlier instance.  In a future version, a new instance will always be created and returned.  Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance.
    kwargs.get("ax", fig.add_subplot(211))

pandas/tests/plotting/test_hist_method.py::TestSeriesPlots::test_hist_legacy
pandas/tests/plotting/test_hist_method.py::TestSeriesPlots::test_hist_legacy
pandas/tests/plotting/test_hist_method.py::TestSeriesPlots::test_hist_legacy
pandas/tests/plotting/test_series.py::TestSeriesPlots::test_hist_legacy
pandas/tests/plotting/test_series.py::TestSeriesPlots::test_hist_legacy
pandas/tests/plotting/test_series.py::TestSeriesPlots::test_hist_legacy
  C:\Users\Joey\pandas-joooeey\pandas\tests\plotting\common.py:543: MatplotlibDeprecationWarning: Adding an axes using the same arguments as a previous axes currently reuses the earlier instance.  In a future version, a new instance will always be created and returned.  Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance.
    kwargs["ax"] = fig.add_subplot(212)

pandas/tests/plotting/test_hist_method.py::TestDataFramePlots::test_tight_layout
pandas/tests/plotting/test_hist_method.py::TestDataFramePlots::test_hist_column_order_unchanged[None-expected0]
pandas/tests/plotting/test_hist_method.py::TestDataFramePlots::test_hist_column_order_unchanged[column1-expected1]
  C:\Users\Joey\pandas-joooeey\pandas\tests\plotting\common.py:545: UserWarning: To output multiple subplots, the figure containing the passed axes is being cleared
    ret = f(**kwargs)

pandas/tests/plotting/test_hist_method.py::TestDataFramePlots::test_hist_subplot_xrot
  C:\Users\Joey\pandas-joooeey\pandas\plotting\_matplotlib\hist.py:364: UserWarning: To output multiple subplots, the figure containing the passed axes is being cleared
    axes = _grouped_hist(

pandas/tests/plotting/test_misc.py::TestSeriesPlots::test_autocorrelation_plot
pandas/tests/plotting/test_misc.py::TestSeriesPlots::test_autocorrelation_plot
  C:\Users\Joey\pandas-joooeey\pandas\plotting\_matplotlib\misc.py:410: UserWarning: Requested projection is different from current axis projection, creating new axis with requested projection.
    ax = plt.gca(xlim=(1, n), ylim=(-1.0, 1.0))

pandas/tests/plotting/test_misc.py::TestDataFramePlots::test_andrews_curves
pandas/tests/plotting/test_misc.py::TestDataFramePlots::test_andrews_curves
pandas/tests/plotting/test_misc.py::TestDataFramePlots::test_andrews_curves
pandas/tests/plotting/test_misc.py::TestDataFramePlots::test_andrews_curves
pandas/tests/plotting/test_misc.py::TestDataFramePlots::test_andrews_curves
pandas/tests/plotting/test_misc.py::TestDataFramePlots::test_andrews_curves
pandas/tests/plotting/test_misc.py::TestDataFramePlots::test_andrews_curves
pandas/tests/plotting/test_misc.py::TestDataFramePlots::test_andrews_curves
  C:\Users\Joey\pandas-joooeey\pandas\plotting\_matplotlib\misc.py:241: UserWarning: Requested projection is different from current axis projection, creating new axis with requested projection.
    ax = plt.gca(xlim=(-np.pi, np.pi))

pandas/tests/plotting/test_misc.py::TestDataFramePlots::test_radviz
pandas/tests/plotting/test_misc.py::TestDataFramePlots::test_radviz
pandas/tests/plotting/test_misc.py::TestDataFramePlots::test_radviz
pandas/tests/plotting/test_misc.py::TestDataFramePlots::test_radviz
  C:\Users\Joey\pandas-joooeey\pandas\plotting\_matplotlib\misc.py:131: UserWarning: Requested projection is different from current axis projection, creating new axis with requested projection.
    ax = plt.gca(xlim=[-1, 1], ylim=[-1, 1])

-- Docs: https://docs.pytest.org/en/latest/warnings.html
===================================== short test summary info =====================================
FAILED pandas/tests/plotting/test_backend.py::test_register_entrypoint - pkg_resources.Distributi...
FAILED pandas/tests/plotting/test_datetimelike.py::TestTSPlot::test_ts_plot_with_tz['UTC'] - Attr...
========== 2 failed, 410 passed, 2 skipped, 4 xfailed, 37 warnings in 223.73s (0:03:43) ===========

(pandas-dev) C:\Users\Joey\pandas-joooeey>
```

</details>

If everything is set up right, there should never be test failures on master, no?
Unfortunately sometimes it can happen. Pulling the latest commits from upstream master can sometimes fix it if it's been solved upstream
hey @joooeey 

I _think_ if you rebase and resolve the conflict, and solve the linting error shown in CI, then it's fine, because seems the change of your PR doesn't seem to cause other tests to fail(the error you showed seems unrelated to your change, but related to your development environment probably).
> hey @joooeey
> 
> I _think_ if you rebase and resolve the conflict, and solve the linting error shown in CI, then it's fine, because seems the change of your PR doesn't seem to cause other tests to fail(the error you showed seems unrelated to your change, but related to your development environment probably).

What's the command sequence for rebasing? Do I start with `git checkout master` or `git checkout plot-style-error`?
Assuming your local branch is up-to-date with `origin/plot-style-error`, I'd advise:
```bash
git checkout plot-style-error
git fetch upstream master
git merge upstream/master  # you'll need to fix some conflicts here
git commit
```
> Assuming your local branch is up-to-date with `origin/plot-style-error`, I'd advise:
> 
> ```shell
> git checkout plot-style-error
> git fetch upstream master
> git merge upstream/master  # you'll need to fix some conflicts here
> git commit
> ```

I did that and it helped quite a bit. In the Travis CI there's still one error which I can't comprehend.
Thanks @joooeey ! The Travis CI error is unrelated
> Thanks @joooeey ! The Travis CI error is unrelated

@jreback can you please have another look at this PR? I incorporated your requested change a few months ago -- there are no more staticmethods in the code of this PR. Can you please mark that change request done? Is this PR finally ready to merge?
@joooeey someone will have a look

we have hundreds of PRs so things do take time
@joooeey can you move release note to 1.2
Hi @joooeey - is this still active? If you address the latest comments I think this is close to being ready to be merged
thanks @joooeey very nice. thanks @MarcoGorelli and @charlesdong1991 for reviewing.
Thanks guys for pulling this to completion! I couldn't spare any time to work on this this summer unfortunately.