Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

matplotlib bar chart with highlights values only

Hi I`d like to get a bar chart of this kind. the problem is how to set corresponding xlables by selection?

enter image description here

I coded as follow to delete undesired country labels but the graph has nan as labels as well.

countries=['United States','Mexico','Japan','China','Korea,Rep.','Ireland','France','Italy']
new_index=list(df.index)
for i in range(len(new_index)):
    if new_index[i] not in countries :
        new_index[i]=np.nan

And here is my result,with nan in the labels and the distance between bars much wider: enter image description here

For the data:

import numpy as np
import pandas as pd

#Overall Country list
Countries=['United States','Mexico','Japan','China','Korea,Rep.','Ireland','France','Italy','Czech Republic',
 'Austria',
 'Slovak Republic',
 'Slovenia',
 'Germany',
 'Portugal',
 'Hungary',
 'Colombia',
 'New Zealand',
 'Norway',
 'Latvia']

#Countries to highlight
Desired=['United States','Mexico','Japan','China','Korea,Rep.','Ireland','France','Italy']

np.random.seed(0)
Value=np.random.rand(len(Countries))
df = pd.DataFrame({'Countries': Countries,'Value': Value,})
df.sort_values(['Value'],inplace=True)

df.set_index('Countries',drop=True,inplace=True)
ax_1 = df['Value'].plot(kind='bar', title ="graph", figsize=(10, 6), fontsize=12)
ax_1.set_xlabel("Country Name", fontsize=12)
plt.show()
like image 769
IsaIkari Avatar asked Dec 11 '18 03:12

IsaIkari


1 Answers

Run through the x-ticks and then disable few of them based on countries list.

import numpy as np
import pandas as pd

#Overall Country list
Countries=['United States','Mexico','Japan','China','Korea,Rep.','Ireland','France','Italy','Czech Republic',
 'Austria',
 'Slovak Republic',
 'Slovenia',
 'Germany',
 'Portugal',
 'Hungary',
 'Colombia',
 'New Zealand',
 'Norway',
 'Latvia']

#Countries to highlight
Desired=['United States','Mexico','Japan','China','Korea,Rep.','Ireland','France','Italy']

np.random.seed(0)
Value=np.random.rand(len(Countries))
df = pd.DataFrame({'Countries': Countries,'Value': Value,})
df.sort_values(['Value'],inplace=True)

df.set_index('Countries',drop=True,inplace=True)
ax_1 = df['Value'].plot(kind='bar', title ="graph", figsize=(10, 6), fontsize=12)
ax_1.set_xlabel("Country Name", fontsize=12)



for ticks in ax_1.xaxis.get_major_ticks():
    if ticks.label1.get_text() not in Desired:
        ticks.label1.set_visible(False)
        ax_1.patches[df.index.get_indexer([ticks.label1.get_text()])[0]].set_facecolor('w')
        ax_1.patches[df.index.get_indexer([ticks.label1.get_text()])[0]].set_edgecolor('black')
    else:
        ax_1.patches[df.index.get_indexer([ticks.label1.get_text()])[0]].set_facecolor('r')
        

enter image description here

like image 140
Venkatachalam Avatar answered Nov 01 '22 02:11

Venkatachalam