Как установить метки баров в режиме стека, сгруппированные по дате?

#python #plotly

Вопрос:

Этот код создает фигуру, которую я прикрепил. Обратите внимание, что суммы-это итоговые данные по df, но мне нужны столбцы, чтобы показывать только итоговые данные за этот конкретный месяц. Что вы должны установить в

text = ...

назначение для того, чтобы это произошло? введите описание изображения здесь

 df = data[['Month', 'A', 'B']]

for X in df['A'].unique():    
    trace = go.Bar(
            x = df[df['A']==X]['Month'],
            y = df[df['A']==X]['B'],
            text = str(df[df['A']==X]['B'].sum())
    )
    
    traces.append(trace)
 

Ответ №1:

 df = data.groupby(['Month','TA']).sum().reset_index()

for TA in df['TA'].unique():    
    trace = go.Bar(
            x = df[df['TA']==TA]['Month'],
            y = df[df['TA']==TA]['Studies'],
            text = df[df['TA']==TA]['Studies'],
            name = TA
    )
    
    traces.append(trace)
 

 

Ответ №2:

Пока все значения уже показаны на вашем рисунке, следующее будет работать независимо от того, как вы построили свой рисунок или сгруппировали свои данные:

 numbers = []
fig.for_each_trace(lambda t: numbers.append([float(nr) for nr in t.text]))
sums = [sum(i) for i in zip(*numbers)]

for i,d in enumerate(fig.data):
    if i == len(fig.data)-1:
        d.text = sums
    else:
        d.text = ''
fig.show()
 

Результат:

введите описание изображения здесь

Пример оригинального рисунка:

введите описание изображения здесь

Полный код:

 # imports
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go

# data
df = px.data.stocks()
df = df[df.columns[:3]]
df = df.tail(25)
df['date'] = pd.to_datetime(df['date'])

# group py month
dfm = df.groupby(pd.Grouper(key = 'date', freq='M')).agg('sum').reset_index()

# figure setup
fig = go.Figure()
for col in dfm.columns[1:]:
    fig.add_trace(go.Bar(x=dfm.date, y = dfm[col], text = [str(v)[:3] for v in dfm[col]], textposition = 'auto'))
fig.update_layout(barmode = 'stack')

# grap and sum data for all bars
numbers = []
fig.for_each_trace(lambda t: numbers.append([float(nr) for nr in t.text]))
sums = [sum(i) for i in zip(*numbers)]

for i,d in enumerate(fig.data):
    if i == len(fig.data)-1:
        d.text = sums
    else:
        d.text = ''
        
fig.show()