Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to create a grouped bar plot

The goal here is to create a grouped bar plot, not subplots like the image below

Is there a simple way to create a grouped bar plot in Python? Right now I get separate bar plots, instead of separate bars on one plot.

import pandas as pd

df = pd.DataFrame([['g1', 'c1', 10], ['g1', 'c2', 12], ['g1', 'c3', 13], ['g2', 'c1', 8], ['g2', 'c2', 10], ['g2', 'c3', 12]], columns=['group', 'column', 'val'])

  group column  val
0    g1     c1   10
1    g1     c2   12
2    g1     c3   13
3    g2     c1    8
4    g2     c2   10
5    g2     c3   12
    

df.groupby(['group']).plot(kind='bar')

enter image description here

like image 590
Rilcon42 Avatar asked Dec 13 '17 15:12

Rilcon42


People also ask

What is a grouped bar plot?

grouped bar charts are Bar charts in which multiple sets of data items are compared, with a single color used to denote a specific series across all sets. As with basic Bar charts, both vertical and horizontal versions of grouped bar charts are available.


3 Answers

Pandas will show grouped bars by columns. Entries in each row but different columns will constitute a group in the resulting plot. Hence you need to "reshape" your dataframe to have the "group" as columns. In this case you can pivot like

df.pivot("column", "group", "val")

producing

group   g1  g2
column        
c1      10   8
c2      12  10
c3      13  12

Plotting this will result in a grouped bar chart.

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame([['g1','c1',10],['g1','c2',12],['g1','c3',13],['g2','c1',8],
                   ['g2','c2',10],['g2','c3',12]],columns=['group','column','val'])

df.pivot("column", "group", "val").plot(kind='bar')

plt.show()

enter image description here

like image 127
ImportanceOfBeingErnest Avatar answered Oct 07 '22 11:10

ImportanceOfBeingErnest


You can simply do this using the code given below:

import pandas as pd
import matplotlib.pyplot as plt

positive_values = [20, 17.5, 40]
negative_values = [15, 8, 70]
index = ['Precision', 'Recall', 'f1-score',]
df = pd.DataFrame({'Positive Values': positive_values,
                    'Negative Values': negative_values}, index=index)
ax = df.plot.bar(rot=0, color={"Positive Values": "green", "Negative Values": "red"})

Output:

Output

like image 33
Rawnak Yazdani Avatar answered Oct 07 '22 12:10

Rawnak Yazdani


  • Given a dataframe of long (tidy) data, as shown in the OP, an implementation that does not require transforming the dataframe is to use seaborn.barplot with the hue parameter.
  • seaborn is a high-level API for matplotlib
  • Tested with seaborn 0.11.1 and matplotlib 3.4.2
import pandas as pd
import seaborn as sns

# the sample dataframe from the OP
df = pd.DataFrame([['g1', 'c1', 10], ['g1', 'c2', 12], ['g1', 'c3', 13], ['g2', 'c1', 8], ['g2', 'c2', 10], ['g2', 'c3', 12]], columns=['group', 'column', 'val'])

# plot with seaborn barplot
sns.barplot(data=df, x='column', y='val', hue='group')

enter image description here

like image 39
Trenton McKinney Avatar answered Oct 07 '22 12:10

Trenton McKinney