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

如何从可编辑表格更新绘图仪/虚线图?

宦飞
2023-03-14

我有一个带有可删除行和列的dash DataTable对象。我想根据可见行更新图形。我不确定如何创建回调以及要传递哪些参数。在浏览器中删除行时,表对象中存储的数据实际上可能不会更改。

from dash_table import DataTable

def lineplot(id, df, cols, title=None, xlabel=None, ylabel=None, x=None, 
             xaxis_type=None, yaxis_type=None, plotly_config=plotly_config,
            ):

    if x is None:
        x_values = df.index
        xlabel = df.index.name
    else:
        x_values = df[x]

    data = [{
        'x': x_values,
        'y': df[col],
        'name': col }  for col in cols]

    layout = go.Layout(
        title=go.layout.Title(
            text=title,
            xref='paper',
            xanchor='center'
        ),
        xaxis = go.layout.XAxis(
            title=go.layout.xaxis.Title(
                text=xlabel,
                font=plotly_config['font'],

            ),
            type=xaxis_type
        ),
        yaxis=go.layout.YAxis(
            title=go.layout.yaxis.Title(
                text=ylabel,
                font=plotly_config['font'],
            ),
        type=yaxis_type
        ),
        showlegend=True
    )


    return dcc.Graph(
        id=id,
        figure={'data': data,
                'layout': layout},
        style={"max-width": "600px", 
               "margin": "auto", 
               "display": "inline-block"})

def table(id, df):
    dt = DataTable(
        id=id,
        data=df.to_dict('records'),
        columns=[{"name": i, 
                  "id": i, 
                  "deletable": True, 
                  "searchable": True} for i in df.columns], 
        sorting=True, 
        style_cell={
            'minWidth': '0px', 
            'maxWidth': '180px',
            'whiteSpace': 'no-wrap',
            'overflow': 'hidden',
            'textOverflow': 'ellipsis'},
        style_table={'overflowX': 'scroll'},
        row_deletable=True,
        pagination_mode="fe",
        pagination_settings={
                "displayed_pages": 1,
                "current_page": 0,
                "page_size": 15},
        navigation="page"
        )
    return dt

app = dash.Dash(__name__)
app.layout = html.Div(children=[
    table(id='table', df=pd.DataFrame(...)),
    lineplot(id='plot',...)
])

@app.callback(Output('plot', 'data'),
              [Input('table', 'data')])
def update_graph(data):
    return pd.DataFrame(data)

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

共有1个答案

景宏富
2023-03-14

我不确定如何创建回调以及要传递哪些参数

您需要的参数必须包含表中的信息,以便可以相应地更新图形。您可以在联机文档中找到可以从组件中收集的属性:https://dash.plot.ly/datatable/reference.

在浏览器中删除行时,表对象中存储的数据实际上可能不会更改。

我不知道我是否理解你的意思。如果通过web界面删除表中的行,则传递给更新函数的数据将发生相应的更改,从而可以相应地更新图形。

我对你的代码做了一些调整,这样对我来说看起来更自然。在某些地方,我不得不做出改变,因为我没有足够的关于你目标的信息。下面您可以看到一个工作示例,您必须根据您的需求进行相应的调整。我创建了一个硬编码的测试数据框。如果要在运行时加载数据,则需要动态创建它。

from dash_table import DataTable
from dash.dependencies import Input, Output
import dash
import dash_html_components as html
import dash_core_components as dcc
import pandas as pd
import plotly.graph_objs as go


raw_data = {
        'column1': [4, 24, 31, 2, 3],
        'column2': [25, 94, 57, 62, 70]
}
test_df = pd.DataFrame(raw_data)


app = dash.Dash(__name__)
app.layout = html.Div(children=[
    DataTable(
        id='table',
        data=test_df.to_dict('records'),
        columns=[{"name": i,
                  "id": i,
                  "deletable": True,
                  "searchable": True} for i in test_df.columns],
        sorting=True,
        style_cell={
            'minWidth': '0px',
            'maxWidth': '180px',
            'whiteSpace': 'no-wrap',
            'overflow': 'hidden',
            'textOverflow': 'ellipsis'},
        style_table={'overflowX': 'scroll'},
        row_deletable=True,
        pagination_mode="fe",
        pagination_settings={
            "displayed_pages": 1,
            "current_page": 0,
            "page_size": 15},
        navigation="page"
    ),
    dcc.Graph(
        id='plot',
        style={"max-width": "600px",
               "margin": "auto",
               "display": "inline-block"})
])


@app.callback(Output('plot', 'figure'),
              [Input('table', 'data'),
               Input('table', 'columns')])
def update_graph(data, cols):
    df = pd.DataFrame(data, columns=[c['name'] for c in cols])
    x_values = df.index

    data = [{
        'x': x_values,
        'y': df[col['name']],
        'name': col['name']} for col in cols]

    layout = go.Layout(
        title=go.layout.Title(
            text='title',
            xref='paper',
            xanchor='center'
        ),
        xaxis=go.layout.XAxis(
            title=go.layout.xaxis.Title(
                text='x-title'
            ),
            type=None
        ),
        yaxis=go.layout.YAxis(
            title=go.layout.yaxis.Title(
                text='y-title'
            ),
            type=None
        ),
        showlegend=True
    )

    return {"data": data, "layout": layout}


if __name__ == '__main__':
    app.run_server(port=8888, debug=True)
 类似资料:
  • 我想实现一个实时更新功能,添加列功能基于可编辑DataTablehttps://dash.plotly.com/datatable/editable的留档,以便在CSV文件更新时向可更新的添加一列。我有回调工作,我可以添加新的列,因为新的CSV数据是通过实时更新更新的,但我遇到了一些问题。在我的第一次尝试中(标记为第一个代码),我声明了一个全局变量(我知道在DASH中是坏的),试图跟踪当前的CSV

  • 我正试图用Dash构建一个仪表板,它由一系列图块(文本)组成,如下图所示。 我试图构建一个组件来重用它,并构建下面的布局。每个框将包含标题、值和描述,如下所示。 有可用的组件吗?有人可以帮助我任何基本的想法/代码? 提前谢谢!

  • 我试图构建一个仪表板,其中图形根据下拉框中传递的值进行更新。 由于某些原因,图表不适应下拉列表中的任何更改。这方面的特点是: > 输入是肯定收到的:我创建了第二个函数,它具有相同的结构,但更新了不同的字段。它工作正常。 问题似乎是图形显示:我创建了一个不同版本的函数,其中更新函数将返回默认值1的“无”。图形的区域起初是空的,但是当在下拉列表中选择一个新值时,它会变成其中一个图形。一旦显示了一个图,

  • 问题内容: 可能是一个新手问题,请耐心等待。 我有一个Django表单,可以编辑模型的特定实例。为了知道正在编辑哪个对象,我有一个包含对象ID的隐藏字段以及包含ID的URL。 第一个问题:在隐藏字段中包含对象的ID是否正确? 我(可能是毫无根据的)担心仅将其作为URL的一部分,然后有人可以打开一个对象ID的页面,将表单提交给另一个对象,然后该对象将被覆盖。这就是为什么我要使用隐藏字段的原因。 将I

  • 我有一个带有单元格编辑功能的数据表,我想通过应用一个不同样式的类来更新数据表以显示修改后的记录。 以下是我的问题: 如果在激发onCellEdit事件时未更新数据表,则记录已正确更新,但无法看到已修改行的applyed style类。 如果在onCellEdit事件激发时更新数据表,并使用return键更新值,则一切正常,并且可以看到修改行的应用样式类。 如果我在单元格编辑事件触发时更新数据表,并

  • 我使用google HTML服务创建了一个google可视化仪表板。底层的datatable(jjdt)是从几个数据表(如jadt2、FA)联接而来的。 然后我创建了一个图表包装器(finalTable)来在仪表板中显示该表。 这些代码工作正常。 1)使用javascript更新相应单元格(x,y)的jjdt表,并调用finaltable.draw(); 但这没有效果,也没有错误消息。 2)我想图