Skip to content Skip to sidebar Skip to footer

Python Plot Grouped Bar Graph

I have a 3 column data like below clm1 clm2 clm3 |['shared','connect'] 13297 |aaaa| |['stopped','failed] 25002 |aaaa| |['success','obta

Solution 1:

The main problem here is that matplotlib thinks that all your categorical data "A" represent the same category, so it plots them in the same place for "A". We have to invent an additional category to distinguish all those "A" values. We can do this for instance with cumcount() which numbers all values "A" from 0 to n. An example would be:

from matplotlib import pyplot as plt
import pandas as pd

#create toy dataframe#this part you should have included in your question#as a Minimal, Complete, and Verifiable example
np.random.seed(1234)
df = pd.DataFrame({"cat": ["A", "B", "C", "C", "B", "C", "A"], "val": np.random.randint(1, 100, 7)})

#add column for multiple cat values and rearrange dataframe
df["cols"] = df.groupby("cat").cumcount()
df1 = df.pivot(index = "cat", columns = "cols", values = "val")
print(df1)

#plot this table
df1.plot.bar(color = "blue", edgecolor = "white")
plt.legend().set_visible(False)
plt.xticks(rotation = 0)
plt.show()

Sample dataframe:

cols     012
cat                   
A48.016.0   NaN
B84.077.0   NaN
C     39.054.025.0

Sample graph:

enter image description here

Edit: I just noticed that in your case it is even easier, because, although this is never mentioned in your question, you probably want as categories "clm1". Therefore, you can simplify the procedure:

from matplotlib import pyplot as plt
import pandas as pd

#create toy dataframe
np.random.seed(1234)
df = pd.DataFrame({"clm1": ["X", "Y", "Z", "X", "Y", "Z"], "clm2": np.random.randint(1, 100, 6), "clm3": ["A", "A", "A", "B", "B", "B"]})

#rearrange dataframe and plot
df.pivot(index = "clm3", columns = "clm1", values = "clm2").plot.bar(edgecolor = "white")
plt.xticks(rotation = 0)
plt.show()

Sample output:

enter image description here

Post a Comment for "Python Plot Grouped Bar Graph"