1

I have a multi-index dataframe that I've melted to look something like this:

Color   Frequency           variable        value
Red     2-3 times a month   x               22
Red     A few days a week   x               45
Red     At least once a day x               344
Red     Never               x               5
Red     Once a month        x               1
Red     Once a week         x               0
Red     Once every few months x             4
Blue    2-3 times a month   x               4
Blue    A few days a week   x               49
Blue    At least once a day x               200
Blue    Never               x               7
Blue    Once a month        x               19
Blue    Once a week         x               10
Blue    Once every few months x             5
Red     2-3 times a month   y               3
Red     A few days a week   y               97
Red     At least once a day y               144
Red     Never               y               4
Red     Once a month        y               0
Red     Once a week         y               0
Red     Once every few months y             4
Blue    2-3 times a month   y               44
Blue    A few days a week   y               62
Blue    At least once a day y               300
Blue    Never               y               2
Blue    Once a month        y               4
Blue    Once a week         y               23
Blue    Once every few months y             6
Red     2-3 times a month   z               4
Red     A few days a week   z               12
Red     At least once a day z               101
Red     Never               z               0
Red     Once a month        z               0
Red     Once a week         z               10
Red     Once every few months z             0
Blue    2-3 times a month   z               100
Blue    A few days a week   z               203
Blue    At least once a day z               299
Blue    Never               z               0
Blue    Once a month        z               0
Blue    Once a week         z               204
Blue    Once every few months z             100

I'm trying to make a seaborn plot where there are two categories for the x-axis variable and Frequency and the hue is based on Color. Moreover, I want the y-axis to be the proportion of value over the sum of the values for that variable for each Color; e.g. the y-value for variable "x.2-3 times a month" should be 22/(22+45+344+5+1+0+4) or 5.22%.

So far I have this:

import seaborn as sns
fig, ax1 = plt.subplots(figsize=(20, 10))
sns.factorplot(x='variable',y='value', hue='Frequency', data=df, kind='bar', ax=ax1)

This is part of the way there. How do I also groupby 1) Color and 2) take the proportion of values for each variable & Frequency, rather than the count?

1 Answer 1

2

This is what you need to find the portion of each number for that group:

df['proportion'] = df['value'] / df.groupby(['Color','variable'])['value'].transform('sum')

Output:

   variable              Frequency Color  value   portion
0         x      2-3 times a month   Red     22  0.052257
1         x      A few days a week   Red     45  0.106888
2         x    At least once a day   Red    344  0.817102
3         x                  Never   Red      5  0.011876
4         x           Once a month   Red      1  0.002375
5         x            Once a week   Red      0  0.000000
6         x  Once every few months   Red      4  0.009501
7         x      2-3 times a month  Blue      4  0.013605
8         x      A few days a week  Blue     49  0.166667
9         x    At least once a day  Blue    200  0.680272
10        x                  Never  Blue      7  0.023810
11        x           Once a month  Blue     19  0.064626
12        x            Once a week  Blue     10  0.034014
13        x  Once every few months  Blue      5  0.017007
14        y      2-3 times a month   Red      3  0.011905
15        y      A few days a week   Red     97  0.384921
16        y    At least once a day   Red    144  0.571429
17        y                  Never   Red      4  0.015873
18        y           Once a month   Red      0  0.000000
19        y            Once a week   Red      0  0.000000
20        y  Once every few months   Red      4  0.015873
21        y      2-3 times a month  Blue     44  0.099773
22        y      A few days a week  Blue     62  0.140590
23        y    At least once a day  Blue    300  0.680272
24        y                  Never  Blue      2  0.004535
25        y           Once a month  Blue      4  0.009070
26        y            Once a week  Blue     23  0.052154
27        y  Once every few months  Blue      6  0.013605
28        z      2-3 times a month   Red      4  0.031496
29        z      A few days a week   Red     12  0.094488
30        z    At least once a day   Red    101  0.795276
31        z                  Never   Red      0  0.000000
32        z           Once a month   Red      0  0.000000
33        z            Once a week   Red     10  0.078740
34        z  Once every few months   Red      0  0.000000
35        z      2-3 times a month  Blue    100  0.110375
36        z      A few days a week  Blue    203  0.224062
37        z    At least once a day  Blue    299  0.330022
38        z                  Never  Blue      0  0.000000
39        z           Once a month  Blue      0  0.000000
40        z            Once a week  Blue    204  0.225166
41        z  Once every few months  Blue    100  0.110375
Sign up to request clarification or add additional context in comments.

2 Comments

what's the kosher thing to do on s/o? Mark yours as correct and ask a new question just about the graph? Or let it be and see if someone else answers?
You can accepr if this answered your question to your satisfication. Then, ask a more succinct question about charting.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.