高级可视化神器Plotly玩转甘特图

可视化神器Plotly玩转甘特图

本文介绍的是一种特殊的柱状图:甘特图,虽然在实际工作中使用的几率较小,还是很有必要和兴趣来学习下,将制作过程分享给大家。

image

扩展阅读

Plotly的文章会形成连载系列,前面7篇Plotly可视化文章分别是:

image

什么是甘特图

甘特图最初绘制是基于时间线轴timeline的,用来表示一个项目的进度。甘特图依赖于两种数轴表示:

  • 垂直轴(纵轴):指定需要执行的任务
  • 水平轴(横轴):列出每个任务的执行时间段

在甘特图的柱状图中,每个水平条的宽度显示的是任务执行需要的时间

image

甘特图的发明者(1910-1915期间发明):亨利.甘特👍

image

导入库

文章绘图使用的是plotly_express和plotly中的图形工厂函数figure_factory方法

import pandas as pd
import numpy as np

import plotly_express as px
# 图形工厂
import plotly.figure_factory as ff

基于px实现

基础图形

通过字典的方式生成一份模拟数据:

df = pd.DataFrame([
    dict(Task="考公务员", Start='2020-01-01', Finish='2020-02-28'),
    dict(Task="考教师资格证", Start='2020-03-15', Finish='2020-04-15'),
    dict(Task="考六级", Start='2020-05-20', Finish='2020-06-30')
])
image

绘图的基本代码如下;甘特图的绘制是基于时间线timeline的,主要参数是:

  • 绘图数据
  • 开始时间
  • 结束时间
  • 纵轴数据
fig = px.timeline(
  df,   # 绘图数据
  x_start="Start",   # 开始时间
  x_end="Finish",  # 结束时间
  y="Task"   # y轴显示的数据
)

# 实施翻转
fig.update_yaxes(autorange="reversed") 
fig.show()
image

如果不翻转的效果如何:最终发现y轴显示的标签顺序发生了变化

fig = px.timeline(
  df,   # 绘图数据
  x_start="Start",   # 开始时间
  x_end="Finish",  # 结束时间
  y="Task"   # y轴显示的数据
)

# 不实施翻转
# fig.update_yaxes(autorange="reversed") 
fig.show()
image

修改颜色

上面的图形颜色是plotly自带的,可以通过数值和字符改变颜色,模拟一份新的数据:

df1 = pd.DataFrame({
    "Task":["考公务员","考教师证","考6级"],
    "Start":["2021-01-01","2021-02-25","2021-04-01"],
    "End":["2021-01-28","2021-03-19","2021-06-30"],
    "name":["Mike","Mike","Peter"]
})

df1
image

传入字符类型的参数改变颜色:

fig = px.timeline(
    df1,  # 绘图数据
    x_start="Start",  # 开始时间
    x_end="End",  # 结束时间
    y="Task",  # y轴数据
    color="name"   # 颜色设置
)

fig.show()
image

如果y轴和颜色是相同的取值:

fig = px.timeline(
    df1,
    x_start="Start",
    x_end="End",
    y="name",   # y和color取值相同
    color="name"
)

fig.show()
image

通过数值型参数改变颜色

df2 = pd.DataFrame({
    "任务": ["考公务员","考教师证","考6级"],
    "开始时间": ["2021-01-01","2021-02-25","2021-04-01"],
    "结束时间": ["2021-01-28","2021-03-19","2021-06-30"],
    "完成度": [80,73,95]
})

df2

结果为:

  任务      开始时间      结束时间    完成度
0   考公务员    2021-01-01  2021-01-28   80
1   考教师证    2021-02-25  2021-03-19   73
2   考6级    2021-04-01    2021-06-30   95

绘图代码如下:

fig = px.timeline(
    df2,
    x_start="开始时间",
    x_end="结束时间",
    y="任务",
    color="完成度"   # 通过数值设置颜色
)

fig.show()
image
image

基于图形工厂实现

为什么有图形工厂

The plotly.figure_factory module contains dedicated functions for creating very specific types of plots that were at the time of their creation difficult to create with graph objects and prior to the existence of Plotly Express.

在Plotly_Express存在之前,图形工厂函数用于创建那些基于go很难生成的图形

As new functionality gets added to Plotly.js and to Plotly Express, certain Figure Factories become unnecessary and are therefore deprecated as "legacy", but remain in the module for backwards-compatibility reasons.

随着一些新的功能被添加到Plotly.js和Plotly_Express中,某些工厂函数变得不是很必要;但是为了向后兼容版本,部分还是保留在模块中

The following types of plots are still difficult to create with Graph Objects or Plotly Express and therefore the corresponding Figure Factories are not deprecated(弃用):

因为px或者go方法还是很难创建某些图形,所以建议还是使用图形工厂:

不推荐使用的工厂函数制作的图形:

基础绘图

模拟生成一份数据:

data = pd.DataFrame([
    dict(Task="考公务员", Start='2019-01-01', Finish='2019-05-28',Complete=90),
    dict(Task="考教师资格证", Start='2019-07-15', Finish='2019-11-15',Complete=50),
    dict(Task="考雅思", Start='2020-01-20', Finish='2020-04-30',Complete=10)
])

data
image

绘图的代码:

fig = ff.create_gantt(data)
fig.show()
image

[图片上传失败...(image-78962e-1620283140104)]

工厂函数生成的甘特图可以进行时间段的选择,上图默认是所有的统计时间范围。

image
image
image

改变颜色

使用的是模拟的数据:

image
fig = ff.create_gantt(
     data,
     colors="Viridis",
     index_col="Complete",
     show_colorbar=True   # 显示颜色棒
)

fig.show()
image

多组甘特图

将不同类型的数据分组放在一个甘特图中:

data1 = pd.DataFrame([
    dict(Task="考公务员", Start='2019-01-01', Finish='2019-03-28',Resource='Incomplete'),
    dict(Task="考公务员", Start='2019-04-01', Finish='2019-05-28',Resource='Complete'),
    
    dict(Task="考教师资格证", Start='2019-06-01', Finish='2019-7-15',Resource='Not Started'),
    dict(Task="考教师资格证", Start='2019-07-20', Finish='2019-11-15',Resource='Complete'),
    
    dict(Task="考雅思", Start='2020-01-20', Finish='2020-02-15',Resource='Not Started'),
    dict(Task="考雅思", Start='2020-03-01', Finish='2020-03-15',Resource='Incomplete'),
    dict(Task="考雅思", Start='2020-03-20', Finish='2020-04-30',Resource='Complete')
])

data1
image

绘图代码如下:

colors_data1 = {
    'Not Started':'rgb(100,20,108)',
    'Incomplete':(1,0.9,0.5),
    'Complete':'rgb(0,255,100)'
}

fig = ff.create_gantt(
    data1,   # 数据
    colors=colors_data1,  # 颜色设置
    index_col='Resource',   # 颜色显示字段
    show_colorbar=True,  # 显示颜色柱
    group_tasks=True  # 分组显示
    )

fig.show()
image

总结

甘特图是一种使用频率,相对于柱状图、饼图等较低的图形,它有自己的特殊使用场景,在项目进度展示的场景尤其适合,也适合任务计划的制作。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容