У меня возникла проблема с обновлением средней линии на диаграмме рассеяния при взаимодействии с раскрывающимся списком. Раскрывающийся список позволяет пользователю выбрать столбец (ось Y), и я хочу, чтобы медиана выбранной оси Y обновлялась соответствующим образом. Однако когда я выбираю новую переменную из раскрывающегося списка, срединная линия не обновляется должным образом.
Я делюсь данными игрушечного образца:
import pandas as pd
df_input = pd.DataFrame({
'rows': range(1, 101),
'column_a': [i + (i % 10) for i in range(1, 101)],
'column_b': [i * 2 for i in range(1, 101)],
'column_c': [i ** 0.5 for i in range(1, 101)],
'outlier_prob': [0.01 * (i % 10) for i in range(1, 101)]
})
import plotly.graph_objects as go
def plot_dq_scatter_dropdown(df):
# Initialize the figure
fig = go.Figure()
# Function to add median lines (vertical for rows, horizontal for selected Y)
def add_median_lines(y):
fig.data = [] # Clear previous data
# Add a scatter trace for the selected Y variable
fig.add_trace(go.Scatter(
x=df["rows"],
y=df[y],
mode='markers',
marker=dict(color=df['outlier_prob'], colorscale='viridis', showscale=True, colorbar=dict(title='Outlier Probability')),
hoverinfo='text',
text=df.index, # Or use other columns for hover data if needed
name=f'{y} vs rows', # This will still be used for the hover and data display
showlegend=False # Hide the legend for each individual trace
))
# Calculate medians for both X and selected Y
median_x = df["rows"].median() # Median of X (rows)
median_y = df[y].median() # Median of selected Y-variable
# Add vertical median line for 'rows'
fig.add_vline(x=median_x, line=dict(color="orange", dash="dash", width=2),
annotation_text="Median rows", annotation_position="top left")
# Add horizontal median line for selected Y-variable
fig.add_hline(y=median_y, line=dict(color="orange", dash="dash", width=2),
annotation_text=f"Median {y}, {median_y}", annotation_position="top left")
# Update layout after adding the data and median lines
fig.update_layout(
title=f"Scatter Plot: rows vs {y}",
xaxis_title="rows",
yaxis_title=y,
autosize=True
)
# Add a dropdown menu for selecting the Y-axis variable
fig.update_layout(
updatemenus=[dict(
type="dropdown",
x=0.17,
y=1.15,
showactive=True,
buttons=[
dict(
label=f"{y}",
method="update",
args=[{
'y': [df[y]],
'x': [df["rows"]],
'type': 'scatter',
'mode': 'markers',
'marker': dict(color=df['outlier_prob'], colorscale='viridis', showscale=True, colorbar=dict(title='Outlier Probability')),
'hoverinfo': 'text',
'text': df.index,
'name': f'{y} vs rows',
'showlegend': False
}, {
'title': f"Scatter Plot: rows vs {y}",
'yaxis.title': y
}]
) for y in df.columns if y not in ["rows", "outlier_prob"]
]
)]
)
# Display the initial plot (default to the second column for the first plot)
add_median_lines(df.columns[1])
# Show the plot
fig.show()
# Call the function to plot the graph
plot_dq_scatter_dropdown(df_input)
Вот ошибка, с которой я сталкиваюсь визуально:
[img]https:// i.sstatic.net/WvKQMRwX.png[/img]
Горизонтальная трасса, обведенная зеленым, неожиданно является постоянной как columns_a, поскольку именно с ней я взаимодействую в раскрывающийся список был Column_b. Вертикальную трассу можно зафиксировать, поскольку она не взаимодействует с этой осью.
У меня возникла проблема с обновлением средней линии на диаграмме рассеяния при взаимодействии с раскрывающимся списком. Раскрывающийся список позволяет пользователю выбрать столбец (ось Y), и я хочу, чтобы медиана выбранной оси Y обновлялась соответствующим образом. Однако когда я выбираю новую переменную из раскрывающегося списка, срединная линия не обновляется должным образом. Я делюсь данными игрушечного образца: [code]import pandas as pd
df_input = pd.DataFrame({ 'rows': range(1, 101), 'column_a': [i + (i % 10) for i in range(1, 101)], 'column_b': [i * 2 for i in range(1, 101)], 'column_c': [i ** 0.5 for i in range(1, 101)], 'outlier_prob': [0.01 * (i % 10) for i in range(1, 101)] }) [/code] Вот функцию, которую я использую [code]import plotly.graph_objects as go
def plot_dq_scatter_dropdown(df): # Initialize the figure fig = go.Figure()
# Function to add median lines (vertical for rows, horizontal for selected Y) def add_median_lines(y): fig.data = [] # Clear previous data
# Add a scatter trace for the selected Y variable fig.add_trace(go.Scatter( x=df["rows"], y=df[y], mode='markers', marker=dict(color=df['outlier_prob'], colorscale='viridis', showscale=True, colorbar=dict(title='Outlier Probability')), hoverinfo='text', text=df.index, # Or use other columns for hover data if needed name=f'{y} vs rows', # This will still be used for the hover and data display showlegend=False # Hide the legend for each individual trace ))
# Calculate medians for both X and selected Y median_x = df["rows"].median() # Median of X (rows) median_y = df[y].median() # Median of selected Y-variable
# Add vertical median line for 'rows' fig.add_vline(x=median_x, line=dict(color="orange", dash="dash", width=2), annotation_text="Median rows", annotation_position="top left")
# Add horizontal median line for selected Y-variable fig.add_hline(y=median_y, line=dict(color="orange", dash="dash", width=2), annotation_text=f"Median {y}, {median_y}", annotation_position="top left")
# Update layout after adding the data and median lines fig.update_layout( title=f"Scatter Plot: rows vs {y}", xaxis_title="rows", yaxis_title=y, autosize=True )
# Add a dropdown menu for selecting the Y-axis variable fig.update_layout( updatemenus=[dict( type="dropdown", x=0.17, y=1.15, showactive=True, buttons=[ dict( label=f"{y}", method="update", args=[{ 'y': [df[y]], 'x': [df["rows"]], 'type': 'scatter', 'mode': 'markers', 'marker': dict(color=df['outlier_prob'], colorscale='viridis', showscale=True, colorbar=dict(title='Outlier Probability')), 'hoverinfo': 'text', 'text': df.index, 'name': f'{y} vs rows', 'showlegend': False }, { 'title': f"Scatter Plot: rows vs {y}", 'yaxis.title': y }] ) for y in df.columns if y not in ["rows", "outlier_prob"] ] )] )
# Display the initial plot (default to the second column for the first plot) add_median_lines(df.columns[1])
# Show the plot fig.show() [/code] Вот пример вызова функции: [code]# Call the function to plot the graph plot_dq_scatter_dropdown(df_input) [/code] Вот ошибка, с которой я сталкиваюсь визуально: [img]https:// i.sstatic.net/WvKQMRwX.png[/img]
Горизонтальная трасса, обведенная зеленым, неожиданно является постоянной как columns_a, поскольку именно с ней я взаимодействую в раскрывающийся список был Column_b. Вертикальную трассу можно зафиксировать, поскольку она не взаимодействует с этой осью.