user4896331
user4896331

Reputation: 1695

Change colours of Pandas bar chart

I want the bars in a Pandas chart to each be given a different colour. The solution looks pretty simple according to this post and ones like it.

When I try to emulate the solution, I end up with all the bars the same colour (albeit a different colour from the standard one). I guess that I'm doing something wrong, but I can't see what it is. Anyone else see it?

fig = df.plot(kind='bar',    # Plot a bar chart
            legend=False,    # Turn the Legend off
            width=0.75,      # Set bar width as 75% of space available
            figsize=(8,5.8),  # Set size of plot in inches
            colormap='Paired')

The colormap='Paired' is the bit that's meant to change the colours. I get this: enter image description here

It's nice, but all the bars are the same colour! I'm making other changes to the plot, as you can see above, but they're all formatting of text or removal of axis details.

Upvotes: 5

Views: 17535

Answers (2)

Bill
Bill

Reputation: 11653

This should also work:*

df['Degree'].plot.bar()

This is different because df['Degree'] is a series.

Pandas Series seem to be plotted with each bar a different colour (presumably as each is assumed to be from a different category or label) whereas in a dataframe each series is assumed to be a set of values from one category so they are given the same colour.

For example:

s = pd.Series({'a': 100, 'b': 74, 'c': 50})
s.plot.bar()

Produces:

enter image description here

UPDATE:

* Apparently for pandas versions < 0.17.0 you must use s.plot(kind='bar') not s.plot.bar(). I suspect the colour behaviour I am showing here is also version-specific. This demo was done with version 0.22.0.

Upvotes: 1

Scott Boston
Scott Boston

Reputation: 153550

Let's use this code instead:

df.plot(kind='bar',    # Plot a bar chart
        legend=False,    # Turn the Legend off
        width=0.75,      # Set bar width as 75% of space available
        figsize=(8,5.8),  # Set size of plot in inches
        color=[plt.cm.Paired(np.arange(len(df)))])

enter image description here

Upvotes: 11

Related Questions