我想使用数据框的一些(但不是全部)列(
['V+', 'V-', 'I_tube', 'I_heat']
)来绘制'time'
。当我像 y = I_heat
这样对列进行硬编码时,它就可以工作,但是我不知道如何使其具有反应性,以便 y 会根据用户行为而改变。
到目前为止,我得到了:
from dash import Dash, dcc, html, Input, Output
app = Dash(__name__)
app.layout = html.Div([
html.H4('Dauertest'),
dcc.Graph(id="graph"),
dcc.Checklist(
id="devices",
options = all_df['Device'].value_counts().index,
value = all_df['Device'].value_counts().index[1],
inline=True
),
html.Br(),
dcc.Checklist(
id="signals",
options = ['V+', 'V-', 'I_tube', 'I_heat'],
value = ['V+'],
inline=True
),
])
@app.callback(
Output("graph", "figure"),
Input("devices", "value"),
Input("signals", "value"))
def update_line_chart(devices, signals):
df = all_df # replace with your own data source
mask = df.Device.isin(devices)
fig = px.line(df[mask]
, x = "time"
, y = "I_heat"
, color = 'Device'
)
return fig
app.run_server(
# debug=True
)
我也想对
device
做同样的事情(将数据框子设置为 device
的某些分类级别)但我想这很相似(?)。
目前在你编写的剧情代码中
y = all_df.columns == signals['value']
.
这将返回一个长度与包含布尔值的列数相同的数组,该布尔值指示列名是否与
signal['value']
中的内容匹配。['time', 'V+', 'V-', 'I_tube', 'I_heat']
和 signals['value'] = 'V+'
,则 all_df.columns == signals['value']
的结果是 array([False, True, False, False, False])
但是,
y
参数需要一个(列表)列名称。所以你需要写y=signals['value']
,因为这会将所选列的名称作为字符串传递。
对于
device
,问题是相同的,从某种意义上说,您没有提供px.line
期望的论据。只提供具有特定 device
级别的数据框行,写 df[df.Device == devices['value']]
.
鉴于您遇到的问题,我建议阅读plotly API参考和pandas索引手册。