Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Change the facecolor of boxplot in pandas

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)
like image 391
Kapil Sharma Avatar asked Sep 02 '16 16:09

Kapil Sharma


People also ask

How do you change the color of a box plot?

To change the color of box of boxplot in base R, we can use col argument inside boxplot function.

How do you change the color of a boxplot in Python?

To colorize the boxplot, you need to first use the patch_artist=True keyword to tell it that the boxes are patches and not just paths. Then you have two main options here: set the color via ... props keyword argument, e.g.

How do I change the size of a plot in Pandas?

The size of a plot can be modified by passing required dimensions as a tuple to the figsize parameter of the plot() method. it is used to determine the size of a figure object.


2 Answers

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)

enter image description here

like image 192
Paul H Avatar answered Sep 20 '22 22:09

Paul H


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)
like image 38
Kapil Sharma Avatar answered Sep 20 '22 22:09

Kapil Sharma