I have the following code
import numpy as np
import matplotlib.pyplot as plt
oct_data = [10, 24, 25, 30]
nov_data = [12, 42, 21, 78]
labels = ['Account_1', 'Account_2', 'Account_3', 'Account_4']
bar_width = 0.4
rect_1 = np.arange(0, len(oct_data)*2 ,2)
rect_2 = [x bar_width for x in rect_1]
plt.bar(rect_1, oct_data, color='#7f6d5f', width=bar_width, edgecolor='white', label='Month_1')
plt.bar(rect_2, nov_data, color='#557f2d', width=bar_width, edgecolor='white', label='Month_2')
plt.ylabel('Cost ($)', fontsize=10)
plt.legend()
plt.show()
Which gives me the following figure:
As you can see, my xticks
(Account_1, Account_2, ...
) are not centered.
As I understand, this command should do the job, but it doesn't.
plt.xticks([r bar_width for r in range(0, len(oct_data)*2, 2)], labels)
I also would like to add the value of the heigh inside the bar. Usually, this is how I do it with a "single bar" graph:
for i in range(len(labels)):
plt.text(i, oct_data[i]//2, oct_data[i], ha = 'center', color = 'black')
But that does not work here.
Any help would be greatly appreciated. I am a total beginner with Matplotlib.
CodePudding user response:
There is align
option you can use:
# number of data points
num_data = len(labels)
bars1 = plt.bar(range(num_data), oct_data, color='#7f6d5f',
align='edge', width=-bar_width, # align and negative width for left bars
edgecolor='white', label='Month_1')
bars1 = plt.bar(range(num_data), nov_data, color='#557f2d',
align='edge', width=bar_width, # align and positive width for right bars
edgecolor='white', label='Month_2')
# set xticks
plt.xticks(range(num_data), labels)
For annotation, it's recommend to have an axis instance:
fig, ax = plt.subplots()
# other plot commands
for patch in ax.patches:
ax.text(patch.get_x() patch.get_width()/2,
patch.get_height()/2,
f'{patch.get_height()}',
verticalalignment='center', horizontalalignment='center')
Output:
Update: All code:
oct_data = [10, 24, 25, 30]
nov_data = [12, 42, 21, 78]
labels = ['Account_1', 'Account_2', 'Account_3', 'Account_4']
bar_width = 0.4
fig, ax = plt.subplots()
# number of data points
num_data = len(labels)
bars1 = plt.bar(range(num_data), oct_data, color='#7f6d5f',
align='edge', width=-bar_width, # align and negative width for left bars
edgecolor='white', label='Month_1')
bars1 = plt.bar(range(num_data), nov_data, color='#557f2d',
align='edge', width=bar_width, # align and positive width for right bars
edgecolor='white', label='Month_2')
for patch in ax.patches:
ax.text(patch.get_x() patch.get_width()/2,
patch.get_height()/2,
f'{patch.get_height()}',
verticalalignment='center', horizontalalignment='center')
# set xticks
plt.xticks(range(num_data), labels)
plt.ylabel('Cost ($)', fontsize=10)
plt.legend()
plt.show()
CodePudding user response: