Output
Data and Model
import plotly.express as px
data = px.data.iris()

from sklearn.decomposition import PCA
pca = PCA(n_components=2)
pca.fit(data.iloc[:, :4])
data_pca = pca.transform(data.iloc[:, :4])
		
Plot
import plotly.graph_objects as go

def get_plot(x, y):
    fig = go.Figure()
    trace = go.Scatter(x=data_pca[:, 0][data['species_id'] == 1], y=data_pca[:, 1][data['species_id'] == 1], mode='markers', name = 'setosa')
    trace_2 = go.Scatter(x=data_pca[:, 0][data['species_id'] == 2], y=data_pca[:, 1][data['species_id'] == 2], mode='markers', name = 'versicolor')
    trace_3 = go.Scatter(x=data_pca[:, 0][data['species_id'] == 3], y=data_pca[:, 1][data['species_id'] == 3], mode='markers', name = 'virginica')
    trace_4 = go.Scatter(x=[x], y=[y], mode='markers', marker=dict(size=[20], color=['red']), name = 'selected')
    fig.add_trace(trace)
    fig.add_trace(trace_2)
    fig.add_trace(trace_3)
    fig.add_trace(trace_4)
    return fig
        
Components
import ipywidgets as widgets
def get_slider(label, start, end):
    return widgets.FloatSlider(description=label, min=start, max=end, value = (start+end)/2)
        
Layout (Option 1)
import numpy as np

# Create layout
a = get_slider('Sepal Length', min(data.iloc[:, 0]), max(data.iloc[:, 0]))
b = get_slider('Sepal Width', min(data.iloc[:, 1]), max(data.iloc[:, 1]))
c = get_slider('Petal Length', min(data.iloc[:, 2]), max(data.iloc[:, 2]))
d = get_slider('Petal Width', min(data.iloc[:, 3]), max(data.iloc[:, 3]))

out = widgets.Output(layout={'border': '1px solid black'})

display(widgets.HBox([widgets.VBox([a, b, c, d]), out]))

def display_info(change):
    out.clear_output()
    pca_test = pca.transform(np.array([a.value, b.value, c.value, d.value]).reshape(-1, 4))
    with out:
        display(get_plot(pca_test[0][0], pca_test[0][1]))
    
a.observe(display_info, names=['value'], type='change')
b.observe(display_info, names=['value'], type='change')
c.observe(display_info, names=['value'], type='change')
d.observe(display_info, names=['value'], type='change')
        
Layout (Option 2)
import numpy as np

# Create layout
a = get_slider('Sepal Length', min(data.iloc[:, 0]), max(data.iloc[:, 0]))
b = get_slider('Sepal Width', min(data.iloc[:, 1]), max(data.iloc[:, 1]))
c = get_slider('Petal Length', min(data.iloc[:, 2]), max(data.iloc[:, 2]))
d = get_slider('Petal Width', min(data.iloc[:, 3]), max(data.iloc[:, 3]))
button = widgets.Button(description='Click')

out = widgets.Output(layout={'border': '1px solid black'})

display(widgets.HBox([widgets.VBox([a, b, c, d, button]), out]))

def display_info(button_click):
    out.clear_output()
    pca_test = pca.transform(np.array([a.value, b.value, c.value, d.value]).reshape(-1, 4))
    with out:
        display(get_plot(pca_test[0][0], pca_test[0][1]))
    
button.on_click(display_info)