close

How to plot a count bar chart with a Pandas DF, grouping by one categorical column and colouring by another

Hello Guys, How are you all? Hope You all Are Fine. Today We Are Going To learn about How to plot a count bar chart with a Pandas DF, grouping by one categorical column and colouring by another in Python. So Here I am Explain to you all the possible Methods here.

Without wasting your time, Let’s start This Article.

How to plot a count bar chart with a Pandas DF, grouping by one categorical column and colouring by another?

  1. How to plot a count bar chart with a Pandas DF, grouping by one categorical column and colouring by another?

    It might be a little bit too complicated but this does the work. I first defined the mappings from name to industry and from industry to color

  2. plot a count bar chart with a Pandas DF, grouping by one categorical column and colouring by another

    It might be a little bit too complicated but this does the work. I first defined the mappings from name to industry and from industry to color

Method 1

This is my answer:

def plot_bargraph_with_groupings(df, groupby, colourby, title, xlabel, ylabel):
    """
    Plots a dataframe showing the frequency of datapoints grouped by one column and coloured by another.
    df : dataframe
    groupby: the column to groupby
    colourby: the column to color by
    title: the graph title
    xlabel: the x label,
    ylabel: the y label
    """

    import matplotlib.patches as mpatches

    # Makes a mapping from the unique colourby column items to a random color.
    ind_col_map = {x:y for x, y in zip(df[colourby].unique(),
                               [plt.cm.Paired(np.arange(len(df[colourby].unique())))][0])}


    # Find when the indicies of the soon to be bar graphs colors.
    unique_comb = df[[groupby, colourby]].drop_duplicates()
    name_ind_map = {x:y for x, y in zip(unique_comb[groupby], unique_comb[colourby])}
    c = df[groupby].value_counts().index.map(lambda x: ind_col_map[name_ind_map[x]])

    # Makes the bargraph.
    ax = df[groupby].value_counts().plot(kind='bar',
                                         figsize=FIG_SIZE,
                                         title=title,
                                         color=[c.values])
    # Makes a legend using the ind_col_map
    legend_list = []
    for key in ind_col_map.keys():
        legend_list.append(mpatches.Patch(color=ind_col_map[key], label=key))

    # display the graph.
    plt.legend(handles=legend_list)
    ax.set_xlabel(xlabel)
    ax.set_ylabel(ylabel)
enter image description here

Method 2

It might be a little bit too complicated but this does the work. I first defined the mappings from name to industry and from industry to color (it seems like there are only two industries but you can adjust the dictionary to your case):

ind_col_map = {
    "industry1": "red",
    "industry2": "blue"
}

unique_comb = df[["Name","industry"]].drop_duplicates()
name_ind_map = {x:y for x, y in zip(unique_comb["Name"],unique_comb["industry"])}

Then the color can be generated by using the above two mappings:

c = df['Name'].value_counts().index.map(lambda x: ind_col_map[name_ind_map[x]])

Finally, you only need to simply add color to your plotting function:

ax = df['Name'].value_counts().plot(kind='bar',
                                    figsize=(14,8),
                                    title="Number for each Owner Name", color=c)
ax.set_xlabel("Owner Names")
ax.set_ylabel("Frequency")
plt.show()
enter image description here

Summery

It’s all About this issue. Hope all Methods helped you a lot. Comment below Your thoughts and your queries. Also, Comment below which Method worked for you? Thank You.

Also, Read