The following code is going to enable you to create a very pretty bar plot, in an attractive color scheme, with the bars lining up in ascending order AND labeled with the corresponding % of the data.
Always remember, a spot on analysis is very important...and your presentation of that analysis is that cool refreshing mint iced-tea on a very hot summer day!
def my_labeled_barplot(data, feature, perc=False, n=None, order=None, palette='viridis', ascending=False):
"""
Creates a bar plot with labels showing counts or percentages, with sorting options.
Args:
data: The DataFrame containing the data.
feature: The name of the categorical column to plot.
perc: If True, display percentages on labels, otherwise counts.
n: (Optional) Width of the plot figure.
order: (Optional) 'asc' for ascending order, 'desc' for descending order,
or None for no specific order.
palette: (Optional) Color palette for the bars.
ascending: (Optional) Used when 'order' is not specified. Sorts bars in
ascending order if True, descending if False.
"""
plt.figure(figsize=(n if n else len(data.columns) + 1, 5))
if order == 'asc':
order_index = data[feature].value_counts(ascending=True).index
elif order == 'desc':
order_index = data[feature].value_counts(ascending=False).index
else:
order_index = data[feature].value_counts(ascending=not ascending).index # Sort based on ascending parameter
ax = sns.countplot(data=data, x=feature, order=order_index, palette=palette)
if perc:
total = len(data[feature])
for p in ax.patches:
percentage = '{:.1f}%'.format(100 * p.get_height() / total)
x = p.get_x() + p.get_width() / 2 - 0.1
y = p.get_y() + p.get_height()
ax.annotate(percentage, (x, y), size=10)
else:
for p in ax.patches:
x = p.get_x() + p.get_width() / 2 - 0.1
y = p.get_y() + p.get_height()
ax.annotate(p.get_height(), (x, y), size=10)
plt.xticks(rotation=90, fontsize=12)
# Example usage:
# my_labeled_barplot(data, 'Club', perc=True, order='asc') # Ascending order
# my_labeled_barplot(data, 'Club', perc=True, order='desc') # Descending order
# my_labeled_barplot(data, 'Club', perc=True, ascending=False) # Descending order without using 'order' parameter
Top comments (0)