Как создать диаграмму области с накоплением, которая реагирует на кнопки? (Сюжетно)

#python #plotly

#питон #сюжетно

Вопрос:

Я хочу создать диаграмму с многоуровневой областью, которая сама по себе не является проблемой. Тем не менее, мне нужна диаграмма с областями, которая может реагировать на значения столбца («Состояние» и » Пол » в моем случае).

Я могу создавать кнопки, но я не могу заставить кнопку реагировать так, как я хочу.

Вот усеченная версия данных, с которыми я работаю.

 {'Year': {0: 1982,  1: 1983,  2: 1984,  3: 1985,  4: 1986,  5: 1987,  6: 1988,  7: 1989,  8: 1990,  9: 1992,  10: 1993,  11: 1995,  12: 1996,  13: 1997,  14: 1998,  15: 1999,  16: 2000,  17: 2001,  18: 2002,  19: 2003,  20: 2004,  21: 2005,  22: 2006,  23: 2007,  24: 2008,  25: 2009,  26: 2010,  27: 2011,  28: 2012,  29: 2013,  30: 2014,  31: 2015,  32: 2016,  33: 2017,  34: 2018,  35: 2019,  36: 2020,  74: 1982,  75: 1983,  76: 1984},  'Labour force': {0: 420.6,  1: 417.6,  2: 451.6,  3: 466.4,  4: 487.6,  5: 506.4,  6: 548.8,  7: 567.6,  8: 610.0,  9: 617.8,  10: 643.1,  11: 609.6,  12: 686.1,  13: 725.1,  14: 728.0,  15: 728.3,  16: 813.2,  17: 843.6,  18: 817.3,  19: 855.1,  20: 837.1,  21: 843.7,  22: 850.1,  23: 863.5,  24: 878.9,  25: 883.0,  26: 996.3,  27: 1013.5,  28: 1035.2,  29: 1036.7,  30: 1051.4,  31: 1051.6,  32: 1062.9,  33: 1090.0,  34: 1097.7,  35: 1123.4,  36: 1213.6,  74: 266.8,  75: 243.2,  76: 290.1},  'Employed': {0: 408.6,  1: 402.2,  2: 433.9,  3: 444.7,  4: 458.8,  5: 478.2,  6: 521.7,  7: 542.8,  8: 589.4,  9: 604.6,  10: 625.7,  11: 595.6,  12: 670.5,  13: 713.3,  14: 717.0,  15: 705.5,  16: 793.6,  17: 815.7,  18: 794.0,  19: 826.2,  20: 808.4,  21: 814.3,  22: 832.4,  23: 847.2,  24: 859.4,  25: 855.7,  26: 971.7,  27: 987.9,  28: 1002.3,  29: 1010.1,  30: 1024.9,  31: 1023.3,  32: 1026.5,  33: 1053.9,  34: 1067.5,  35: 1091.0,  36: 1173.8,  74: 260.8,  75: 237.8,  76: 277.6},  'Unemployed': {0: 12.0,  1: 15.4,  2: 17.7,  3: 21.7,  4: 28.8,  5: 28.2,  6: 27.1,  7: 24.9,  8: 20.7,  9: 13.2,  10: 17.4,  11: 14.0,  12: 15.6,  13: 11.7,  14: 11.0,  15: 22.8,  16: 19.6,  17: 27.9,  18: 23.3,  19: 28.9,  20: 28.7,  21: 29.4,  22: 17.7,  23: 16.3,  24: 19.6,  25: 27.3,  26: 24.6,  27: 25.5,  28: 32.9,  29: 26.7,  30: 26.5,  31: 28.3,  32: 36.4,  33: 36.1,  34: 30.2,  35: 32.5,  36: 39.8,  74: 6.0,  75: 5.4,  76: 12.6},  'Outside labour force': {0: 69.3,  1: 75.8,  2: 74.6,  3: 70.9,  4: 72.6,  5: 77.3,  6: 79.0,  7: 86.8,  8: 87.6,  9: 98.1,  10: 85.3,  11: 104.0,  12: 108.9,  13: 115.8,  14: 130.1,  15: 148.8,  16: 136.6,  17: 165.9,  18: 156.5,  19: 156.7,  20: 164.8,  21: 180.7,  22: 192.8,  23: 201.3,  24: 208.1,  25: 222.1,  26: 217.6,  27: 222.5,  28: 220.9,  29: 224.8,  30: 224.1,  31: 238.8,  32: 242.3,  33: 244.7,  34: 244.9,  35: 237.1,  36: 168.5,  74: 58.0,  75: 46.2,  76: 61.8},  'Labour force participation rate': {0: 85.9,  1: 84.6,  2: 85.8,  3: 86.8,  4: 87.0,  5: 86.8,  6: 87.4,  7: 86.7,  8: 87.4,  9: 86.3,  10: 88.3,  11: 85.4,  12: 86.3,  13: 86.2,  14: 84.8,  15: 83.0,  16: 85.6,  17: 83.6,  18: 83.9,  19: 84.5,  20: 83.5,  21: 82.4,  22: 81.5,  23: 81.1,  24: 80.9,  25: 79.9,  26: 82.1,  27: 82.0,  28: 82.4,  29: 82.2,  30: 82.4,  31: 81.5,  32: 81.4,  33: 81.7,  34: 81.8,  35: 82.6,  36: 87.8,  74: 82.1,  75: 84.1,  76: 82.4},  'Unemployment rate': {0: 2.9,  1: 3.7,  2: 3.9,  3: 4.6,  4: 5.9,  5: 5.6,  6: 4.9,  7: 4.4,  8: 3.4,  9: 2.1,  10: 2.7,  11: 2.3,  12: 2.3,  13: 1.6,  14: 1.5,  15: 3.1,  16: 2.4,  17: 3.3,  18: 2.9,  19: 3.4,  20: 3.4,  21: 3.5,  22: 2.1,  23: 1.9,  24: 2.2,  25: 3.1,  26: 2.5,  27: 2.5,  28: 3.2,  29: 2.6,  30: 2.5,  31: 2.7,  32: 3.4,  33: 3.3,  34: 2.8,  35: 2.9,  36: 3.3,  74: 2.2,  75: 2.2,  76: 4.3},  'Gender': {0: 'Male',  1: 'Male',  2: 'Male',  3: 'Male',  4: 'Male',  5: 'Male',  6: 'Male',  7: 'Male',  8: 'Male',  9: 'Male',  10: 'Male',  11: 'Male',  12: 'Male',  13: 'Male',  14: 'Male',  15: 'Male',  16: 'Male',  17: 'Male',  18: 'Male',  19: 'Male',  20: 'Male',  21: 'Male',  22: 'Male',  23: 'Male',  24: 'Male',  25: 'Male',  26: 'Male',  27: 'Male',  28: 'Male',  29: 'Male',  30: 'Male',  31: 'Male',  32: 'Male',  33: 'Male',  34: 'Male',  35: 'Male',  36: 'Male',  74: 'Male',  75: 'Male',  76: 'Male'},  'Male': {0: 1,  1: 1,  2: 1,  3: 1,  4: 1,  5: 1,  6: 1,  7: 1,  8: 1,  9: 1,  10: 1,  11: 1,  12: 1,  13: 1,  14: 1,  15: 1,  16: 1,  17: 1,  18: 1,  19: 1,  20: 1,  21: 1,  22: 1,  23: 1,  24: 1,  25: 1,  26: 1,  27: 1,  28: 1,  29: 1,  30: 1,  31: 1,  32: 1,  33: 1,  34: 1,  35: 1,  36: 1,  74: 1,  75: 1,  76: 1},  'State': {0: 'Johor',  1: 'Johor',  2: 'Johor',  3: 'Johor',  4: 'Johor',  5: 'Johor',  6: 'Johor',  7: 'Johor',  8: 'Johor',  9: 'Johor',  10: 'Johor',  11: 'Johor',  12: 'Johor',  13: 'Johor',  14: 'Johor',  15: 'Johor',  16: 'Johor',  17: 'Johor',  18: 'Johor',  19: 'Johor',  20: 'Johor',  21: 'Johor',  22: 'Johor',  23: 'Johor',  24: 'Johor',  25: 'Johor',  26: 'Johor',  27: 'Johor',  28: 'Johor',  29: 'Johor',  30: 'Johor',  31: 'Johor',  32: 'Johor',  33: 'Johor',  34: 'Johor',  35: 'Johor',  36: 'Johor',  74: 'Kedah',  75: 'Kedah',  76: 'Kedah'},  'Working less than 30 hours': {0: 0.0,  1: 0.0,  2: 0.0,  3: 0.0,  4: 0.0,  5: 0.0,  6: 0.0,  7: 0.0,  8: 0.0,  9: 0.0,  10: 0.0,  11: 0.0,  12: 0.0,  13: 0.0,  14: 0.0,  15: 0.0,  16: 0.0,  17: 0.0,  18: 0.0,  19: 0.0,  20: 0.0,  21: 0.0,  22: 0.0,  23: 0.0,  24: 0.0,  25: 0.0,  26: 0.0,  27: 0.0,  28: 0.0,  29: 0.0,  30: 0.0,  31: 0.0,  32: 0.0,  33: 0.0,  34: 0.0,  35: 0.0,  36: 0.0,  74: 0.0,  75: 0.0,  76: 0.0}}  

Вот функция, которую я построил.

 def make_big_stacked_area(df, title, legend=True, height=1000, width=800):  agg = df[ df['State'].isin(['All']) ]   ys = [  'Labour force',  'Outside labour force',  'Working less than 30 hours',  ]   colors = [   '#0A100D',  '#626558',  '#8E907E',  ]    x = df.Year   fig = go.Figure()  for i in range(len(ys)):  fig.add_trace(go.Scatter(  x = x,  y = agg[ ys[i] ],  name = ys[i],  mode= 'lines',  line= dict(width = 0.5,  color = colors[i]),  stackgroup='one',  groupnorm='percent',  ))  # Everything is working fine until here    #############  buttons = []  for state in df['State'].unique():  buttons.append(dict(method='restyle',  label= state,  visible=True,  args=[{'y':[ df[ df['State'].isin([state]) ][ ys[0] ].values],  'x':[ x.values ],  'name': [ ys[0] ],  'mode': 'lines',  'line': dict(width= 0.5,   color = colors[0] ),  'stackgroup': 'one',  'groupnorm': 'percent',  'type':'scatter',}, ],  )  )    ###############################  buttons.insert(0, dict(method='restyle',  label='All',  visible=True,  args=[{'y':[ agg[ ys[0] ].values],  'x':[ x.values ],  'type':'scatter'}, ],))    ############################################  updatemenu = []  your_menu = dict()  updatemenu.append(your_menu)   updatemenu[0]['buttons'] = buttons  updatemenu[0]['direction'] = 'down'  updatemenu[0]['showactive'] = True    ################################################  fig.update_layout(  title= title,  xaxis_tickfont_size=14,  yaxis=dict(  title='',  titlefont_size=16,  tickfont_size=14,  ),  legend=dict(  x=1.02,  y=0.98,  bgcolor='rgba(255, 255, 255, 0)',  bordercolor='rgba(255, 255, 255, 0)',  ),  showlegend= legend,  height= height,  width= width,  updatemenus= updatemenu  )   return fig  

И вот результат, который мне удается получить. введите описание изображения здесь

Спасибо за помощь.