Plotly python:如何制作具有多行的下拉菜单?

mfuanj7w  于 2022-10-22  发布在  Python
关注(0)|答案(1)|浏览(956)

我想在一个复杂的线条图中创建一个下拉菜单,比如in this post,但有几行。
让我们看一个 Dataframe 示例:

  1. import pandas as pd
  2. df = pd.DataFrame({"Date": ["2022-10-01","2022-10-02","2022-10-03","2022-10-01","2022-10-02","2022-10-03","2022-10-01","2022-10-02","2022-10-03","2022-10-01","2022-10-02","2022-10-03"],
  3. "Animal" :["Cat","Cat","Cat","Cat","Cat","Cat","Dog","Dog","Dog","Dog","Dog","Dog"],
  4. "Category":["Small","Small","Small","Big","Big","Big","Small","Small","Small","Big","Big","Big"],
  5. "Quantity":[2,4,3,5,1,2,6,5,6,4,2,1]})
  6. df["Date"] = df["Date"].astype('datetime64')

我想用Date在x轴上,Quantity的y轴上,每个Animal有一条曲线,每个m2n3o1p都有一个滤波器。我尝试了下面的函数,但结果不好,因为线在晃动。你能知道我的错误在哪里吗?

  1. import plotly.graph_objects as go
  2. def plot_line_go_graph(df,col_x,col_y,col_color = None,col_filter = None,add_points = False) :
  3. df_graph = df.copy()
  4. if add_points :
  5. param_mode='lines+markers'
  6. param_name='lines+markers'
  7. else :
  8. param_mode='lines'
  9. param_name='lines'
  10. fig = go.Figure()
  11. if col_filter is None :
  12. if col_color is None :
  13. fig.add_trace(go.Scatter(x=df_graph[col_x], y=df_graph[col_y],mode=param_mode,name=param_name))
  14. else :
  15. for c in df_graph[col_color].unique() :
  16. fig.add_trace(go.Scatter(x=df_graph[df_graph[col_color]==c][col_x], y=df_graph[df_graph[col_color]==c][col_y],mode=param_mode,name=c))
  17. else :
  18. df_graph[col_filter] = df_graph[col_filter].fillna("NaN")
  19. if col_color is None :
  20. fig.add_trace(go.Scatter(x=df_graph[col_x], y=df_graph[col_y],mode=param_mode,name=param_name,visible = True))
  21. else :
  22. for c in df_graph[col_color].unique() :
  23. fig.add_trace(go.Scatter(x=df_graph[df_graph[col_color]==c][col_x], y=df_graph[df_graph[col_color]==c][col_y],mode=param_mode,name=c,visible = True))
  24. updatemenu = []
  25. buttons = []
  26. # button with one option for each dataframe
  27. buttons.append(dict(method='restyle',
  28. label="All",
  29. visible=True,
  30. args=[{'y':[df_graph[col_y]],
  31. 'x':[df_graph[col_x]],
  32. 'type':'scatter'}, [0]],
  33. )
  34. )
  35. for f in df_graph[col_filter].unique():
  36. buttons.append(dict(method='restyle',
  37. label=f,
  38. visible=True,
  39. args=[{'y':[df_graph[df_graph[col_filter]==f][col_y]],
  40. 'x':[df_graph[df_graph[col_filter]==f][col_x]],
  41. 'type':'scatter'}, [0]],
  42. )
  43. )
  44. # some adjustments to the updatemenus
  45. updatemenu = []
  46. your_menu = dict()
  47. updatemenu.append(your_menu)
  48. updatemenu[0]['buttons'] = buttons
  49. updatemenu[0]['direction'] = 'down'
  50. updatemenu[0]['showactive'] = True
  51. # add dropdown menus to the figure
  52. fig.update_layout(updatemenus=updatemenu)
  53. if col_color is None :
  54. fig.update_layout(showlegend=False)
  55. fig.update_layout({
  56. 'plot_bgcolor': 'rgba(0,0,0,0)',
  57. 'paper_bgcolor': 'rgba(0,0,0,0)',
  58. },
  59. hoverlabel=dict(
  60. #bgcolor="white",
  61. font_size=12,
  62. #font_family="Rockwell"
  63. ),
  64. hovermode = "x"
  65. )
  66. fig.update_xaxes(showspikes=True, spikecolor = 'black', showline=True, linewidth=1,linecolor='black', ticks = "outside", tickwidth = 1, tickcolor = 'black',ticklen = 5)
  67. fig.update_yaxes(showspikes=True, spikecolor = 'black', showline=True, linewidth=1,linecolor='black', ticks = "outside", tickwidth = 1, tickcolor = 'black',ticklen = 5)
  68. fig.show()
  1. plot_line_go_graph(df,"Date","Quantity",col_color = "Animal", col_filter = "Category",add_points = False)


小时

ohtdti5x

ohtdti5x1#

我认为这里有一些问题。第一个问题是,当您绘制由"Category"(例如"Big""Small")过滤的数据时,您将绘制重复日期的数据,这就是导致线在时间上倒退的原因,这使得绘制很难解释。
相反,您可以通过对col_color, col_filter执行groupby来添加记录道—在您的示例中,如果按["Animal", "Category"]分组,则应该有四个唯一的组,因此有四个记录道。
然后,我认为您可以重新设计按钮,根据跟踪的名称是否包含特定的col_filter来切换每个跟踪的可见性。例如,如果您的记录道被称为("Cat","Big"),("Cat,"Small"),("Dog","Big"),("Dog","Small"),当您单击按钮“Big”时,它会将四条记录道的可见性切换为m1n 6o1p。而"All"按钮会将所有记录道的可视性设置为m1 n8o1p。

  1. import pandas as pd
  2. import plotly.graph_objects as go
  3. df = pd.DataFrame({"Date": ["2022-10-01","2022-10-02","2022-10-03","2022-10-01","2022-10-02","2022-10-03","2022-10-01","2022-10-02","2022-10-03","2022-10-01","2022-10-02","2022-10-03"],
  4. "Animal" :["Cat","Cat","Cat","Cat","Cat","Cat","Dog","Dog","Dog","Dog","Dog","Dog"],
  5. "Category":["Small","Small","Small","Big","Big","Big","Small","Small","Small","Big","Big","Big"],
  6. "Quantity":[2,4,3,5,1,2,6,5,6,4,2,1]})
  7. df["Date"] = df["Date"].astype('datetime64')
  8. def plot_line_go_graph(df,col_x,col_y,col_color = None,col_filter = None,add_points = False) :
  9. df_graph = df.copy()
  10. if add_points :
  11. param_mode='lines+markers'
  12. param_name='lines+markers'
  13. else :
  14. param_mode='lines'
  15. param_name='lines'
  16. fig = go.Figure()
  17. if col_filter is None :
  18. if col_color is None :
  19. fig.add_trace(go.Scatter(x=df_graph[col_x], y=df_graph[col_y],mode=param_mode,name=param_name))
  20. else :
  21. for c in df_graph[col_color].unique() :
  22. fig.add_trace(go.Scatter(x=df_graph[df_graph[col_color]==c][col_x], y=df_graph[df_graph[col_color]==c][col_y],mode=param_mode,name=c))
  23. else :
  24. df_graph[col_filter] = df_graph[col_filter].fillna("NaN")
  25. if col_color is None :
  26. fig.add_trace(go.Scatter(x=df_graph[col_x], y=df_graph[col_y],mode=param_mode,name=param_name,visible = True))
  27. else :
  28. for group, df_group in df_graph.groupby([col_color, col_filter]):
  29. fig.add_trace(go.Scatter(
  30. x=df_group[col_x],
  31. y=df_group[col_y],
  32. mode=param_mode,
  33. name=f"{group}",
  34. visible=True
  35. ))
  36. updatemenu = []
  37. buttons = []
  38. # button with one option for each dataframe
  39. buttons.append(dict(method='restyle',
  40. label="All",
  41. visible=True,
  42. args=[{'visible' : [True]*len(fig.data)}]
  43. )
  44. )
  45. for group, df_filter in df_graph.groupby([col_filter]):
  46. visible_traces = [group in trace['name'] for trace in fig.data]
  47. buttons.append(dict(method='restyle',
  48. label=group,
  49. visible=True,
  50. args=[{'visible' : visible_traces}]
  51. ))
  52. # some adjustments to the updatemenus
  53. updatemenu = []
  54. your_menu = dict()
  55. updatemenu.append(your_menu)
  56. updatemenu[0]['buttons'] = buttons
  57. updatemenu[0]['direction'] = 'down'
  58. updatemenu[0]['showactive'] = True
  59. # add dropdown menus to the figure
  60. fig.update_layout(updatemenus=updatemenu)
  61. if col_color is None :
  62. fig.update_layout(showlegend=False)
  63. fig.update_layout({
  64. 'plot_bgcolor': 'rgba(0,0,0,0)',
  65. 'paper_bgcolor': 'rgba(0,0,0,0)',
  66. },
  67. hoverlabel=dict(
  68. #bgcolor="white",
  69. font_size=12,
  70. #font_family="Rockwell"
  71. ),
  72. hovermode = "x"
  73. )
  74. fig.update_xaxes(showspikes=True, spikecolor = 'black', showline=True, linewidth=1,linecolor='black', ticks = "outside", tickwidth = 1, tickcolor = 'black',ticklen = 5)
  75. fig.update_yaxes(showspikes=True, spikecolor = 'black', showline=True, linewidth=1,linecolor='black', ticks = "outside", tickwidth = 1, tickcolor = 'black',ticklen = 5)
  76. return fig
  77. fig = plot_line_go_graph(df,"Date","Quantity",col_color = "Animal", col_filter = "Category",add_points = False)
  78. fig.show()


小时

展开查看全部

相关问题