1

The bar plot I'm trying to reproduce

The data I currently have

The first image is the figure I'm trying to reproduce, and the second image is the data I have. Does anyone have a clean way to do this with pandas or matplotlib?

Trenton McKinney
  • 56,955
  • 33
  • 144
  • 158
khajiit
  • 85
  • 5

2 Answers2

1

Just transpose the DataFrame and use df.plot with the stacked flag set to true:

import pandas as pd
from matplotlib import pyplot as plt

df = pd.DataFrame({'squad': [0.6616, 0.1245, 0.0950],
                   'quac': [0.83, 0.065, 0.0176],
                   'quoref': [0.504, 0.340364, 0.1067]})

# Transpose
plot_df = df.T
# plot
ax = plot_df.plot(kind='bar', stacked=True, rot='horizontal')

ax.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0.)
ax.set_ylabel("% of Questions")

plt.tight_layout()
plt.show()

enter image description here

Henry Ecker
  • 34,399
  • 18
  • 41
  • 57
0

You can try this:

data = {'squad':[0.661669, 0.127516, 0.095005], 
        'quac':[0.930514, 0.065951, 0.017680], 
        'quoref': [0.504963, 0.340364, 0.106700]} 

df = pd.DataFrame(data)

bars_1 = df.iloc[0]
bars_2 = df.iloc[1]
bars_3 = df.iloc[2]

# Heights of bars_1 + bars_2
bars_1_to_2 = np.add(bars_1, bars_2).tolist()

# The position of the bars on the x-axis
r = [0, 1, 2]

plt.figure(figsize = (7, 7))

plt.bar(r, bars_1, color = 'lightgrey', edgecolor = 'white') 
plt.bar(r, bars_2, bottom = bars_1, color = 'darkgrey', edgecolor = 'white') 
plt.bar(r, bars_3, bottom = bars_1_to_2, color = 'dimgrey', edgecolor = 'white') 

plt.yticks(np.arange(0, 1.1, 0.1))
plt.xticks(ticks = r, labels = df.columns)
plt.ylabel('% of Questions')

plt.show()

enter image description here

  • Thanks for this but the confusing thing about my data is that I'd like to have a stacked bar plot for each of the columns. So in your example, I'm looking to have one bar plot for var_1, and one for var_2, where the heights of the components in each bar plot are the proportions of the values in the column. – khajiit Apr 29 '21 at 19:14
  • I have updated the example. Hope it will be useful :) – Polina Dyachkova Apr 29 '21 at 19:44