Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pandas DataFrame Bar Plot - Plot Bars Different Colors From Specific Colormap

How do you plot the bars of a bar plot different colors only using the pandas dataframe plot method?

If I have this DataFrame:

df = pd.DataFrame({'count': {0: 3372, 1: 68855, 2: 17948, 3: 708, 4: 9117}}).reset_index()

   index  count
0      0   3372
1      1  68855
2      2  17948
3      3    708
4      4   9117

What df.plot() arguments do I need to set so each bar in the plot:

  1. Uses the 'Paired' colormap
  2. Plots each bar a different color

What I am attempting:

df.plot(x='index', y='count', kind='bar', label='index', colormap='Paired', use_index=False)

The result:

not different colors

What I already know (yes, this works, but again, my purpose is to figure out how to do this with df.plot ONLY. Surely it must be possible?):

def f(df):
  groups = df.groupby('index')

  for name,group in groups:
    plt.bar(name, group['count'], label=name, align='center')

  plt.legend()
  plt.show()

end result but used for loop

like image 858
Jarad Avatar asked Jun 12 '17 07:06

Jarad


3 Answers

There is no argument you can pass to df.plot that colorizes the bars differently for a single column.
Since bars for different columns are colorized differently, an option is to transpose the dataframe before plotting,

ax = df.T.plot(kind='bar', label='index', colormap='Paired')

This would now draw the data as part of a subgroup. Therefore some tweaking needs to be applied to set the limits and xlabels correctly.

import matplotlib.pyplot as plt
import pandas as pd

df = pd.DataFrame({'count': {0: 3372, 1: 68855, 2: 17948, 3: 708, 4: 9117}}).reset_index()

ax = df.T.plot(kind='bar', label='index', colormap='Paired')
ax.set_xlim(0.5, 1.5)
ax.set_xticks([0.8,0.9,1,1.1,1.2])
ax.set_xticklabels(range(len(df)))
plt.show()

enter image description here

While I guess this solution matches the criteria from the question, there is actually nothing wrong with using plt.bar. A single call to plt.bar is sufficient

plt.bar(range(len(df)), df["count"], color=plt.cm.Paired(np.arange(len(df))))

enter image description here

Complete code:

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

df = pd.DataFrame({'count': {0: 3372, 1: 68855, 2: 17948, 3: 708, 4: 9117}}).reset_index()

plt.bar(range(len(df)), df["count"], color=plt.cm.Paired(np.arange(len(df))))

plt.show()
like image 53
ImportanceOfBeingErnest Avatar answered Oct 24 '22 18:10

ImportanceOfBeingErnest


You can colorize each column as you like with the parameter color.

For example (for example, with 3 variables):

df.plot.bar(color=['C0', 'C1', 'C2'])

Note: The strings 'C0', 'C1', ...' mentioned above are built-in shortcut color handles in matplotlib. They mean the first, second, third default colors in the active color scheme, and so on. In fact, they are just an example, you can use any custom color using the RGB code or any other color convention just as easily.

You can even highlight a specific column, for example, the middle one here:

df.plot.bar(color=['C0', 'C1', 'C0'])

To reproduce it in the example code given, one can use:

import matplotlib.pyplot as plt
import pandas as pd

df = pd.DataFrame({'count': {0: 3372, 1: 68855, 2: 17948, 3: 708, 4: 9117}}).reset_index()

ax = df.T.plot(kind='bar', label='index', color=['C0', 'C1', 'C2', 'C3', 'C4'])
ax.set_xlim(0.5, 1.5)
ax.set_xticks([0.8,0.9,1,1.1,1.2])
ax.set_xticklabels(range(len(df)))
plt.show()

Example with different colors:

Example with different colors

Example with arbitrary repetition of colors:

Example with arbitrary repetition of colors

Link for reference: Assign line colors in pandas

like image 23
Jairo Alves Avatar answered Oct 24 '22 20:10

Jairo Alves


In addition/extension to @Jairo Alves work you can also indicate the specific hex code

df.plot(kind="bar",figsize=(20, 8),color=['#5cb85c','#5bc0de','#d9534f'])

enter image description here

like image 37
John Kitonyo Avatar answered Oct 24 '22 19:10

John Kitonyo