Python Plotly:如何显示和过滤具有多个下拉列表的数据帧,同时将多个组作为条形图?

Python Plotly:如何显示和过滤具有多个下拉列表的数据帧,同时将多个组作为条形图?,python,pandas,dataframe,numpy,plotly,Python,Pandas,Dataframe,Numpy,Plotly,数据集= 嘿,我也不熟悉plotly,跟进这个问题。我的情况类似,但有额外的条件。我需要根据“年度”和“类别”划分每个地区每个季度的总销售额。我能够重现文章中的折线图。但未能复制条形图。一年中有4个季度和4个地区。因此,必须始终存在至少16根钢筋 这就是我试图构建的: 导入plotly.graph\u objs as go 作为pd进口熊猫 将numpy作为np导入 file=pd.read\u excel(r“Sample-Superstore.xlsx”) 销售=文件[['sales'、'

数据集=

嘿,我也不熟悉plotly,跟进这个问题。我的情况类似,但有额外的条件。我需要根据“年度”和“类别”划分每个地区每个季度的总销售额。我能够重现文章中的折线图。但未能复制条形图。一年中有4个季度和4个地区。因此,必须始终存在至少16根钢筋

这就是我试图构建的:

导入plotly.graph\u objs as go
作为pd进口熊猫
将numpy作为np导入
file=pd.read\u excel(r“Sample-Superstore.xlsx”)
销售=文件[['sales'、'Region'、'Order Date'、'Category'、'State']]
销售额[“季度”]=销售额[“订单日期”]。适用(λx:x.季度)
销售额[“年”]=销售额[“订单日期”]。适用(λx:x.year)
df=sales.groupby(['Years','Quarters','Region','Category',as_index=False).sum()
df_input=df.copy()
years=df['years'].unique().tolist()
categories=df['Category'].unique().tolist()
regions=df['Region'].unique().tolist()
quarters=df['quarters'].unique().tolist()
dfs={}
年份:
dfs[year]=pd.pivot_表(df[df['Years']==year],
价值观,
索引=['季度','地区'],
列=['Category'],
aggfunc=np.sum)
#查找行和列联合
普通列=[]
公共_行=[]
对于dfs.keys()中的df:
公共列=已排序(列表(set().union)(公共列,列表(dfs[df]))
公共_行=已排序(列表(set().union)(公共_行,列表(dfs[df].index)))
df_common=pd.DataFrame(np.nan,index=common_行,columns=common_列)
#将每个dfs[df]重塑为通用尺寸
dfc={}
对于dfs中的df_项:
#打印(dfs[未定型])
df1=dfs[df_item].copy()
s=df_公共。先合并_(df1)
df_重塑=df1。重新索引类
dfc[df_项目]=df_重塑
#密谋开始
图=go.Figure()
#对于所有年份中的年份:
#df2=集团销售。loc[集团销售[“年”]==年]
#所有季度=列表(已排序(集合(df2[“季度”].astype(str)))
#所有区域=列表(已排序(集合(df2[“区域”].astype(str)))
#图添加跟踪(go.Bar(x=所有季度,y=df2.loc[df2[“地区”]==所有地区[0][“销售”],name=所有地区[0],marker\u color='blue',visible=(年份==默认年)))
#图添加跟踪(go.Bar(x=所有季度,y=df2.loc[df2[“地区”]==所有地区[1][“销售”],name=所有地区[1],marker\u color='lightblue',visible=(年份==默认年)))
#图添加跟踪(go.Bar(x=所有季度,y=df2.loc[df2[“区域”]==所有区域[2][“销售”],“名称=所有区域[2],标记颜色=灰色,可见=(年份==默认年)))
#图添加跟踪(go.Bar(x=所有季度,y=df2.loc[df2[“区域”]==所有区域[3][“销售”],“名称=所有区域[3],标记颜色=红色,可见=(年份==默认年)))
#年份\绘图\名称。扩展([年份]*4)
打印(常用字体)
对于公共列中的列:
#图添加跟踪(go.Bar(x=所有季度,y=df2.loc[df2[“地区”]==所有地区[0][“销售”],name=所有地区[0],marker\u color='blue',visible=(年份==默认年)))
图添加轨迹(go.Bar(x=Quarter,name=regions[0],marker_color='blue',visible=True))
图添加轨迹(go.Bar(x=Quarter,name=regions[1],marker_color='lightblue',visible=True))
图添加轨迹(go.Bar(x=Quarter,name=regions[2],marker_color='Gray',visible=True))
图添加轨迹(go.Bar(x=四分之一,名称=区域[3],标记颜色=红色,可见=真))
#图添加轨迹(go.Bar(x=区域,标记颜色=蓝色,可见=真实))
#图添加轨迹(go.散射(x=区域,
#可见=真,
#标记=dict(大小=12,线条=dict(宽度=2)),
#标记\符号='菱形',名称=列
#                   )
#              )
图2(图3)
#菜单设置
UpdateNu=[]
#菜单1、名称的按钮
按钮=[]
#为每种颜色创建痕迹:
#为按钮生成参数和创建按钮
对于dfc.keys()中的df:
argList=[]
对于dfc中的列[df]:
温度=[]
j=0
#对于范围(0,4)内的i:
#temp2=[]
#对于范围(0,4)内的i:
#temp2.append(dfc[df][col].values[j])
#j+=1
#临时附加(临时2)
#argList.append(临时)
打印(dfc[df][col])
argList.append(dfc[df][col].values)
argVals=[{'y':argList}]
追加(dict(method='update',
标签=df,
可见=真,
args=argVals)
打印(按钮)
#菜单2的按钮,颜色
b2_标签=普通标签
#为所有跟踪提供所有可见参数的矩阵
#这样他们就可以选择显示或隐藏
b2_show=[列表(b)表示np.eye中的b[e==1表示np.eye中的e(len(b2_标签))]]
按钮2=[]
追加({'method':'update',
“标签”:“全部”,
'args':[{'visible':[True]*len(common_cols)}]})
#创建要显示或隐藏的按钮
对于范围(0,len(b2_标签))中的i:
按钮2.append(dict(method='update',
标签=b2_标签[i],
args=[{'visible':b2_show[i]}]
)
)
#为按钮2添加选项以隐藏所有
按钮2.append(dict(method='update',
label='None',
args=[{'visible':[False]*len(公共列)}]
)
)
#对UpdateNus的一些调整
UpdateNu=[]
你的菜单=dict()
追加(你的菜单)
您的菜单2=dict()
append(你的菜单2)
更新单元[1]
updatemenu[0]['buttons']=按钮
updatemenu[0]['direction']='down'
UpdateNu[0]['showactive']=True
updatemenu[1]['buttons']=buttons2
updatemenu[1]['y']=0.6
图更新布局(showlegend=False,updatemenus=updatemenu)
图更新布局(yaxis=dict(范围=[0,df\U inp
import plotly.graph_objs as go
import pandas as pd
import numpy as np

file = pd.read_excel(r"Sample - Superstore.xlsx")
sales = file[['Sales','Region', 'Order Date','Category', 'State']]
sales["Quarters"] = sales['Order Date'].apply(lambda x: x.quarter)
sales["Years"] = sales['Order Date'].apply(lambda x: x.year)
df = sales.groupby(['Years','Quarters', 'Region', 'Category'], as_index = False).sum()
df_input = df.copy()

years = df['Years'].unique().tolist()
categories = df['Category'].unique().tolist()
regions = df['Region'].unique().tolist()
quarters = df['Quarters'].unique().tolist()

dfs = {}
for year in years:
    dfs[year]=pd.pivot_table(df[df['Years']==year],
                                    values='Sales',
                                    index=['Quarters','Region'],
                                    columns=['Category'],
                                    aggfunc=np.sum)

# find row and column unions
common_cols = []
common_rows = []
for df in dfs.keys():
    common_cols = sorted(list(set().union(common_cols,list(dfs[df]))))
    common_rows = sorted(list(set().union(common_rows,list(dfs[df].index))))
    
df_common = pd.DataFrame(np.nan, index=common_rows, columns=common_cols)

# reshape each dfs[df] into common dimensions
dfc={}
for df_item in dfs:
    #print(dfs[unshaped])
    df1 = dfs[df_item].copy()
    s=df_common.combine_first(df1)
    df_reshaped = df1.reindex_like(s)
    dfc[df_item]=df_reshaped

# plotly start 
fig = go.Figure()

# for year in all_years:
#     df2 = group_sales.loc[group_sales["Years"] == year]
#     all_quarters =list(sorted(set(df2["Quarters"].astype(str))))
#     all_regions =list(sorted(set(df2["Region"].astype(str))))
    
#     fig.add_trace(go.Bar(x= all_quarters, y=df2.loc[df2["Region"] == all_regions[0]]["Sales"], name=all_regions[0],marker_color='blue',  visible=(year== default_year)))
#     fig.add_trace(go.Bar(x= all_quarters, y= df2.loc[df2["Region"] == all_regions[1]]["Sales"], name=all_regions[1], marker_color='lightblue', visible=( year == default_year)))
#     fig.add_trace(go.Bar(x= all_quarters, y= df2.loc[df2["Region"] == all_regions[2]]["Sales"],name= all_regions[2],marker_color='grey', visible=(year== default_year)))
#     fig.add_trace(go.Bar(x= all_quarters, y= df2.loc[df2["Region"] == all_regions[3]]["Sales"],name=all_regions[3], marker_color='red', visible=(year== default_year)))
#     year_plot_names.extend([year]*4)

print(common_cols)

for col in common_cols:
#     fig.add_trace(go.Bar(x= all_quarters, y=df2.loc[df2["Region"] == all_regions[0]]["Sales"], name=all_regions[0],marker_color='blue',  visible=(year== default_year)))
    fig.add_trace(go.Bar(x= quarters, name= regions[0],marker_color='blue',  visible= True))
    fig.add_trace(go.Bar(x= quarters, name= regions[1],marker_color='lightblue',  visible= True))
    fig.add_trace(go.Bar(x= quarters, name= regions[2],marker_color='grey',  visible= True))
    fig.add_trace(go.Bar(x= quarters, name= regions[3],marker_color='red',  visible= True))
    
#     fig.add_trace(go.Bar(x= regions,marker_color='blue',  visible= True))

#     fig.add_trace(go.Scatter(x=regions,
#                              visible=True,
#                              marker=dict(size=12, line=dict(width=2)),
#                              marker_symbol = 'diamond',name=col
#                   )
#              )

fig.show()
# menu setup    
updatemenu= []

# buttons for menu 1, names
buttons=[]

# create traces for each color: 
# build argVals for buttons and create buttons
for df in dfc.keys():
    argList = []
    
    for col in dfc[df]:
        temp = []
        j = 0

#         for i in range(0,4):
#             temp2 = []
#             for i in range(0,4):
#                 temp2.append(dfc[df][col].values[j])
#                 j+=1
#             temp.append(temp2)
#         argList.append(temp)
        print(dfc[df][col])
        argList.append(dfc[df][col].values)
    argVals = [ {'y':argList}]

    buttons.append(dict(method='update',
                        label=df,
                        visible=True,
                        args=argVals))
print(buttons)

# buttons for menu 2, colors
b2_labels = common_cols

# matrix to feed all visible arguments for all traces
# so that they can be shown or hidden by choice
b2_show = [list(b) for b in [e==1 for e in np.eye(len(b2_labels))]]
buttons2=[]
buttons2.append({'method': 'update',
                 'label': 'All',
                 'args': [{'visible': [True]*len(common_cols)}]})

# create buttons to show or hide
for i in range(0, len(b2_labels)):
    buttons2.append(dict(method='update',
                        label=b2_labels[i],
                        args=[{'visible':b2_show[i]}]
                        )
                   )

# add option for button two to hide all
buttons2.append(dict(method='update',
                        label='None',
                        args=[{'visible':[False]*len(common_cols)}]
                        )
                   )

# some adjustments to the updatemenus
updatemenu=[]
your_menu=dict()
updatemenu.append(your_menu)
your_menu2=dict()
updatemenu.append(your_menu2)
updatemenu[1]
updatemenu[0]['buttons']=buttons
updatemenu[0]['direction']='down'
updatemenu[0]['showactive']=True
updatemenu[1]['buttons']=buttons2
updatemenu[1]['y']=0.6

fig.update_layout(showlegend=False, updatemenus=updatemenu)
fig.update_layout(yaxis=dict(range=[0,df_input['Sales'].max()+0.4]))

# title
fig.update_layout(
    title=dict(
        text= "<i>Filtering with multiple dropdown buttons</i>",
        font={'size':18},
        y=0.9,
        x=0.5,
        xanchor= 'center',
        yanchor= 'top'))

# button annotations
fig.update_layout(
    annotations=[
        dict(text="<i>Year</i>", x=-0.4, xref="paper", y=1.1, yref="paper",
            align="left", showarrow=False, font = dict(size=16, color = 'steelblue')),
        dict(text="<i>Category</i>", x=-0.4, xref="paper", y=0.7, yref="paper",
            align="left", showarrow=False, font = dict(size=16, color = 'steelblue')

                             )
    ])

fig.show()
import pandas as pd
import itertools
import plotly.graph_objects as go
from jupyter_dash import JupyterDash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output

# Load Data
dfraw = pd.read_excel("Sample - Superstore.xls")

df = (dfraw.loc[:,['Sales','Region', 'Order Date','Category', 'State']]
      .assign(Quarters=dfraw["Order Date"].dt.quarter,
             Years=dfraw["Order Date"].dt.year)
      .groupby(['Years','Quarters', 'Region', 'Category'], as_index=False).sum()
     )
# add in totals with category "All"
df = (pd.concat([df, df.groupby(["Years","Quarters","Region"], as_index=False).agg({"Sales":"sum"}).assign(Category="All")])
 .set_index(['Years', 'Region', 'Category','Quarters'])
 .unstack("Region")
 .droplevel(0, axis=1)
)

# colors...
config = {'Central':"blue", 'East':"lightblue", 'South':"grey", 'West':"red"}

fig = go.Figure()
# create a trace for every year, category & region
for y,cat in itertools.product(df.index.get_level_values("Years").unique(),df.index.get_level_values("Category").unique()):
    dff = df.loc[(y,cat)]
    for region in dff.columns:
        fig.add_trace(go.Bar(x=dff.index, y=dff[region], name=region, meta=f"{y}{cat}", marker_color=config[region], 
                             visible=(y==2014 and cat=="All"),
                             text=dff[region].apply(lambda v: f"{v/10**3:.0f}k"),textposition="outside")
                            )

# Build App
app = JupyterDash(__name__)
app.layout = html.Div([
    dcc.Graph(id='graph'),
    html.Label(["Year",dcc.Dropdown(id='year-dropdown', clearable=False,
                                    value='2014', options=[{'label': year, 'value': year}
                                                           for year in df.index.get_level_values("Years").unique()])
    ]),
    html.Label([
        "Category",dcc.Dropdown(id='cat-dropdown', clearable=False, value='All', 
                                options=[{'label': year, 'value': year}
                                         for year in df.index.get_level_values("Category").unique()])
    ]),
])
# Define callback to update graph
@app.callback(
    Output('graph', 'figure'),
    [Input("year-dropdown", "value"),Input("cat-dropdown", "value")]
)
def update_figure(year, cat):
    return fig.update_traces(visible=False).update_traces(visible=True, selector={"meta":f"{year}{cat}"}).update_layout(title=f"{year} {cat}")
    
# Run app and display result inline in the notebook
app.run_server(mode='inline')