Графически, Python - есть ли способ создать ползунок минимальной частоты, который фильтрует результаты на диаграмме рассеяния? - PullRequest
1 голос
/ 13 июля 2020

Вот мои данные:

import plotly.graph_objects as go
import pandas as pd 

data = {'vocab':['today', 'started', 'half', 'slowly', "probably", "took", "two", "daily", "change", "life",
                "effect", "wrong", "talk", "hard"], 
        'x':[-12.9, -23.4, -7.1, -6.3, -20.5, -5.8, -32.6, -8.3, -4.2, -12.3, -9.6, -4.2, - 20.4, - 15.7],
        'y':[21.6, 21.8, 33.2, 22.7, 34, 0.4, 22.4, 31.9, 17.9, 20.13, 25.7, 22.3, 26.8, 19.2],
        'freq':[277, 491, 264, 138, 250, 279, 753, 93, 77, 113, 425, 122, 326, 345]} 

df = pd.DataFrame(data)

fig = go.Figure()

config = dict({'scrollZoom': True})

fig.add_trace(go.Scatter(x = df.x, y = df.y, 
                         mode = "markers + text", 
                         text = df['vocab'], 
                         marker = dict(
                         size = df['freq'],
                         sizemode = 'area',
                         sizeref=2.*max(df['freq'])/(295.**2))))


fig.update_layout(title = "help",
                 hovermode='closest',
                 yaxis=dict(zeroline=False, showgrid=False),
                 xaxis=dict(zeroline=False, showgrid=False),
                 showlegend = False,
                 width = 1000,
                 height = 800,
                 template = "presentation")

fig.show(config=config)

Есть ли способ создать настраиваемый ползунок, который при его перемещении фильтрует пузыри на основе переменной «freq»?

I Я предполагаю, что лучше всего будет работать по процентилям, но для простоты предположим, что ползунок был установлен на значение 100, что отфильтрует все "freq" меньше 100, показывая только пузырьки с "freq" больше 100 . Я не видел, чтобы ползунки Plotly использовались таким образом, поэтому не знаю, как это построить.

1 Ответ

2 голосов
/ 13 июля 2020

Если вы ищете решение da sh, не так уж сложно добавить ползунок и фильтр в обратном вызове, как показано ниже

# app.py
import pandas as pd
import plotly.graph_objs as go
import plotly.express as px
import dash
import dash_core_components as dcc
import dash_html_components as html

# Data
data = {'vocab':['today', 'started', 'half', 'slowly', "probably", "took", "two", "daily", "change", "life",
                "effect", "wrong", "talk", "hard"], 
        'x':[-12.9, -23.4, -7.1, -6.3, -20.5, -5.8, -32.6, -8.3, -4.2, -12.3, -9.6, -4.2, - 20.4, - 15.7],
        'y':[21.6, 21.8, 33.2, 22.7, 34, 0.4, 22.4, 31.9, 17.9, 20.13, 25.7, 22.3, 26.8, 19.2],
        'freq':[277, 491, 264, 138, 250, 279, 753, 93, 77, 113, 425, 122, 326, 345]} 

df = pd.DataFrame(data)

app = dash.Dash()
app.layout = html.Div([
       dcc.Slider(
        id='my-slider',
        min=50,
        max=1000,
        step=50,
        value=50,
        marks={i: i for i in range(50,1050, 50)}
    ),

    html.Hr(),
    dcc.Graph(id='display-selected-values',
              config={'scrollZoom': True}),

])

@app.callback(
    dash.dependencies.Output('display-selected-values', 'figure'),
    [dash.dependencies.Input('my-slider', 'value')])
def update_output(value):
    ddf = df[df["freq"]>value]
    fig = go.Figure()

    config = dict({'scrollZoom': True})

    fig.add_trace(go.Scatter(x = ddf["x"],
                             y = ddf["y"], 
                             mode = "markers + text", 
                             text = ddf['vocab'], 
                             marker = dict(
                             size = ddf['freq'],
                             sizemode = 'area',
                             sizeref=2.*max(ddf['freq'])/(295.**2))))


    fig.update_layout(title = "help",
                     hovermode='closest',
                     yaxis=dict(zeroline=False, showgrid=False),
                     xaxis=dict(zeroline=False, showgrid=False),
                     showlegend = False,
                     width = 1000,
                     height = 800,
                     template = "presentation")
    return fig
    
if __name__ == '__main__':
    app.run_server()

Если вам нужно только графическое решение, вы должны создать график для каждого параметра в вашем слайдере и поиграйте с видимой опцией. См. до c

...