#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
И вот результат, который мне удается получить.
Спасибо за помощь.