3
 data = {0: {'VAR1': 'A', 'VAR2': 'X', 'VAL1': 3, 'VAL2': 1},
 1: {'VAR1': 'A', 'VAR2': 'X', 'VAL1': 4, 'VAL2': 1},
 2: {'VAR1': 'A', 'VAR2': 'X', 'VAL1': 5, 'VAL2': 1},
 3: {'VAR1': 'A', 'VAR2': 'Y', 'VAL1': 3, 'VAL2': 2},
 4: {'VAR1': 'A', 'VAR2': 'Y', 'VAL1': 4, 'VAL2': 2},
 5: {'VAR1': 'A', 'VAR2': 'Y', 'VAL1': 5, 'VAL2': 2},
 6: {'VAR1': 'A', 'VAR2': 'Z', 'VAL1': 3, 'VAL2': 3},
 7: {'VAR1': 'A', 'VAR2': 'Z', 'VAL1': 4, 'VAL2': 3},
 8: {'VAR1': 'A', 'VAR2': 'Z', 'VAL1': 5, 'VAL2': 3},
 9: {'VAR1': 'B', 'VAR2': 'X', 'VAL1': 3, 'VAL2': 1},
 10: {'VAR1': 'B', 'VAR2': 'X', 'VAL1': 4, 'VAL2': 1},
 11: {'VAR1': 'B', 'VAR2': 'X', 'VAL1': 5, 'VAL2': 1},
 12: {'VAR1': 'B', 'VAR2': 'Y', 'VAL1': 3, 'VAL2': 2},
 13: {'VAR1': 'B', 'VAR2': 'Y', 'VAL1': 4, 'VAL2': 2},
 14: {'VAR1': 'B', 'VAR2': 'Y', 'VAL1': 5, 'VAL2': 2},
 15: {'VAR1': 'B', 'VAR2': 'Z', 'VAL1': 3, 'VAL2': 3},
 16: {'VAR1': 'B', 'VAR2': 'Z', 'VAL1': 4, 'VAL2': 3},
 17: {'VAR1': 'B', 'VAR2': 'Z', 'VAL1': 5, 'VAL2': 3},
 18: {'VAR1': 'C', 'VAR2': 'X', 'VAL1': 3, 'VAL2': 1},
 19: {'VAR1': 'C', 'VAR2': 'X', 'VAL1': 4, 'VAL2': 1},
 20: {'VAR1': 'C', 'VAR2': 'X', 'VAL1': 5, 'VAL2': 1},
 21: {'VAR1': 'C', 'VAR2': 'Y', 'VAL1': 3, 'VAL2': 2},
 22: {'VAR1': 'C', 'VAR2': 'Y', 'VAL1': 4, 'VAL2': 2},
 23: {'VAR1': 'C', 'VAR2': 'Y', 'VAL1': 5, 'VAL2': 2},
 24: {'VAR1': 'C', 'VAR2': 'Z', 'VAL1': 3, 'VAL2': 3},
 25: {'VAR1': 'C', 'VAR2': 'Z', 'VAL1': 4, 'VAL2': 3},
 26: {'VAR1': 'C', 'VAR2': 'Z', 'VAL1': 5, 'VAL2': 3}}

df = pd.DataFrame.from_dict(dictio, orient='index')

I like to achieve:

  • new axes for every unique element in VAR1
  • new scatter plot of VAL1(x-value) and VAL2(y-value) for elements in VAR2 for every axes from VAR1

Example for axes of VAR1=A

enter image description here

I could not figure out how to do it with the groupby.

My approach is not very good/correct:

group_var1 = df.groupby('VAR1')

for name_var1, grouped_var1 in group_var1:
    i = 0
    fig, axes = plt.subplots(nrows=3, ncols=1,figsize=(20, 8), tight_layout=True)
    group_var2 = grouped_var1.groupby('VAR2')
    for name_var2, grouped_var2 in group_var2:
        grouped_var2.plot(kind='scatter', ax=axes[i], x='VAL1', y='VAL2')

    i+=1

EDIT:

This works, but i highly dislike this approach

group_var1 = df.groupby('VAR1')
fig, axes = plt.subplots(nrows=3, ncols=1,figsize=(20, 8), tight_layout=True)
i = 0
for name_var1, grouped_var1 in group_var1:
    group_var2 = grouped_var1.groupby('VAR2')
    for name_var2, grouped_var2 in group_var2:
        grouped_var2.plot(kind='scatter', ax=axes[i], x='VAL2', y='VAL1', c=['red','green','yellow'])
    i+=1

1 Answer 1

4

I would use seaborn.relplot, which would work as a one-liner:

import seaborn as sns

sns.relplot(df, col='VAR1', hue='VAR2', x='VAL1', y='VAL2')

Output:

seaborn relplot

Not the answer you're looking for? Browse other questions tagged or ask your own question.