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.
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:
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 ) 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)