python - 如何为 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 |
解决方案
- 通过组织索引和列来准备用于绘图的数据
- 使用了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}})
推荐阅读
- r - How to create a new column made of a sequence without knowning the number of repetitions - data.table
- mule - Mule Dataweave 用特定值替换 Null
- css - Arial 和 Helvetica 作为每个设备的安全网络字体
- jekyll - 如何在 Jekyll 中将时间转换为 UTC?
- javascript - 将 FileReader 与 Promise 和 Async Await 一起使用时遇到问题
- android - 使用导航组件和数据绑定时,如何在目标片段之间传递多个对象?
- android - react-native-touch-id :本机错误上的自定义文本
- mysql - 将 DateTime 字符串更改为 Date
- jquery - 尝试从 jquery 调用 .net 中的方法(自定义 sql 更新方法),但我收到 404 和 500 等错误
- excel - 从列到行复制和粘贴(转置)数据的宏 - 可扩展