【问题标题】:Dash Interactive Graph Won't Update From Pandas DataframeDash 交互式图表不会从 Pandas 数据框更新
【发布时间】:2020-04-15 21:20:14
【问题描述】:

我正在尝试创建一个从 Dash 上的多选下拉菜单更新的条形图,但是当我选择要绘制的区号时,没有任何变化。

我的数据框由大约 11 行 4 列组成:

  Zip Code  Area Name     percent no internet   Mean Income Past 12 Months
0   38126   South Forum   0.8308                26346
1   38106   South Memphis 0.8223                31403
2   38108   Hollywood     0.7356                31278

这里是回调的代码:

@app.callback(
    dash.dependencies.Output('graph1', 'figure'),
    [dash.dependencies.Input('demo-dropdown', 'value')])
def update_image_src(selector):
    data = []
    filtered_data = df[df['Zip Code'] == zip_code]
    for zip_code in selector:
        data.append(dict(
            x=filtered_data['Area Name'][0],
            y=filtered_data['percent no internet'][0],
            type='bar',
            name=zip_code))
    figure = {
        'data': data,
        'layout': {
            'title': 'Percent of homes lacking broadband internet',
            'xaxis' : dict(
                title=data[0],
                titlefont=dict(
                family='Courier New, monospace',
                size=20,
                color='#7f7f7f'
            )),
            'yaxis' : dict(
                title='% No Internet',
                titlefont=dict(
                family='Helvetica, monospace',
                size=20,
                color='#7f7f7f'
            ))
        }
    }
    return figure

【问题讨论】:

  • 应该 filtered_data = df[df['Zip Code'] == zip_code] 在循环中 for zip_code in selector 而不是之前?
  • 我尝试了这个并且图形更新并通过添加轴标题来识别更改,但数据本身仍然没有实际绘制。它只是一个带有标题的空图。 @Ben.T
  • 我明白了,您能否将数据框作为文本发布在问题中(您可以单击问题底部的编辑),我看不到图像。问题可能来自您从filtered_data 获取数据的方式,实际上,这样做filtered_data['Area Name'][0] 意味着您获得列“区域名称”和标签为 0 而不是位置 0 的索引,因此无法查看数据我不确定,但我猜你的索引是不同的标签?
  • @Ben.T 我在问题中添加了前 3 行!
  • @Ben.T 我还尝试将所需的数据存储为列表并以这种方式提供它 - l = [], x = df[df['Zip Code'] == ' 38126']['Zip Code'][0], l.append(x), l 因为我目前通过手动创建包含数据子集的字典来处理图表。它适用于此,但我显然想从我的数据框中提取,这就是我尝试这种方法的原因,因为我认为需要将数据作为列表输入,但上述方法也不起作用:/跨度>

标签: python pandas plotly-dash


【解决方案1】:

IIUC,这里的代码似乎可以满足您的需求。我可以用您的原始代码解决的一点是,首先您不定义图形的类型,其次不是迭代选择器,您可以使用 isin 一次获取所有内容。希望对你有帮助

import dash
from dash.dependencies import Output,Input
import dash_core_components as dcc
import dash_html_components as html

# the few rows of your question
import pandas as pd
df = pd.DataFrame( {'Zip Code': {0: 38126, 1: 38106, 2: 38108},
                    'Area Name': {0: 'South Forum', 1: 'South Memphis', 2: 'Hollywood'},
                    'percent no internet': {0: 0.8308, 1: 0.8223, 2: 0.7356},
                    'Mean Income Past 12 Months': {0: 26346, 1: 31403, 2: 31278}})   
# main app
app = dash.Dash(__name__)
app.layout = html.Div(children=[
    dcc.Dropdown(
        id='demo-dropdown', 
        options=[
            {'label': 38126, 'value': 38126},
            {'label': 38106, 'value': 38106},
            {'label': 38108, 'value': 38108}
        ],
        value=[38126, 38106],
        multi=True
    ),
    dcc.Graph(id='graph1'),
])

@app.callback(
    dash.dependencies.Output('graph1', 'figure'),
    [dash.dependencies.Input('demo-dropdown', 'value')])
def update_image_src(selector):
    # instead of iterating, use isin to select all the zipcode from the dropdown
    filtered_data = df.loc[ df['Zip Code'].isin(selector), 
                            ['Area Name', 'percent no internet']]

    figure = {
        # in figure, see how the data is defined
        'data': [{'x': filtered_data['Area Name'], 
                  'y': filtered_data['percent no internet'], 
                  'type': 'bar'}
        ],
        'layout': {
            'title': 'Percent of homes lacking broadband internet',
            'xaxis' : dict(
                title='Area Name', #change this, I'm not sure what you wanted
                titlefont=dict(
                    family='Courier New, monospace',
                    size=20,
                    color='#7f7f7f'
                )
            ),
            'yaxis' : dict(
                title='% No Internet',
                titlefont=dict(
                    family='Helvetica, monospace',
                    size=20,
                    color='#7f7f7f'
                )
            )
        }
    }
    return figure


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

编辑:获取不同的颜色和图例,然后在字典中替换 figure 如下:

figure = {
        # in figure, see how is define the data
        'data': [{'x': [area_name], 
                  'y': [percent], 
                  'type': 'bar', 
                  'name': area_name}
                  for area_name, percent in filtered_data.to_numpy()
        ],
...

【讨论】:

  • 这成功了!只有一个问题,当它绘制多个项目时,每个新条都是相同的颜色而不是新颜色。此外,我也失去了传奇。它正确地绘制了数据,但我没有这两个方面@Ben.T
  • @ZachCornelison 顺便说一句,现在我更好地理解了为什么你需要一个循环,我一开始没有得到它,因为你只在一系列价值上绘图!对此感到抱歉
  • 没问题,您提供的代码非常适合我! @Ben.T
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-15
  • 1970-01-01
  • 2018-10-28
  • 2014-06-08
相关资源
最近更新 更多