Change the facecolor of boxplot in pandas

2020-04-16 19:14发布

问题:

I need to change the colors of the boxplot drawn using pandas utility function. I can change most properties using the color argument but can't figure out how to change the facecolor of the box. Someone knows how to do it?

import pandas as pd
import numpy as np
data = np.random.randn(100, 4)
labels = list("ABCD")
df = pd.DataFrame(data, columns=labels)
props = dict(boxes="DarkGreen", whiskers="DarkOrange", medians="DarkBlue", caps="Gray")
df.plot.box(color=props)

回答1:

While I still recommend seaborn and raw matplotlib over the plotting interface in pandas, it turns out that you can pass patch_artist=True as a kwarg to df.plot.box, which will pass it as a kwarg to df.plot, which will pass is as a kwarg to matplotlib.Axes.boxplot.

import pandas as pd
import numpy as np
data = np.random.randn(100, 4)
labels = list("ABCD")
df = pd.DataFrame(data, columns=labels)
props = dict(boxes="DarkGreen", whiskers="DarkOrange", medians="DarkBlue", caps="Gray")
df.plot.box(color=props, patch_artist=True)



回答2:

As suggested, I ended up creating a function to plot this, using raw matplotlib.

def plot_boxplot(data, ax):
    bp = ax.boxplot(data.values, patch_artist=True)

    for box in bp['boxes']:
        box.set(color='DarkGreen')
        box.set(facecolor='DarkGreen')

    for whisker in bp['whiskers']:
        whisker.set(color="DarkOrange")

    for cap in bp['caps']:
        cap.set(color="Gray")

    for median in bp['medians']:
        median.set(color="white")

    ax.axhline(0, color="DarkBlue", linestyle=":")

    ax.set_xticklabels(data.columns)