我有一个看起来像这样的数据框,其中“dni”是每行的唯一id。我想在每个dni的日期列中使用plotly作为堆叠条形图
我当前使用的代码如下所示:
fig = go.Figure()
buttons = []
for i,dni in enumerate(sorted(df_merged.dni.unique())):
df = df_merged[df_merged['dni']==dni]
for column in df.columns[3:-1]:
fig.add_trace(go.Bar(
name = column,
x = pd.to_datetime(df.date.astype('str')),
y = df[column],
visible = (i==0)
))
args = [False] * df_merged.dni.nunique()
args[i] = True
button = dict(label = dni,
method = "update",
args=[{"visible": args}])
buttons.append(button)
fig.update_layout(
updatemenus=[
dict(
type="dropdown",
direction="down",
buttons = buttons)
],
barmode = "stack",)
fig.show()
这确实给了我一个带有过滤器的绘图,但它显示的数据总是不正确的。我正在努力理解我错在哪里。它显示的唯一正确数据是第一个dni,当我实际按下按钮时,该数据也会更改。
谢谢
编辑: 这是实际数据:
id date bills goalTrans incomes payments savings
0 12345678901 2020-12 1.0 2.0 1.0 0.0 0.0
1 23456789012 2021-02 6.0 0.0 2.0 0.0 0.0
2 34567890123 2020-12 4.0 0.0 2.0 0.0 0.0
3 45678901234 2020-12 9.0 1.0 1.0 0.0 0.0
4 56789012345 2021-01 3.0 0.0 2.0 1.0 0.0
{'bills': {0: 1.0, 1: 6.0, 2: 4.0, 3: 9.0, 4: 3.0},
'date': {0: '2020-12',
1: '2021-02',
2: '2020-12',
3: '2020-12',
4: '2021-01'},
'id': {0: '12345678901',
1: '23456789012',
2: '34567890123',
3: '45678901234',
4: '56789012345'},
'goalTrans': {0: 2.0, 1: 0.0, 2: 0.0, 3: 1.0, 4: 0.0},
'incomes': {0: 1.0, 1: 2.0, 2: 2.0, 3: 1.0, 4: 2.0},
'payments': {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 1.0},
'savings': {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0}}
切中要害:
这可能是一个相当困难的问题,但是您已经错误地指定了
visible
属性,因为您的四个子集有三个跟踪,所以您需要每个arg
有十二个规范,而不是像您在设置中那样有四个规范解决方案:
答案末尾的完整代码段将生成下图,其中启动了第一个对接选项:
子集1:
图1:
如果你把
Subset 1
和Plot 1
相比较,你会发现我们到目前为止都很好。我将让您验证所有子集,但这里是最后一个四舍五入的子集:子集4:
图4:
据我所知,这正是你想要的
详细信息:
在最后一次迭代中:
args
中的{这并没有涵盖设置中的所有选项。你看,{}中的{}当{}要查找并可能更改{}中的{}属性时,Wwat会这样做,在你的例子中,它是一个元组,包含十二个元素,其中第一个元素如下所示:
为什么是12岁?因为数据帧的四个子集有三个
go.Bar()
跟踪。因此,为了触发更新菜单的正确跟踪和正确选择选项(是,按钮)的可见性,您不需要:但这是:
或者更确切地说,外部列表的每个元素都以迭代方式出现在:
。。。像这样:
。。。其中,作为示例,
visibility[2]
如下所示:这就是下面完整代码中有点神秘的部分所要处理的:
<>你可以肯定地考虑把一些线移出循环,因为它们被重复了不必要的次数,但是我发现让这些步骤彼此接近更可读。还有问题吗?别客气,尽管问吧!事情是这样的:完整代码:
相关问题 更多 >
编程相关推荐