输入变量值后,使用 Dash(来自 Plotly)在仪表板上输出值

Posted

技术标签:

【中文标题】输入变量值后,使用 Dash(来自 Plotly)在仪表板上输出值【英文标题】:Output value on dashboard using Dash (from Plotly) after entering values for variables 【发布时间】:2020-12-05 02:32:50 【问题描述】:

我正在创建一个仪表板,其中包含一系列变量,具体来说是 12 个变量,并且我正在尝试运行一个机器学习预测模型来预测房地产价格。在此示例中,我仅使用一些变量来输出基于线性回归模型的预测。到目前为止一切顺利,输入变量看起来不错,样式表正在工作......但是,python函数生成的输出只是将它打印在“生成预测”按钮正下方的屏幕上。我添加了一些额外的代码来查看是否可以在没有运气的情况下将此值打印在 dbc.Input() 组件中,现在没有任何内容输出到仪表板中。我希望能够控制此输出的样式和位置,但我不知道如何。我将在下面包含我的代码:

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


app = dash.Dash(
    external_stylesheets=[dbc.themes.CYBORG]) #Use also SPACELAB / CYBORG
server = app.server

app.layout = html.Div([
    
    dbc.Row(dbc.Col(html.Br(),
                    ),
            ),
    dbc.Row(dbc.Col(html.H2('Price Predictor Tool'),
                    width='size': 12, 'offset':1,
                    ),
            ),
    dbc.Row(dbc.Col(html.Br(),
                    ),
            ),
    dbc.Row([
        dbc.Col(html.P('Bedrooms'),
                    width='size': 1, 'offset':1,
                    ),
         dbc.Col(html.P('Bathrooms'),
                    width='size': 1, 'offset':0,
                    ),
         dbc.Col(html.P('Half Baths'),
                    width='size': 1, 'offset':0,
                    ),
         dbc.Col(html.P('Garage Spots'),
                    width='size': 1, 'offset':0,
                    ),
        dbc.Col(html.P('Year Built'),
                    width='size': 1, 'offset':0,
                    ), 
        dbc.Col(html.P('Type of Floors'),
                    width='size': 2, 'offset':0,
                    ),
         dbc.Col(html.P('Waterfront Description'),
                    width='size': 2, 'offset':0,
                    ),
         ], no_gutters=False
        ),
    dbc.Row([
        dbc.Col(dcc.Dropdown(
            id='input-bed',
            placeholder='Number',
            options=[ 
                'label': '1', 'value': 1,
                'label': '2', 'value': 2,
                'label': '3', 'value': 3,
                'label': '4', 'value': 4,
                'label': '5', 'value': 5,
                'label': '6', 'value': 6,
                'label': '7', 'value': 7,
                'label': '8', 'value': 8,
                'label': '9', 'value': 9,
                'label': '10', 'value': 10,
                'label': '11', 'value': 11,
                'label': '12', 'value': 12,
                'label': '12+', 'value': 13]),
            width='size':1,'offset':1
    ),
        dbc.Col(dcc.Dropdown(
            id='input-bath',
            placeholder='Number',
            options=[ 
                'label': '1', 'value': 1,
                'label': '2', 'value': 2,
                'label': '3', 'value': 3,
                'label': '4', 'value': 4,
                'label': '5', 'value': 5,
                'label': '6', 'value': 6,
                'label': '7', 'value': 7,
                'label': '8', 'value': 8,
                'label': '9', 'value': 9,
                'label': '10', 'value': 10,
                'label': '11', 'value': 11,
                'label': '12', 'value': 12,
                'label': '12+', 'value': 13]),
            width='size':1,'offset':0
    ),
        dbc.Col(dcc.Dropdown(
            id='input-hbath',
            placeholder='Number',
            options=[ 
                'label': 'None', 'value': 0,
                'label': '1 or more', 'value': 1]),
            width='size':1,'offset':0
    ),
        dbc.Col(dcc.Dropdown(
            id='input-garage',
            placeholder='Number',
            options=[ 
                'label': 'None', 'value': 0,
                'label': '1', 'value': 1,
                'label': '2 or more', 'value': 2]),
            width='size':1,'offset':0
    ),
        dbc.Col(dcc.Dropdown(
            id='input-built_year',
            placeholder='Year',
            options=[
                'label': '2021', 'value': 2021,
                'label': '2020', 'value': 2020,
                'label': '2019', 'value': 2019,
                'label': '2018', 'value': 2018,
                'label': '2017', 'value': 2017,
                'label': '2016', 'value': 2016,
                'label': '2015', 'value': 2015,
                'label': '2014', 'value': 2014,
                'label': '2013', 'value': 2013,
                'label': '2012', 'value': 2012,
                'label': '2011', 'value': 2011,
                'label': '2010', 'value': 2010,
                'label': '2009', 'value': 2009,
                'label': '2008', 'value': 2008,
                'label': '2007', 'value': 2007,
                'label': '2006', 'value': 2006,
                'label': '2005', 'value': 2005,
                'label': '2004', 'value': 2004,
                'label': '2003', 'value': 2003,
                'label': '2002', 'value': 2002,
                'label': '2001', 'value': 2001,
                'label': '2000', 'value': 2000,
                'label': '1999', 'value': 1999,
                'label': '1998', 'value': 1998,
                'label': '1997', 'value': 1997,
                'label': '1996', 'value': 1996,
                'label': '1995', 'value': 1995,
                'label': '1994', 'value': 1994,
                'label': '1993', 'value': 1993,
                'label': '1992', 'value': 1992,
                'label': '1991', 'value': 1991,
                'label': '1990', 'value': 1990,
                'label': '1989', 'value': 1989,
                'label': '1988', 'value': 1988,
                'label': '1987', 'value': 1987,
                'label': '1986', 'value': 1986,
                'label': '1985', 'value': 1985,
                'label': '1984', 'value': 1984,
                'label': '1983', 'value': 1983,
                'label': '1982', 'value': 1982,
                'label': '1981', 'value': 1981,
                'label': '1980', 'value': 1980,
                'label': '1979', 'value': 1979,
                'label': '1978', 'value': 1978,
                'label': '1977', 'value': 1977,
                'label': '1976', 'value': 1976,
                'label': '1975', 'value': 1975,
                'label': '1974', 'value': 1974,
                'label': '1973', 'value': 1973,
                'label': '1972', 'value': 1972,
                'label': '1971', 'value': 1971,
                'label': '1970', 'value': 1970,
                'label': '1969', 'value': 1969,
                'label': '1968', 'value': 1968,
                'label': '1967', 'value': 1967,
                'label': '1966', 'value': 1966,
                'label': '1965', 'value': 1965,
                'label': '1964', 'value': 1964,
                'label': '1963', 'value': 1963,
                'label': '1962', 'value': 1962,
                'label': '1961', 'value': 1961,
                'label': '1960', 'value': 1960,
                'label': '1959', 'value': 1959,
                'label': '1958', 'value': 1958,
                'label': '1957', 'value': 1957,
                'label': '1956', 'value': 1956,
                'label': '1955', 'value': 1955,
                'label': '1954', 'value': 1954,
                'label': '1953', 'value': 1953,
                'label': '1952', 'value': 1952,
                'label': '1951', 'value': 1951,
                'label': '1950', 'value': 1950,
                'label': '1949', 'value': 1949,
                'label': '1948', 'value': 1948,
                'label': '1947', 'value': 1947,
                'label': '1946', 'value': 1946,
                'label': '1945', 'value': 1945,
                'label': '1944', 'value': 1944,
                'label': '1943', 'value': 1943,
                'label': '1942', 'value': 1942,
                'label': '1941', 'value': 1941,
                'label': '1940', 'value': 1940,
                'label': '1939', 'value': 1939,
                'label': '1938', 'value': 1938,
                'label': '1937', 'value': 1937,
                'label': '1936', 'value': 1936,
                'label': '1935', 'value': 1935,
                'label': '1934', 'value': 1934,
                'label': '1933', 'value': 1933,
                'label': '1932', 'value': 1932,
                'label': '1931', 'value': 1931,
                'label': '1930', 'value': 1930,
                'label': '1929', 'value': 1929,
                'label': '1928', 'value': 1928,
                'label': '1927', 'value': 1927,
                'label': '1926', 'value': 1926,
                'label': '1925', 'value': 1925,
                'label': '1924', 'value': 1924,
                'label': '1923', 'value': 1923,
                'label': '1922', 'value': 1922,
                'label': '1921', 'value': 1921,
                'label': '1920', 'value': 1920,
                'label': '1919', 'value': 1919,
                'label': '1918', 'value': 1918,
                'label': '1917', 'value': 1917,
                'label': '1916', 'value': 1916,
                'label': '1915', 'value': 1915,
                'label': '1914', 'value': 1914,
                'label': '1913', 'value': 1913,
                'label': '1912', 'value': 1912,
                'label': '1911', 'value': 1911,
                'label': '1910', 'value': 1910,
                'label': '1909', 'value': 1909,
                'label': '1908', 'value': 1908,
                'label': '1907', 'value': 1907,
                'label': '1906', 'value': 1906,
                'label': '1905', 'value': 1905,
                'label': '1904', 'value': 1904,
                'label': '1903', 'value': 1903,
                'label': '1902', 'value': 1902,
                'label': '1901', 'value': 1901,
                'label': '1900', 'value': 1900]),
            width='size':1,'offset':0
    ),
        dbc.Col(dcc.Dropdown(
            id='input-floor',
            placeholder='Select all that apply',
            options=[
                'label': 'Marble', 'value': 'Marble',
                'label': 'Vinyl', 'value': 'Vinyl',
                'label': 'Ceramic', 'value': 'Ceramic',
                'label': 'Carpeted', 'value': 'Carpeted',
                'label': 'Tile', 'value': 'Tile',
                'label': 'Other', 'value': 'Other'],
            value=[],
            multi=True),
            width='size':2,'offset':0
    ),
        dbc.Col(dcc.Dropdown(
            id='input-waterfront',
            placeholder='Select all that apply',
            options=[ 
                'label': 'Ocean Front', 'value': 'Ocean Front',
                'label': 'Intracoastal Front', 'value': 'Intracoastal Front',
                'label': 'No Fixed Bridges', 'value': 'No Fixed Bridges',
                'label': 'Bay Front', 'value': 'Bay Front',
                'label': 'Fixed Bridges(s)', 'value': 'Fixed Bridges(s)',
                'label': 'Canal Front ', 'value': 'Canal Front '],
            value=[],
            multi=True),
            width='size':2,'offset':0,
    ),
    ], no_gutters=False
        ),
    html.Br(),
    html.Br(),
     dbc.Row([
         dbc.Col(html.P('Living Area (Sq Ft)'),
                    width='size': 2, 'offset':1,
                    ),
         dbc.Col(html.P('Lot Area (Sq Ft)'),
                    width='size': 2, 'offset':0,
                    ),
         dbc.Col(html.P('Zip Code'),
                    width='size': 1, 'offset':0,
                    ),
         dbc.Col(html.P('Listing Starting Date'),
                    width='size': 2, 'offset':0,
                    ),
         dbc.Col(html.P('Projected Days on the Market'),
                    width='size': 2, 'offset':0,
                    ),
         ], no_gutters=False
        ),
    dbc.Row([
        dbc.Col(
            dbc.Input(id='input-living_area', type='number', 
                      placeholder='From 400 to 15000', 
                      min=400, max=15000, step=1, className='mb-3'),
            width='size':2, 'offset':1,
            ),
        dbc.Col(
            dbc.Input(id='input-lot_area', type='number', 
                      placeholder='From 400+', 
                      min=400, max=15000, step=1, className='mb-3'),
            width='size':2, 'offset':0,
            ),
        dbc.Col(dcc.Dropdown(
            id='input-zip_code',
            placeholder='33131',
            options=[ 
                'label': '33498', 'value': 33498,
                'label': '33496', 'value': 33496,
                'label': '33493', 'value': 33493,
                'label': '33487', 'value': 33487,
                'label': '33486', 'value': 33486,
                'label': '33484', 'value': 33484,
                'label': '33483', 'value': 33483,
                'label': '33480', 'value': 33480,
                'label': '33478', 'value': 33478,
                'label': '33477', 'value': 33477,
                'label': '33476', 'value': 33476,
                'label': '33473', 'value': 33473,
                'label': '33472', 'value': 33472,
                'label': '33470', 'value': 33470,
                'label': '33469', 'value': 33469,
                'label': '33467', 'value': 33467,
                'label': '33463', 'value': 33463,
                'label': '33462', 'value': 33462,
                'label': '33461', 'value': 33461,
                'label': '33460', 'value': 33460,
                'label': '33458', 'value': 33458,
                'label': '33449', 'value': 33449,
                'label': '33446', 'value': 33446,
                'label': '33445', 'value': 33445,
                'label': '33444', 'value': 33444,
                'label': '33442', 'value': 33442,
                'label': '33441', 'value': 33441,
                'label': '33438', 'value': 33438,
                'label': '33437', 'value': 33437,
                'label': '33436', 'value': 33436,
                'label': '33435', 'value': 33435,
                'label': '33434', 'value': 33434,
                'label': '33433', 'value': 33433,
                'label': '33432', 'value': 33432,
                'label': '33431', 'value': 33431,
                'label': '33430', 'value': 33430,
                'label': '33428', 'value': 33428,
                'label': '33426', 'value': 33426,
                'label': '33418', 'value': 33418,
                'label': '33417', 'value': 33417,
                'label': '33415', 'value': 33415,
                'label': '33414', 'value': 33414,
                'label': '33413', 'value': 33413,
                'label': '33412', 'value': 33412,
                'label': '33411', 'value': 33411,
                'label': '33410', 'value': 33410,
                'label': '33409', 'value': 33409,
                'label': '33408', 'value': 33408,
                'label': '33407', 'value': 33407,
                'label': '33406', 'value': 33406,
                'label': '33405', 'value': 33405,
                'label': '33404', 'value': 33404,
                'label': '33403', 'value': 33403,
                'label': '33401', 'value': 33401,
                'label': '33351', 'value': 33351,
                'label': '33334', 'value': 33334,
                'label': '33332', 'value': 33332,
                'label': '33331', 'value': 33331,
                'label': '33330', 'value': 33330,
                'label': '33328', 'value': 33328,
                'label': '33327', 'value': 33327,
                'label': '33326', 'value': 33326,
                'label': '33325', 'value': 33325,
                'label': '33324', 'value': 33324,
                'label': '33323', 'value': 33323,
                'label': '33322', 'value': 33322,
                'label': '33321', 'value': 33321,
                'label': '33319', 'value': 33319,
                'label': '33317', 'value': 33317,
                'label': '33316', 'value': 33316,
                'label': '33315', 'value': 33315,
                'label': '33314', 'value': 33314,
                'label': '33313', 'value': 33313,
                'label': '33312', 'value': 33312,
                'label': '33311', 'value': 33311,
                'label': '33309', 'value': 33309,
                'label': '33308', 'value': 33308,
                'label': '33306', 'value': 33306,
                'label': '33305', 'value': 33305,
                'label': '33304', 'value': 33304,
                'label': '33301', 'value': 33301,
                'label': '33196', 'value': 33196,
                'label': '33194', 'value': 33194,
                'label': '33193', 'value': 33193,
                'label': '33190', 'value': 33190,
                'label': '33189', 'value': 33189,
                'label': '33187', 'value': 33187,
                'label': '33186', 'value': 33186,
                'label': '33185', 'value': 33185,
                'label': '33184', 'value': 33184,
                'label': '33183', 'value': 33183,
                'label': '33182', 'value': 33182,
                'label': '33181', 'value': 33181,
                'label': '33180', 'value': 33180,
                'label': '33179', 'value': 33179,
                'label': '33178', 'value': 33178,
                'label': '33177', 'value': 33177,
                'label': '33176', 'value': 33176,
                'label': '33175', 'value': 33175,
                'label': '33174', 'value': 33174,
                'label': '33173', 'value': 33173,
                'label': '33172', 'value': 33172,
                'label': '33170', 'value': 33170,
                'label': '33169', 'value': 33169,
                'label': '33168', 'value': 33168,
                'label': '33167', 'value': 33167,
                'label': '33166', 'value': 33166,
                'label': '33165', 'value': 33165,
                'label': '33162', 'value': 33162,
                'label': '33161', 'value': 33161,
                'label': '33160', 'value': 33160,
                'label': '33158', 'value': 33158,
                'label': '33157', 'value': 33157,
                'label': '33156', 'value': 33156,
                'label': '33155', 'value': 33155,
                'label': '33154', 'value': 33154,
                'label': '33150', 'value': 33150,
                'label': '33149', 'value': 33149,
                'label': '33147', 'value': 33147,
                'label': '33146', 'value': 33146,
                'label': '33145', 'value': 33145,
                'label': '33144', 'value': 33144,
                'label': '33143', 'value': 33143,
                'label': '33142', 'value': 33142,
                'label': '33141', 'value': 33141,
                'label': '33140', 'value': 33140,
                'label': '33139', 'value': 33139,
                'label': '33138', 'value': 33138,
                'label': '33137', 'value': 33137,
                'label': '33136', 'value': 33136,
                'label': '33135', 'value': 33135,
                'label': '33134', 'value': 33134,
                'label': '33133', 'value': 33133,
                'label': '33132', 'value': 33132,
                'label': '33131', 'value': 33131,
                'label': '33130', 'value': 33130,
                'label': '33129', 'value': 33129,
                'label': '33128', 'value': 33128,
                'label': '33127', 'value': 33127,
                'label': '33126', 'value': 33126,
                'label': '33125', 'value': 33125,
                'label': '33122', 'value': 33122,
                'label': '33109', 'value': 33109,
                'label': '33101', 'value': 33101,
                'label': '33076', 'value': 33076,
                'label': '33073', 'value': 33073,
                'label': '33071', 'value': 33071,
                'label': '33069', 'value': 33069,
                'label': '33068', 'value': 33068,
                'label': '33067', 'value': 33067,
                'label': '33066', 'value': 33066,
                'label': '33065', 'value': 33065,
                'label': '33064', 'value': 33064,
                'label': '33063', 'value': 33063,
                'label': '33062', 'value': 33062,
                'label': '33060', 'value': 33060,
                'label': '33056', 'value': 33056,
                'label': '33055', 'value': 33055,
                'label': '33054', 'value': 33054,
                'label': '33039', 'value': 33039,
                'label': '33035', 'value': 33035,
                'label': '33034', 'value': 33034,
                'label': '33033', 'value': 33033,
                'label': '33032', 'value': 33032,
                'label': '33031', 'value': 33031,
                'label': '33030', 'value': 33030,
                'label': '33029', 'value': 33029,
                'label': '33028', 'value': 33028,
                'label': '33027', 'value': 33027,
                'label': '33026', 'value': 33026,
                'label': '33025', 'value': 33025,
                'label': '33024', 'value': 33024,
                'label': '33023', 'value': 33023,
                'label': '33021', 'value': 33021,
                'label': '33020', 'value': 33020,
                'label': '33019', 'value': 33019,
                'label': '33018', 'value': 33018,
                'label': '33016', 'value': 33016,
                'label': '33015', 'value': 33015,
                'label': '33014', 'value': 33014,
                'label': '33013', 'value': 33013,
                'label': '33012', 'value': 33012,
                'label': '33010', 'value': 33010,
                'label': '33009', 'value': 33009,
                'label': '33004', 'value': 33004]),
            width='size':1,'offset':0
    ),
        dbc.Col(dcc.Dropdown(
            id='input-selling_month',
            placeholder='Select Month',
            options=[ 
                'label': 'January', 'value': 1,
                'label': 'February', 'value': 2,
                'label': 'March', 'value': 3,
                'label': 'April', 'value': 4,
                'label': 'May', 'value': 5,
                'label': 'June', 'value': 6,
                'label': 'July', 'value': 7,
                'label': 'August', 'value': 8,
                'label': 'September', 'value': 9,
                'label': 'October', 'value': 10,
                'label': 'November', 'value': 11,
                'label': 'December', 'value': 12]),
            width='size':2,'offset':0
    ),
           dbc.Col(dcc.Dropdown(
            id='input-dom',
            placeholder='Select between 30, 60 and 90',
            options=[ 
                'label': '30', 'value': 30,
                'label': '60', 'value': 60,
                'label': '90', 'value': 90]),
            width='size':2,'offset':0
    ),
        
    ], no_gutters=False
        ),
    html.Br(),
    html.Br(),
    dbc.Row([
        dbc.Col(
                [
        dbc.Button('Generate Prediction', id='input-predi_button', n_clicks=0, color='primary', className="mr-2"),
        html.Span(id="input-prediction", style="vertical-align": "middle"),
    ],
    width='size':6,'offset':1
    ),
        ], no_gutters=True
        ),
    html.Br(),
    html.Br(),
    html.Div(dbc.FormGroup(dbc.FormGroup(
    [
        dbc.Label("Property's Price Prediction", html_for="text-prediction", width='size':2,'offset':1),
        dbc.Col(
            dbc.Input(
                id='result', placeholder=""
            ),
            width='size':1,'offset':0,
        ),
    ], row=True,
    )))
    ])

@app.callback(
    Output('result', 'children'),
    [Input('input-predi_button', 'n_clicks')],
    [State('input-bed', 'value'),
      State('input-bath', 'value'),
      State('input-hbath', 'value'),
      State('input-garage', 'value'),
      State('input-built_year', 'value'),
      State('input-floor', 'value'),
      State('input-waterfront', 'value'),
      State('input-living_area', 'value'),
      State('input-lot_area', 'value'),
      State('input-zip_code', 'value'),
      State('input-selling_month', 'value'),
      State('input-dom', 'value')]
)
def update_result(n_clicks,bed, bath, hbath, garage, built_year, floor, 
             waterfront, living_area, lot_area, zip_code, selling_month, dom):
    if int(n_clicks) > 0:
        prediction =(-39422.64)+(bed*(-261049.88))+(bath*227856.66)+\
            (hbath*15413.56)+(garage*17875.03)+(dom*274.12)+\
                (living_area*693.40)+(built_year*350.07)+(zip_code*(-34.75))    
    
        return prediction


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

【问题讨论】:

如果提供的建议解决了您的问题,请将其标记为已接受的答案。我看到您现在已经提出了 12 个问题,并收到了许多有用的答案。然而你还没有接受一个单一的答案。如果你能在这里写一个问题,我相信你也能找到如何接受答案。 【参考方案1】:

您的回调将其输出设置为dbc.Input 组件,该组件没有children 属性。您需要将其更改为 Output('result', 'value') 或使用其他组件来显示您的输出。

或者,您可以将 dbc.Input(id='result', placeholder="") 更改为 html.Div(id='result'),然后您可以保持回调函数不变。

【讨论】:

以上是关于输入变量值后,使用 Dash(来自 Plotly)在仪表板上输出值的主要内容,如果未能解决你的问题,请参考以下文章

Plotly:如何使用plotly-dash在一页上创建“输入文本”并在第二页或选项卡上输出(图形)?

Plotly-Dash:- 文件上传后在 plotly dash 中进行多列过滤

Plotly Dash 表回调

将表单添加到 Dash/Plotly 应用程序

Plotly Dash 回调错误:试图隐藏 Div 组件

Plotly Dash dcc.Interval 在一段时间后失败:回调错误更新 graph.figure