当前位置: 首页 > 知识库问答 >
问题:

破折号:散点图的多个范围

方树
2023-03-14

我是Dash的新手,在尝试基于范围滑块的范围/值进行可视化筛选时遇到了一些问题。我已经附加了我下面使用的代码块,但我似乎无法开始工作。我已经看了留档,但不知道这个问题是否与RangeSliders有关,或者只是我如何尝试通过“和”命令过滤数据框。

import dash
import dash_core_components as dcc
import dash_html_components as html
import dash_table_experiments as dt
import pandas as pd
import plotly
import plotly.graph_objs as go


#Define Dash App
app=dash.Dash()

df =  pd.DataFrame({
    'Range1': [1, 2, 3, 4, 5, 6],
    'Range2': [6, 7, 8, 9, 10, 11],
})


app.layout = html.Div([
    html.Div([
        html.H2('Sliders'),

        html.H4('Range1'),
        dcc.RangeSlider(
                        id='rangeslider_range1',
                        min=df['Range1'].min(),
                        max=df['Range1'].max(),
                        marks={str(range1): str(range1) for range1 in df['Range1'].unique()},
                        value = [df['Range1'].min(),df['Range1'].max()]
                        ),

        html.H4('Range2'),
        dcc.RangeSlider(
                        id='rangeslider_range2',
                        min=df['Range2'].min(),
                        max=df['Range2'].max(),
                        marks={str(range2): str(range2) for range2 in df['Range2'].unique()},
                        value = [df['Range2'].min(),df['Range2'].max()]
                        ),


        ],style={'width': '30%', 'display': 'inline-block'}),

    html.Div([
        dcc.Graph(id='graph_test'),
        ],
        style={'width': '60%', 'display': 'inline-block', 'float': 'right'})
    ]
)

@app.callback(
     dash.dependencies.Output('graph_test', 'figure'),
    [dash.dependencies.Input('rangeslider_range1', 'value'),
     dash.dependencies.Input('rangeslider_range2', 'value')#,

     ])

def update_graph(
                 rangeslider_range1,
                 rangeslider_range2
                 ):

    filtered_data = df[df['Range1'] == rangeslider_range1 and df['Range2'] == rangeslider_range2]

    return {
        'data': [go.Scatter(
            x=filtered_data['Range1'],
            y=filtered_data['Range2'],
            mode='markers',
        )],
        'layout': go.Layout(
            xaxis={
                'title': 'Range1',
            },
            yaxis={
                'title': 'Range2',
            },
            hovermode='closest'
        )
    }


if __name__ == '__main__':
    app.run_server()

共有1个答案

商宝
2023-03-14

您正在将数据框的列与比较整个对象的列表进行比较。rangeslider_range1是由两个值组成的列表。因此,当您对数据帧的列进行检查时,Python正在检查该列是否就是该列表。你想要以下这样的东西:

bln0 = ((df.loc[:, "Range1"] == rangeslider_range1[0]) | 
                        (df.loc[:, "Range1"] == rangeslider_range1[1]))
bln1 = ((df.loc[:, "Range2"] == rangeslider_range2[0]) | 
                        (df.loc[:, "Range2"] == rangeslider_range2[1]))
filtered_data = df.loc[bln0 & bln1, :]

这将检查列中的元素与范围滑块中的值。如果您希望这些值介于范围滑块值之间,您可以使用

以下是您的全部代码:

import dash
import dash_core_components as dcc
import dash_html_components as html
import pandas as pd
import plotly
import plotly.graph_objs as go


#Define Dash App
app=dash.Dash()

df =  pd.DataFrame({
    'Range1': [1, 2, 3, 4, 5, 6],
    'Range2': [6, 7, 8, 9, 10, 11],
})


app.layout = html.Div([
    html.Div([
        html.H2('Sliders'),

        html.H4('Range1'),
        dcc.RangeSlider(
                        id='rangeslider_range1',
                        min=df['Range1'].min(),
                        max=df['Range1'].max(),
                        marks={str(range1): str(range1) for range1 in df['Range1'].unique()},
                        value = [df['Range1'].min(),df['Range1'].max()]
                        ),

        html.H4('Range2'),
        dcc.RangeSlider(
                        id='rangeslider_range2',
                        min=df['Range2'].min(),
                        max=df['Range2'].max(),
                        marks={str(range2): str(range2) for range2 in df['Range2'].unique()},
                        value = [df['Range2'].min(),df['Range2'].max()]
                        ),


        ],style={'width': '30%', 'display': 'inline-block'}),

    html.Div([
        dcc.Graph(id='graph_test'),
        ],
        style={'width': '60%', 'display': 'inline-block', 'float': 'right'})
    ]
)

@app.callback(
     dash.dependencies.Output('graph_test', 'figure'),
    [dash.dependencies.Input('rangeslider_range1', 'value'),
     dash.dependencies.Input('rangeslider_range2', 'value')#,

     ])

def update_graph(
                 rangeslider_range1,
                 rangeslider_range2
                 ):

    bln0 = ((df.loc[:, "Range1"] == rangeslider_range1[0]) | (df.loc[:, "Range1"] == rangeslider_range1[1]))
    bln1 = ((df.loc[:, "Range2"] == rangeslider_range2[0]) | (df.loc[:, "Range2"] == rangeslider_range2[1]))
    filtered_data = df.loc[bln0 & bln1, :]
    # filtered_data = df[df['Range1'] == rangeslider_range1 and df['Range2'] == rangeslider_range2]

    return {
        'data': [go.Scatter(
            x=filtered_data['Range1'],
            y=filtered_data['Range2'],
            mode='markers',
        )],
        'layout': go.Layout(
            xaxis={
                'title': 'Range1',
            },
            yaxis={
                'title': 'Range2',
            },
            hovermode='closest'
        )
    }


if __name__ == '__main__':
    app.run_server(port = 8000)

 类似资料:
  • 我正在绘制一个仪表板,在一个散点图中有多个x特征,每个特征要么显示为直线,要么显示为带标记的直线。 我已经根据我指定的要求构建了散点图,但是,当我在本地运行仪表板时,实际上看不到散点图 这是我写的代码 这是我的数据样本 }

  • 我在Dash中有一个散点图,其中文本属性(设置悬停显示的文本)被设置为从数据框中的某个列获取文本。 问题是一些悬停文本太长,会离开页面。有没有办法给悬停长度一个固定的长度,这样就不会发生这种情况? 我看到过使用数字数据的hoverformat来实现这一点。但我的悬停信息是文本。

  • 我将按照dash wind流媒体示例从MySQL数据库中流式传输数据。每5秒向数据库添加一次数据,并分别进行查询。我使用Interval组件进行查询,并使用隐藏的div进行存储。我将回调函数中的jsonified数据读入名为df的数据帧。 我使用以下命令生成跟踪:

  • 我的dash应用程序具有基于可用dash留档中找到的食谱的导航。它的工作原理,但它不好看。谁知道介绍菜单的更好方法?我不想开发一个特殊的流星组件,但我很乐意使用目前可用的框架之一(引导,语义学,...)。

  • 这是如何与datetime一起工作的?我不能绘图日期时间x日期时间对象?这个问题是由于在y轴上绘制“小时/分钟”时的一些问题,它变得混乱。 在这个例子中,我的小时图从11:13开始,到10:54结束,但是范围是08:33到11:55 在matplotlib中打印时,它可以识别范围(我想要的),但在dash中,它会创建一个从最低值到最高值的阶梯 是的,我已经尝试过'yax':{tickform:'%

  • 我是chart.js新手,我正在尝试将散点图和折线图结合起来。 我一直在努力解决两个问题: 1.-我设法绘制了散点图,但没有显示折线图。没有抛出错误消息。 2.- 我想在底部添加一些标签,但经过多次接近后,图表只显示x轴上的数字。 我正在附加一个图像,所以你可以看到我现在在哪里。我手动绘制了折线图。 这是我使用的代码: 我尝试在许多地方放置标签:labels1,但它们从未显示出来。正如你在附图中看