Jannik
Jannik

Reputation: 1015

Python Plot does not work correctly

I'm new to Python and I'm trying to plot some data with the help of matplotlib.

I'm trying to group the data but the problem is that the groups overlap each other. Here is a picture which describes my problem: Problem

Problem

Here is my code:

import numpy as np
import matplotlib.pyplot as plt

n_groups = 3
credits = (market[0], market[1], market[2])
debits = (dmarket[0], dmarket[1], dmarket[2])
profits = (pmarket[0], pmarket[1], pmarket[2])
fig, ax = plt.subplots()
index = np.arange(n_groups)
bar_width = 0.45
opacity = 0.4
error_config = {'ecolor': '0.3'}

rectsCredits = plt.bar(index, credits, bar_width,
                 alpha=opacity,
                 color='b',
                 error_kw=error_config,
                 label='Credit')

rectsDebits = plt.bar(index + bar_width, debits, bar_width,
                 alpha=opacity,
                 color='r',
                 error_kw=error_config,
                 label='Debit')

rectsProfits = plt.bar(index + 2*bar_width, profits, bar_width,
                 alpha=opacity,
                 color='g',
                 error_kw=error_config,
                 label='Profits')

plt.xticks(index + bar_width/2, ('Tariff Market', 'Wholesale Market', 'Balancing Market'))
plt.legend()
plt.tight_layout()

def autolabel(rects):
    """
    Attach a text label above each bar displaying its height
    """
    for rect in rects:
        height = rect.get_height()
        ax.text(rect.get_x() + rect.get_width() / 2.,
                1.01 * height,
                '%d' % int(height),
                ha='center', va='bottom')

autolabel(rectsCredits)
autolabel(rectsDebits)
autolabel(rectsProfits)

plt.show()

I don't know what to do. I think there is only a little logic problem which I don't see right now!

Upvotes: 3

Views: 838

Answers (1)

MSeifert
MSeifert

Reputation: 152810

The position of the bars is a bit off. You insert the first label group at [0, 1, 2] (index), the second on [0.45, 1.45, 2.45] (index + bar_width) and the third at [0.9, 1.9, 2.9] (index + 2*bar_width). Each bar has a width of 0.45 so no wonder these overlap.

For the following part I chose just some data for visualization, you have to insert or use the correct values.

If you change bar_width to 1/3 then there's no empty space between the groups:

bar_width = 1 / 3

enter image description here

If you choose something like 1/4 then it will have exactly the space for one additional bar between each group:

bar_width = 1 / 4

enter image description here

But the label isn't centered correctly yet, but that can be easily fixed by using a new index in plt.xticks:

bar_width = 1 / 4
plt.xticks(index + bar_width, ('Tariff Market', 'Wholesale Market', 'Balancing Market'))

enter image description here

Upvotes: 3

Related Questions