绘图下拉选择不会正确更新绘图 [英] Plotly dropdown selection does not update plots correctly

查看:42
本文介绍了绘图下拉选择不会正确更新绘图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想创建一个可以选择保存独立 HTML 文件的交互式绘图,因此我不想使用破折号.

I want to create an interactive plot with selection possibility to save a standalone HTML file, thus I do not want to use dash.

目标是显示房价趋势,并可以选择地区和房间数量.问题是,一旦我更改了选择,所有图仍然处于活动状态而没有正确更新.有人可以帮助解决这个问题吗?我用我自己的语言(立陶宛语)进行了绘图.为方便起见,我翻译了代码中的变量名称.

The goal is to display housing price trends with the possibility to make a selection for region and number of rooms. The problem is that once I change the selection, all plots are still active without correctly updating. Could someone help to solve this issue? I have made the plotting in my own language (Lithuanian). I translated the variable names in the code for convenience.

当前输出:

示例输入数据

df = pd.DataFrame({'Region_title': {0: 'Kaunas',
                                    1: 'Kaunas',
                                    2: 'Kaunas',
                                    3: 'Kaunas',
                                    4: 'Kaunas',
                                    5: 'Kaunas',
                                    6: 'Vilnius',
                                    7: 'Vilnius',
                                    8: 'Vilnius',
                                    9: 'Vilnius',
                                    10: 'Vilnius',
                                    11: 'Vilnius'},
                   'Room_number': {0: 1,
                                   1: 2,
                                   2: 1,
                                   3: 2,
                                   4: 1,
                                   5: 2,
                                   6: 1,
                                   7: 2,
                                   8: 1,
                                   9: 2,
                                   10: 1,
                                   11: 2},
                    'Year_quarter': {0: '2010-01',
                                     1: '2010-01',
                                     2: '2014-01',
                                     3: '2014-01',
                                     4: '2019-01',
                                     5: '2019-01',
                                     6: '2010-01',
                                     7: '2010-01',
                                     8: '2014-01',
                                     9: '2014-01',
                                     10: '2019-01',
                                     11: '2019-01'},
                       'Price': {0: 100,
                                 1: 200,
                                 2: 300,
                                 3: 400,
                                 4: 500,
                                 5: 600,
                                 6: 300,
                                 7: 500,
                                 8: 700,
                                 9: 900,
                                 10: 1100,
                                 11: 1300}})

import plotly.offline as pyo
import plotly.graph_objs as go
import numpy as np

def compare_elements_with_single_value(all_list, value):
    all_comparison = []

    for elem in all_list:
        comp = elem == value
        all_comparison.append(comp)

    return(all_comparison) #e.g. [False, False, ...., True]

df = df.sort_values(["Region_title", "Room_number", "Year_quarter"])

fig = go.Figure()

region_list = df['Region_title'].unique()
room_number_list = df['Room number'].unique()

all_list = []

for region in region_list:
    for room_number in room_number_list:
        all_list.append(str(region) + " Room number " + str(room_number)) 

for region in region_list:
    for room_number in room_number_list:

        region_room_number = str(region) + " Room number " + str(room_number)

        fig.add_trace(go.Scatter(
            x = df[(df['Region_title'] == region)
                            & (df['Room_number'] == room_number)]['Year_quarter'],
            y = df[(df['Region_title'] == region)
                            & (df['Room_number'] == room_number)]['price'],
            text = "Average price",
            hoverinfo = "x+y",
            name = region_room_number,
            mode ='lines+markers',
            marker={'size': 10, 'opacity': 0.5, 'line': {'width': 0.5, 'color': 'white'
                        }}))

updatemenu= []
buttons=[]
for region in region_list:
    for room_number in room_number_list:

        region_room_number = str(region) + " Room number " + str(room_number)

        buttons.append(dict(method='restyle',
                            label = str(region) + " Room_number " + str(room_number),
                            args = [{'x':[df[(df['Region_title'] == region) 
                                           & (df['Room_number'] == room_number)]['Year_quarter']]},
                                  {'y':[df[(df['Region_title'] == region)
                                           & (df['Room_number'] == room_number)]['Price']]},
                                   {'visible': compare_elements_with_single_value(all_list, region_room_number)}
                                   ]
                      ))

updatemenu=[]
your_menu=dict()
updatemenu.append(your_menu)
updatemenu[0]['buttons']=buttons
updatemenu[0]['direction']='down'
updatemenu[0]['showactive']=True

fig.update_layout(updatemenus=updatemenu,
                  showlegend=True,
                  yaxis_title="EUR / m2")
fig.show()

pyo.plot(fig, filename='Output/Flat price.html')

推荐答案

您是否正在寻找以下内容:

Are you looking for something like:

import plotly.graph_objects as go
import pandas as pd

df = df.sort_values(["Region_title", "Room_number", "Year_quarter"])\
       .reset_index(drop=True)

df["dropdown"] = df.apply(lambda x: '{} -  Room nbr {}'.format(x['Region_title'], x["Room_number"]),
                          axis=1)


轨迹和按钮

colors_list = ['#1f77b4',  # muted blue
               '#ff7f0e',  # safety orange
               '#2ca02c',  # cooked asparagus green
               '#d62728',  # brick red
               '#9467bd',  # muted purple
               '#8c564b',  # chestnut brown
               '#e377c2',  # raspberry yogurt pink
               '#7f7f7f',  # middle gray
               '#bcbd22',  # curry yellow-green
               '#17becf'  # blue-teal
                ]


dfs = list(df.groupby('dropdown'))
first_title = dfs[0][0]
traces = []
buttons = []
for i,d in enumerate(dfs):
    visible = [False]*4
    visible[i] = True
    name = d[0]
    traces.append(
        go.Scatter(x = d[1]["Year_quarter"],
                  y = d[1]["Price"],
                  text = "Average price",
                  hoverinfo = "x+y",
                  mode = 'lines+markers',
                  visible = True if i==0 else False,
                  name = name,
                  marker = {'color':colors_list[i%len(colors_list)],
                            'size': 10,
                            'opacity': 0.5,
                            'line': {'width': 0.5,
                                     'color': 'white'}
                         }
                  ))
    buttons.append(dict(label=name,
                        method="update",
                        args=[{"visible":visible},
                              {"title":f"Title {name}"}]))

updatemenus = [{'active':0, "buttons":buttons}]


fig = go.Figure(data=traces,
                 layout=dict(updatemenus=updatemenus))
fig.update_layout(title=first_title, title_x=0.5)
fig.update_yaxes(range=[0, df["Price"].max()*1.2])
fig.show()

这里的想法是通过下拉列表中所需的按钮拆分 df 并使用可见的痕迹进行播放.

Here the idea is to split df by the buttons you want in your dropdown and play with visible traces.

这篇关于绘图下拉选择不会正确更新绘图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆