首页 > 解决方案 > 如何为 Plotly 条形图设置一组静态 x 轴值和图例?

问题描述

下面的 Plotly 条形图显示了给定部门(工程、会计等)三个不同资历级别的员工数量。

如果 x 轴的多个值之一不在用于构建图形的当前数据框中,则不会显示条形/x 轴/颜色。下面的会计部门在这三个方面都有员工,所以他们显示出来,但会计部门并不具备所有这些。

我可以做些什么来确保此图表始终显示所有三个值,并且缺少的 x 轴值将假定默认 y 轴值为 0。

我希望工程图也显示 sr 条,但默认值为 0。

显示工程部按资历(初级、中级、高级)计数的情节图

显示会计部门按资历(初级、中级、高级)计数的绘图图

这是用于生成上述图表的代码片段以及主数据框的快照。

fig = px.bar(g[g['dept']=='accounting']
         , x='level', y='id', color='level', labels = {
             'level' : 'Job Seniority',
             'id' : 'Employee Count'
         }, title='Count by Seniority (Junior, Mid, Senior) for Accounting Dept')

在上面的代码片段中,g 指向一个如下所示的 Dataframe:

部门 等级 ID
0 会计 年少者 1
1 会计 2
2 会计 sr 1
3 业务发展 年少者 2
4 业务发展 1
5 业务发展 sr 1
6 工程 年少者 2
7 工程 1
8 人力资源 年少者 1
9 合法的 年少者 1
10 合法的 1
11 合法的 sr 1
12 营销 年少者 2
13 营销 1
14 研究与开发 年少者 1
15 销售量 sr 1
16 服务 年少者 2
17 服务 1
18 支持 年少者 3
19 支持 2
20 训练 2

标签: pythondata-sciencebar-chartplotly-dashplotly-python

解决方案


  • 通过组织索引和列来准备用于绘图的数据
  • 使用了graph_objects,所以make_subplots()可以使用它是一个简单的循环过程来为每个部门生成一个图(不是情节是1-indexed,python 0-indexed)
import numpy as np
import pandas as pd
import plotly.graph_objects as go
from plotly.subplots import make_subplots


df = pd.DataFrame({"dept": ["accounting", "accounting", "accounting", "business development", "business development", "business development", "engineering", "engineering", "human resources", "legal", "legal", "legal", "marketing", "marketing", "research and development", "sales", "services", "services", "support", "support", "training"], 
 "level": ["jr", "mid", "sr", "jr", "mid", "sr", "jr", "mid", "jr", "jr", "mid", "sr", "jr", "mid", "jr", "sr", "jr", "mid", "jr", "mid", "mid"], 
 "id": [1, 2, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 3, 2, 2]})

dfp = df.groupby(["dept","level"]).sum().unstack("level").fillna(0).droplevel(0,1).T

fig = make_subplots(rows=(len(dfp.columns)+1)//3, cols=3, subplot_titles=dfp.columns)
for i, c in enumerate(dfp.columns):
    fig.add_trace(go.Bar(x=dfp.index, y=dfp[c], showlegend=False, 
                         marker_color=np.select([dfp.index=="jr",dfp.index=="mid"],["red","blue"],"green")), 
                  row=(i//3)+1, col=(i%3)+1)
    
fig.update_layout({"margin":{"b":0,"t":20,"l":0,"r":0}})


在此处输入图像描述


推荐阅读