0

I'm trying to annotate a chart to include the plotted values of the x-axis as well as additional information from the DataFrame. I am able to annotate the values from the x-axis but not sure how I can add additional information from the data frame. In my example below I am annotating the x-axis which are the values from the Completion column but also want to add the Completed and Participants values from the DataFrame.

For example the Running Completion is 20% but I want my annotation to show the Completed and Participants values in the format - 20% (2/10). Below is sample code that can reproduce my scenario as well as current and desired results. Any help is appreciated.

Code:

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

mydict = {
    'Event': ['Running', 'Swimming', 'Biking', 'Hiking'],
    'Completed': [2, 4, 3, 7],
    'Participants': [10, 20, 35, 10]}

df = pd.DataFrame(mydict).set_index('Event')
df = df.assign(Completion=(df.Completed/df.Participants) * 100)
print(df)

plt.subplots(figsize=(5, 3))
ax = sns.barplot(x=df.Completion, y=df.index, color="cyan", orient='h')

for i in ax.patches:
    ax.text(i.get_width() + .4,
            i.get_y() + .67,
            str(round((i.get_width()), 2)) + '%', fontsize=10)

plt.tight_layout()
plt.show()

DataFrame:

          Completed  Participants  Completion
Event                                        
Running           2            10   20.000000
Swimming          4            20   20.000000
Biking            3            35    8.571429
Hiking            7            10   70.000000

Current Output:

enter image description here

Desired Output:

enter image description here

1 Answer 1

1

Loop through the columns Completed and Participants as well when you annotate:

for (c,p), i in zip(df[["Completed","Participants"]].values, ax.patches):
    ax.text(i.get_width() + .4,
            i.get_y() + .67,
            str(round((i.get_width()), 2)) + '%' + f" ({c}/{p})", fontsize=10)
Sign up to request clarification or add additional context in comments.

1 Comment

This is awesome. That accomplishes what I was looking for. Thanks for the help!

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.