Dani
Dani

Reputation: 799

Create a box plot from two series

I have two pandas series of numbers (not necessarily in the same size). Can I create one side by side box plot for both of the series?

I didn't found a way to create a boxplot from a series, and not from 2 series.

Upvotes: 0

Views: 3094

Answers (3)

StupidWolf
StupidWolf

Reputation: 47008

We can try with an example dataset, two series, unequal length, and defined colors.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

np.random.seed(100)
S1 = pd.Series(np.random.normal(0,1,10))
S2 = pd.Series(np.random.normal(0,1,14))
colors = ['#aacfcf', '#d291bc']

One option is to make a data.frame containing the two series in a column, and provide a label for the series:

fig, ax = plt.subplots(1, 1,figsize=(6,4))
import seaborn as sns
sns.boxplot(x='series',y='values',
            data=pd.DataFrame({'values':pd.concat([S1,S2],axis=0),
                              'series':np.repeat(["S1","S2"],[len(S1),len(S2)])}),
            ax = ax,palette=colors,width=0.5
           )

enter image description here

The other, is to use matplotlib directly, as the other solutions have suggested. However, there is no need to concat them column wise and create some amounts of NAs. You can directly use plt.boxplot from matplotlib to plot an array of values. The downside is, that it takes a bit of effort to adjust the colors etc, as I show below:

fig, ax = plt.subplots(1, 1,figsize=(6,4))
bplot = ax.boxplot([S1,S2],patch_artist=True,widths=0.5,
                   medianprops=dict(color="black"),labels =['S1','S2'])
plt.setp(bplot['boxes'], color='black')

for patch, color in zip(bplot['boxes'], colors):
    patch.set_facecolor(color)

enter image description here

Upvotes: 1

Raj Srujan Jalem
Raj Srujan Jalem

Reputation: 661

Try this:

import numpy as np
ser1 = pd.Series(np.random.randn(10))
ser2 = pd.Series(np.random.randn(10))

## solution
pd.concat([ser1, ser2], axis=1).plot.box()

Upvotes: 0

Valdi_Bo
Valdi_Bo

Reputation: 31011

For the test I generated 2 Series, of different size:

np.random.seed(0)
s1 = pd.Series(np.random.randn(10))
s2 = pd.Series(np.random.randn(14))

The first processing step is to concatenate them into a single DataFrame and set some meaningful column names (will be included in the picture):

df = pd.concat([s1, s2], axis=1)
df.columns = ['A', 'B']

And to create the picture, along with a title, you can run:

ax = df.boxplot()
ax.get_figure().suptitle(t='My Boxplot', fontsize=16);

For my source data, the result is:

enter image description here

Upvotes: 1

Related Questions