2

I have two DataFrames:

import numpy as np
import pandas as pd
import ipywidgets as widgets
import seaborn as sns

df = pd.DataFrame(np.random.rand(6,2), index=['Nr. 1', 'Nr. 2', 'Nr. 3', 'Nr. 4', 'Nr. 5', 'Nr. 6'], columns=['A', 'B', 'C', 'D'])

df2 = pd.DataFrame(np.array([[1, 2, 3, 4]]), columns=['a', 'b', 'c', 'd'])

I want to make an interactive plot where I can choose the row of the DataFrame by a dropdown of the index of df.

This is my approach:

Index= df.index.tolist()
Nr = widgets.Dropdown(options=Nr, value=Nr[0], description='Number:', disabled=False)
button = widgets.Button(description='Plot', disabled = False, button_style='', tooltip = 'Plotting', icon='check')

out = widgets.Output(layout={'border': '1px solid black'})
box = widgets.VBox([Nr, button])
def on_button_clicked(b):
    with out:
         ax = sns.regplot(x=df_2[0], y=df.loc[[Nr]])
button.on_click(on_button_clicked, False)
display(box)

However, I get this error: 'None of [Index([Dropdown(description='Nr:', index = 4, options=('Nr. 1', 'Nr. 2', 'Nr. 3', 'Nr. 4'), value = 'Nr. 1')], dtype = 'object', name='Nr')] are in the [index]'

What am I missing?

1 Answer 1

2
import ipywidgets as widgets
from ipywidgets import interact  
import pandas as pd
import numpy as np
import seaborn as sns

# create wide dataframe
df = pd.DataFrame(np.random.rand(6, 4),
                  index=['Nr. 1', 'Nr. 2', 'Nr. 3', 'Nr. 4', 'Nr. 5', 'Nr. 6'],
                  columns=['A', 'B', 'C', 'D'])

# convert the dataframe to long form
df = df.reset_index().melt(id_vars='index')

# convert the categorical value to a number with cat.codes or factorize
df['fac'], cats = df.variable.factorize() 
# df['fac'] = df.variable.astype('category').cat.codes
# cats = df.variable.unique()

# display(df.head())
   index variable     value  fac
0  Nr. 1        A  0.700304    0
1  Nr. 2        A  0.375954    0
2  Nr. 3        A  0.168559    0
3  Nr. 4        A  0.962506    0
4  Nr. 5        A  0.503662    0

Interactive Plot

# get the unique values from the column used to select the data
idx = df['index'].unique()
@interact(Idx = idx)
def f(Idx):
    # select the relevant data
    data = df[df['index'].eq(Idx)]
    # plot
    ax = sns.regplot(data=data, x='fac', y='value')
    # set the x-ticks and labels
    ax.set_xticks(df.fac.unique(), cats)
    return ax

enter image description here

Sign up to request clarification or add additional context in comments.

2 Comments

Thank you, that works! But how can I set df2 as X-Axis?
@MisterY You can not set x= in sns.regplot to the other dataframe because x must be a string that corresponds to a column in the dataframe passed to data. Is the goal to just have the x axis labels be 1, 2, 3, 4? That can be done with ax.set_xticks(df.fac.unique(), df.fac.unique()+1) instead of ax.set_xticks(df.fac.unique(), cats)

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.