Как построить гистограмму с кнопкой для нескольких категорий?

Для данного кадра данных я пытаюсь создать plotly сравнительную гистограмму с q1,q2.. на оси X и штриховой линией для каждого stockname и цифрами на оси Y.

Кроме того, кнопка должна иметь селекторы [Sales, Net Profit], чтобы при выборе варианта отображался сравнительный график этих акций (максимум 6 акций).

import pandas as pd
import numpy as np
import plotly.graph_objects as go

my_dict = dict({
    'quarterly_result' : ['Sales','Net Profit', 'Sales', 'Net Profit'],
    'stockname' : ['Stock1', 'Stock1','Stock2', 'Stock2'],
    'q1' : [100,10,np.nan,np.nan],
    'q2' : [110,20.6,570,120],
    'q3' : [67,-2.0,620,125.7],
    'q4' : [125,40.5,np.nan,np.nan],
    'q5' : [np.nan,np.nan,660,105.9],
    'q6' : [np.nan,np.nan,636,140]
})

df = pd.DataFrame(my_dict)

fig = go.Figure()

x = df.columns[2:]
y1 = df.loc[0][2:]
y2 = df.loc[2][2:]

fig.add_traces(go.Bar(x=x, y=y1))
fig.add_traces(go.Bar(x=x, y=y2))

buttons = [{'method': 'update', 'label': col, 'args': [{'y': [df[col]]}]} 
           for col in df.iloc[:, 1:]]

updatemenus = [{'buttons': buttons,
                'direction': 'down',
                'showactive': True,}]

# update layout with buttons, and show the figure
fig.update_layout(updatemenus=updatemenus)
fig.show()

Я не уверен, как построить этот многокатегориальный фрейм данных. Ниже фрагмент не работает. Как мне это исправить?

Неправильный результат:

Ожидал:

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете добавить трассировки для каждой акции с соответствующей метрикой. Затем добавьте кнопки для переключения между метриками:

import pandas as pd
import numpy as np
import plotly.graph_objects as go

my_dict = {
    'quarterly_result': ['Sales', 'Net Profit', 'Sales', 'Net Profit'],
    'stockname': ['Stock1', 'Stock1', 'Stock2', 'Stock2'],
    'q1': [100, 10, np.nan, np.nan],
    'q2': [110, 20.6, 570, 120],
    'q3': [67, -2.0, 620, 125.7],
    'q4': [125, 40.5, np.nan, np.nan],
    'q5': [np.nan, np.nan, 660, 105.9],
    'q6': [np.nan, np.nan, 636, 140]
}

df = pd.DataFrame(my_dict)

fig = go.Figure()

# List of quarters
x = df.columns[2:]

# Add traces for each metric
for result in df['quarterly_result'].unique():
    for stock in df['stockname'].unique():
        fig.add_trace(go.Bar(
            x=x,
            y=df[(df['stockname'] == stock) & (df['quarterly_result'] == result)].iloc[0, 2:],
            name=f'{stock} {result}'
        ))

# Add buttons to toggle the visibility
buttons = [{'label': label, 'method': 'update',
            'args': [{'visible': [label in trace.name for trace in fig.data]}]}
           for label in df['quarterly_result'].unique()]

updatemenus = [{'buttons': buttons,
                'direction': "down",
                'showactive': True, }]

# update layout with buttons, and show the figure
fig.update_layout(updatemenus=updatemenus)
fig.show()

Результаты:

Начальный сюжет, оба видны:

Продажи:

Чистая прибыль:

Неверно. При нажатии кнопки Sales для обеих акций должны отображаться столбцы, соответствующие только Sales. Но это заговор Sales, а также Net Profit.

RSW 28.08.2024 06:19

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

m-sarabi 28.08.2024 09:37

Идеальный ! Спасибо !

RSW 28.08.2024 11:21

Другие вопросы по теме