Python绘图库及图像类型之基础图表-CSDN博客https://blog.csdn.net/weixin_64066303/article/details/148433762?spm=1001.2014.3001.5501
Python绘图库及图像类型之高级可视化-CSDN博客https://blog.csdn.net/weixin_64066303/article/details/148450750?spm=1001.2014.3001.5501
金融图表(mplfinance)
Python 金融交易实用指南(二)-CSDN博客https://blog.csdn.net/wizardforcel/article/details/145290751
Python mplfinance库:金融数据可视化-CSDN博客https://blog.csdn.net/GitHub_miao/article/details/140624948
类别 | 作用描述 | 典型实现场景 |
---|---|---|
核心作用 | ||
价格走势可视化 | 绘制K线图/美国线清晰展示开盘价、收盘价、最高价、最低价 | 股票日内波动分析、加密货币行情跟踪、期货合约价格监控 |
技术指标集成 | 叠加MACD/RSI/布林带等指标,辅助量化交易决策 | 量化策略回测、交易信号触发点识别、超买超卖区域判断 |
成交量分析 | 结合价格与成交量柱状图,验证市场趋势强度 | 突破行情量能确认、机构资金动向追踪、异常交易量预警 |
模式识别 | 可视化经典形态(头肩顶/三角形整理等) | 技术分析师教学、历史行情形态回溯、趋势反转预判 |
多周期对比 | 并排显示不同时间粒度图表(日线/周线/分钟线) | 短线交易与长线投资策略协同、市场结构多尺度观察 |
应用领域 | ||
证券投资分析 | 跟踪个股/指数技术面变化 | 选股策略执行、板块轮动监测、支撑阻力位识别 |
量化交易 | 为算法交易提供可视化验证界面 | 高频策略优化、统计套利信号可视化、回测结果图表输出 |
投资教育 | 直观演示金融概念与技术工具 | 交易培训课件、财经课程案例、模拟交易平台图表组件 |
风险管理 | 识别价格异常波动与关键位突破 | 止损点设置依据、黑天鹅事件行情记录、波动率骤增预警 |
财经媒体 | 生成专业行情图表用于市场解读 | 财经新闻插图、研报技术分析部分、直播节目实时图表 |
技术优势 | ||
数据兼容性 | 直接处理pandas.DataFrame (列名需含Open/High/Low/Close/Volume ) | 对接Yahoo Finance/聚宽/AkShare等数据源,无需格式转换 |
高效绘图 | 基于Matplotlib优化金融数据渲染速度 | 快速生成10年以上历史K线图、实时行情仪表盘批量更新 |
样式定制 | 支持50+内置风格(如binance /yahoo )或自定义颜色 | 深色模式交易界面、品牌色系适配、多图表风格统一 |
扩展功能 | 添加自定义图形(趋势线/斐波那契回调)、事件标记(财报发布/政策出台) | 标注关键基本面事件、手动绘制技术形态、策略特殊信号标记 |
输出灵活性 | 导出PNG/SVG/PDF或嵌入Jupyter/GUI应用 | 自动化日报生成、量化报告附录、交易系统内置图表模块 |
图表类型 | 适用场景 | 可视化要素 |
---|---|---|
日本蜡烛图 | 主流技术分析(趋势/反转信号) | 实体颜色(红跌绿涨)、影线长度(波动幅度) |
美国线(OHLC) | 简化价格波动观察(密集交易时段) | 水平短线=开盘收盘价,竖线=高低价范围 |
Renko图 | 过滤噪音专注趋势 | 砖块大小=固定价格变动,忽略时间维度 |
点数图 | 识别关键支撑阻力位 | X/O列表示涨跌,每列高度=价格变动单位 |
绘图库介绍
函数签名(Function Signature)
# mpf.make_marketcolors() 是 mplfinance 库中用于自定义 K 线图颜色方案的核心函数。
# 通过它可以灵活控制阳线/阴线、影线、边缘、成交量等元素的颜色。
mpf.make_marketcolors(up='', # 阳线颜色down='', # 阴线颜色edge='', # K 线边缘颜色wick='', # 影线颜色volume='', # 成交量颜色inherit=False, # 是否继承颜色alpha=1.0, # 透明度ohlc='', # OHLC 线颜色**kwargs
)
关键参数详解
参数 | 类型 | 默认值 | 说明 |
---|---|---|---|
up | str 或 tuple | 'k' | 阳线(收盘价 ≥ 开盘价)的颜色,支持颜色名称或 RGB 元组(如 '#00FF00' ) |
down | str 或 tuple | 'k' | 阴线(收盘价 < 开盘价)的颜色 |
edge | str 或 'inherit' | 'k' | K 线边缘颜色。设为 'inherit' 时继承实体颜色(up /down ) |
wick | str 或 'inherit' | 'k' | 影线颜色。设为 'inherit' 时继承实体颜色 |
volume | str /dict /'inherit' | 'k' | 成交量颜色: - 单色:所有成交量统一颜色 - 字典: {'up':'red', 'down':'green'} - 'inherit' :继承 K 线颜色 |
inherit | bool | False | 全局继承开关。为 True 时,edge 和 wick 默认继承实体颜色 |
alpha | float | 1.0 | 颜色透明度(0.0 透明 ~ 1.0 不透明) |
ohlc | str 或 dict | None | OHLC 线图颜色(需配合 type='ohlc' ) |
kwargs | - | - | 备用参数(通常无需使用) |
字母 | 颜色 | 英文名称 |
---|---|---|
'b' | 蓝色 | blue |
'g' | 绿色 | green |
'r' | 红色 | red |
'c' | 青色 | cyan |
'm' | 品红色 | magenta |
'y' | 黄色 | yellow |
'k' | 黑色 | k black |
'w' | 白色 | white |
示例代码
import pandas as pd
import numpy as np
import mplfinance as mpf
import matplotlib.dates as mdates
from datetime import datetime
import matplotlib.pyplot as plt# 生成示例金融数据(日期范围:2025年1月)
dates = pd.date_range(start="2025-01-01", end="2025-01-31", freq="D")
data = {"Open": np.random.uniform(100, 105, len(dates)),"High": np.random.uniform(106, 110, len(dates)),"Low": np.random.uniform(95, 99, len(dates)),"Close": np.random.uniform(101, 107, len(dates)),"Volume": np.random.randint(1000, 5000, len(dates))
}
df = pd.DataFrame(data, index=dates)# 创建注释内容(关键日期和事件)
annotations = [(datetime(2025, 1, 8), # 日期df.loc["2025-01-08", "High"] + 1, # 价格位置"突破阻力位", # 注释文本{"arrowstyle": "->", "color": "blue"}), # 箭头样式(datetime(2025, 1, 15),df.loc["2025-01-15", "Low"] - 1,"支撑位测试\n成交量放大",{"arrowstyle": "->", "color": "red"}),(datetime(2025, 1, 25),df.loc["2025-01-25", "Close"],"MACD金叉\n买入信号",{"arrowstyle": "fancy", "color": "green"})
]# 创建自定义绘图对象
apds = [# 添加移动平均线mpf.make_addplot(df["Close"].rolling(5).mean(), color="orange", width=1.5),mpf.make_addplot(df["Close"].rolling(10).mean(), color="purple", width=1.5),# 添加交易量mpf.make_addplot(df["Volume"], panel=1, type="bar", color="skyblue", ylabel="Volume")
]# 创建绘图样式
style = mpf.make_marketcolors(up="#2E7D32", # 上涨K线颜色down="#D32F2F", # 下跌K线颜色wick={"up": "#2E7D32", "down": "#D32F2F"}, # 影线颜色edge="inherit", # 边缘颜色volume="skyblue", # 交易量颜色
)
mpf_style = mpf.make_mpf_style(marketcolors=style,gridstyle="--", # 网格线样式gridcolor="lightgray",rc={"font.family": "Microsoft YaHei"} # 中文字体支持
)# 创建绘图并添加注释
fig, axlist = mpf.plot(df,type="candle", # K线类型title="股票分析 (2025年1月)",ylabel="价格 ($)",style=mpf_style,addplot=apds,volume=True, # 显示成交量figratio=(12, 6), # 图形比例figscale=1.2, # 缩放比例returnfig=True # 返回fig和axes对象用于添加注释
)# 添加文本注释
for date, price, text, arrowprops in annotations:# 转换日期格式date_num = mdates.date2num(date)# 在主图添加注释ax = axlist[0] # 主图是第一个axesax.annotate(text,xy=(date_num, price),xytext=(date_num + 1, price + 3),arrowprops=arrowprops,fontsize=10,bbox=dict(boxstyle="round,pad=0.3", fc="wheat", alpha=0.8))# 添加技术指标标签
axlist[0].text(0.02, 0.95, # 相对坐标位置 (左下角为0,0)"MA5: 橙色\nMA10: 紫色",transform=axlist[0].transAxes,fontsize=9,bbox=dict(facecolor="white", alpha=0.7)
)# 添加图例
axlist[0].legend(["5日均线", "10日均线"], loc="upper left")# 保存高清图片 (支持PNG/PDF/SVG等格式)
fig.savefig("financial_chart.png", dpi=300, bbox_inches="tight")
print("图表已保存为 financial_chart.png")# 显示图表
plt.show()
科学可视化(Mayavi)
Python库 - Mayavi_python mayavi-CSDN博客https://blog.csdn.net/qq_52964132/article/details/143329832
类别 | 作用描述 | 典型实现场景 |
---|---|---|
核心作用 | ||
三维数据可视化 | 将复杂科学数据(标量、矢量、张量)转换为直观的三维图形 | 流体动力学模拟结果、医学影像(CT/MRI)、分子结构建模、地质勘探数据 |
交互式分析 | 支持旋转、缩放、剖面切割等交互操作,辅助数据探索 | 工程师分析CFD流场特性、研究人员观察蛋白质3D结构 |
高质量渲染 | 提供光照、透明度、纹理等渲染效果,增强视觉表现力 | 学术论文配图、项目汇报可视化展示、科学宣传材料制作 |
流场可视化 | 专长于矢量/张量场可视化(如流线、粒子轨迹) | 飞机气动分析、燃烧模拟、天气预报风场可视化 |
应用领域 | ||
计算流体动力学 (CFD) | 展示压力场、速度场、涡量分布等复杂流体现象 | ANSYS Fluent/OpenFOAM 结果可视化、湍流模拟分析 |
医学成像 | 三维重建CT/MRI数据,多平面切割观察解剖结构 | 手术规划、病灶体积测量、医学教学演示 |
地球科学 | 可视化地质层、地震波传播、气象数据等空间信息 | 石油勘探地震数据处理、气候模型输出分析、地形地貌渲染 |
材料科学与化学 | 展示分子轨道、电子密度、晶体结构等微观模型 | 量子化学计算(VASP/Gaussian)结果可视化、纳米材料结构分析 |
电磁场仿真 | 呈现电场/磁场分布、辐射方向图等电磁特性 | 天线设计优化、微波器件仿真结果分析 |
技术实现特点 | ||
开发语言 | 基于 Python 的API,无缝集成科学计算生态(NumPy/SciPy) | 在Jupyter Notebook中交互式绘图,与Pandas/Matplotlib协同工作 |
底层引擎 | 使用 VTK(Visualization Toolkit)进行高性能渲染 | 处理超大规模体数据(>1GB 的有限元网格) |
部署方式 | 支持桌面应用(mlab 交互窗口)和Web嵌入(mpld3 /Panel 扩展) | 本地调试+服务器端批量生成科学报告 |
扩展性 | 可通过自定义模块添加新数据源或过滤器 | 连接实验设备实时数据流、适配专有文件格式 |
绘图库介绍
函数签名(Function Signature)
# mlab.figure 是 Mayavi 库中用于创建或激活图形窗口的核心函数,属于 mayavi.mlab 模块(用于快速绘图)。
mlab.figure(figure=None, bgcolor=None, fgcolor=None, engine=None, size=(400, 350),**kwargs
) -> mayavi.core.scene.Scene
参数详解
参数 | 类型 | 默认值 | 说明 |
---|---|---|---|
figure | str , int , Scene 或 None | None | 图形标识: - 字符串:作为窗口标题,激活同名窗口或新建窗口 - 整数:激活对应 ID 的窗口 - Scene 对象:直接激活该场景- None :创建新窗口(自动命名) |
bgcolor | tuple 或 str | (0.05, 0.05, 0.05) | 背景颜色: - RGB 元组(值域 [0, 1] ),如 (1, 0, 0) 表示红色- 颜色名称(如 'white' , 'black' ) |
fgcolor | tuple 或 str | (1, 1, 1) | 前景颜色(坐标轴/文本颜色),格式同 bgcolor |
engine | Engine 对象 | None | 指定 Mayavi 引擎(通常无需设置) |
size | tuple (width, height) | (400, 350) | 窗口初始大小(像素) |
**kwargs | - | - | 其他传递给 Scene 类的参数(如 name 自定义窗口名) |
返回值
-
返回激活的
Scene
对象(Mayavi 场景),后续绘图操作将作用于此场景。
示例代码
import numpy as np
from mayavi import mlab
import os# 创建数据
x, y = np.mgrid[-3:3:100j, -3:3:100j]
z = np.sin(x**2 + y**2) * np.cos(2*x) * np.sin(2*y)# 创建Mayavi图形
mlab.figure(size=(1000, 800), bgcolor=(0.05, 0.05, 0.1))# 绘制3D曲面
surface = mlab.surf(x, y, z, colormap='viridis')
surface.actor.property.interpolation = 'phong'
surface.actor.property.specular = 0.3
surface.actor.property.specular_power = 30# 添加颜色条
colorbar = mlab.colorbar(surface, title='Z Value', orientation='vertical')
colorbar.label_text_property.color = (0.9, 0.9, 0.9)
colorbar.title_text_property.color = (0.9, 0.9, 0.9)
colorbar.scalar_bar_representation.position = [0.85, 0.1]# 添加注释 - 文本标签
mlab.text(0.4, 0.9, "3D Surface Plot", width=0.3, color=(1, 1, 1))
mlab.text(0.05, 0.85, "f(x,y) = sin(x² + y²) * cos(2x) * sin(2y)", width=0.5, color=(0.8, 0.8, 1))# 添加注释 - 点标记和说明
max_z = np.max(z)
min_z = np.min(z)
max_idx = np.argwhere(z == max_z)[0]
min_idx = np.argwhere(z == min_z)[0]# 添加坐标轴
mlab.axes(xlabel='X', ylabel='Y', zlabel='Z',color=(0.8, 0.8, 0.8),ranges=[-3, 3, -3, 3, -1, 1],nb_labels=5)# 添加图例说明
mlab.text(0.05, 0.05, "Created with Mayavi", width=0.25, color=(0.7, 0.7, 0.7))# 添加方向指示
mlab.orientation_axes()# 设置视角
mlab.view(azimuth=45, elevation=60, distance=8)# 确保保存目录存在
os.makedirs('output', exist_ok=True)# 保存图像
save_path = os.path.join('output', 'mayavi_visualization.png')
mlab.savefig(save_path, size=(1200, 900))
print(f"图像已保存至: {save_path}")# 显示图形
mlab.show()
词云(WordCloud)
python绘制词云图_python词云图-CSDN博客https://blog.csdn.net/2301_79959211/article/details/146580098
类别 | 作用描述 | 典型实现场景 |
---|---|---|
核心作用 | ||
文本摘要 | 快速提取高频关键词,直观展示文本核心主题 | 分析用户评论焦点、总结会议纪要重点、提炼报告核心内容 |
语义权重可视化 | 通过字号大小映射词汇重要性(词频/权重) | 展示政策文件关键词、研究论文术语分布、产品需求优先级 |
情感倾向呈现 | 用颜色区分情感属性(如红=负面/绿=正面) | 社交媒体舆情分析、客户满意度调查、影评情感倾向 |
对比分析 | 并排词云对比不同来源文本差异 | 竞品用户评价对比、不同时期新闻热点演变、多版本政策修订差异 |
数据美学表达 | 将枯燥文本转化为视觉冲击力强的艺术图形 | 活动海报设计、书籍封面创作、数据艺术展品 |
应用领域 | ||
市场调研 | 分析用户反馈关键词,洞察产品改进方向 | 电商商品评论分析、APP应用商店评价挖掘、焦点小组访谈摘要 |
媒体与舆情监控 | 捕捉新闻/社交媒体的热点话题趋势 | 微博热搜话题可视化、突发事件报道关键词追踪、品牌声量监测 |
学术研究 | 提炼文献高频术语,发现学科研究热点 | 论文摘要关键词分析、学术会议主题挖掘、学科发展脉络探索 |
内容运营 | 优化SEO关键词布局,指导内容创作方向 | 博客主题规划、视频标签优化、广告文案关键词提取 |
教育评估 | 可视化学生作答/作文的词汇特征 | 考试开放题答案分析、写作能力评估、课堂讨论关键词统计 |
技术实现优势 | ||
多语言支持 | 支持中/英/日/韩等语言分词(需搭配jieba/konlpy等库) | 跨境电商多国评论分析、国际文献研究、全球化品牌监测 |
高级定制 | 自定义形状蒙版、渐变配色、字体风格 | 企业LOGO形状词云(如用汽车轮廓分析车型评测)、品牌色系定制、节日主题设计 |
动态交互 | 结合Plotly/D3.js生成可交互词云(悬停显示词频/上下文) | 数据看板集成、学术报告演示、实时舆情监控大屏 |
多数据源兼容 | 处理文本/CSV/API数据流 | 爬虫实时数据可视化、数据库评论导出分析、问卷系统直连 |
降噪能力 | 过滤停用词(的/是/和等)、合并同义词、词干提取 | 提升分析准确性,避免无意义词汇干扰 |
绘图库介绍
函数签名(Function Signature)
from wordcloud import WordCloud# wordcloud.generate 函数是 Python wordcloud 库的核心方法,用于根据输入文本生成词云。
# 创建 WordCloud 对象
wc = WordCloud(**params)# 生成词云
wc.generate(text) # text 是待处理的字符串
关键参数详解
参数 | 说明 | 示例值 |
---|---|---|
width , height | 图像宽高(像素) | width=800, height=400 |
background_color | 背景颜色 | background_color="white" |
max_words | 最多显示的词数量 | max_words=200 |
stopwords | 停用词集合(需提前分词) | stopwords={"the", "and"} |
font_path | 中文必备:字体文件路径(.ttf) | font_path="msyh.ttc" |
mask | 自定义形状(ndarray 或图像路径) | mask=np.array(Image.open("mask.png")) |
max_font_size | 最大字体尺寸 | max_font_size=60 |
collocations | 是否合并二元组(如 "new york") | collocations=False |
示例代码
import matplotlib.pyplot as plt
import matplotlib.patheffects as path_effects
import jieba # 中文分词库
from wordcloud import WordCloud, STOPWORDS # 现在应该能正常导入了# 设置中文字体支持
plt.rcParams['font.sans-serif'] = ['SimHei'] # Windows
# plt.rcParams['font.sans-serif'] = ['WenQuanYi Micro Hei'] # Linux
# plt.rcParams['font.sans-serif'] = ['Arial Unicode MS'] # Mac
plt.rcParams['axes.unicode_minus'] = False# 1. 准备文本数据
text = """
Python是一种高级编程语言,由Guido van Rossum于1991年创建。
它以简洁明了的语法和强大的功能而闻名,广泛应用于Web开发、数据分析、
人工智能、科学计算和自动化脚本等领域。Python拥有庞大的标准库和活跃的
社区支持,使得开发者能够快速构建各种应用程序。其设计哲学强调代码可读性,
使用空格缩进来定义代码块,而不是使用大括号或关键字。
"""# 中文分词处理
def chinese_word_segmentation(text):seg_list = jieba.cut(text, cut_all=False)return " ".join(seg_list)# 对文本进行分词
segmented_text = chinese_word_segmentation(text)# 2. 准备停用词和自定义设置
stopwords = set(STOPWORDS)
stopwords.update(["能够", "使用", "各种", "拥有", "使得", "一种", "创建", "支持", "应用", "的", "是", "和", "而", "等"]) # 添加中文停用词# 3. 创建词云对象
try:# 尝试使用中文字体wordcloud = WordCloud(width=800,height=600,background_color='white',stopwords=stopwords,font_path='simhei.ttf', # 指定中文字体路径max_words=100,contour_width=1,contour_color='steelblue',colormap='viridis')
except:# 如果字体文件不存在,使用默认字体wordcloud = WordCloud(width=800,height=600,background_color='white',stopwords=stopwords,max_words=100,contour_width=1,contour_color='steelblue',colormap='viridis')# 4. 生成词云
wordcloud.generate(segmented_text)# 5. 创建图形
plt.figure(figsize=(12, 8))# 显示词云
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off') # 隐藏坐标轴# 6. 添加主标题和注释
plt.title('Python编程语言分析', fontsize=24, pad=20, color='navy')# 添加文本框注释
text_box = plt.text(0.5, # x位置 (0-1相对坐标)0.05, # y位置"词云特点:\n• 基于文本频率生成\n• 可自定义颜色和形状\n• 支持中文分词\n• 可添加停用词过滤",transform=plt.gcf().transFigure, # 使用图形坐标ha='center',fontsize=14,bbox=dict(boxstyle='round,pad=0.5',facecolor='lightyellow',edgecolor='gold',alpha=0.8)
)# 添加文字效果
text_box.set_path_effects([path_effects.withStroke(linewidth=3, foreground='w') # 白色描边
])# 添加箭头注释
plt.annotate('核心概念',xy=(0.65, 0.55), # 箭头指向位置xytext=(0.3, 0.7), # 文本位置arrowprops=dict(arrowstyle='fancy,tail_width=0.6',color='crimson',connectionstyle='arc3,rad=0.3',shrinkA=5),fontsize=16,color='darkred',bbox=dict(boxstyle='round4,pad=0.4', facecolor='#FFF8DC', edgecolor='orange')
)# 添加水印
plt.figtext(0.95, 0.02,'Generated by Python WordCloud',ha='right',fontsize=10,color='gray',alpha=0.7
)# 7. 保存图片
save_path = 'wordcloud_with_annotations.png'
plt.savefig(save_path,dpi=300,bbox_inches='tight',facecolor='white',pad_inches=0.5
)print(f"词云图片已保存至: {save_path}")# 显示图片(可选)
plt.tight_layout()
plt.show()
甘特图(Plotly)
甘特图(Gantt)python实现(matplotlib和plotly)_python 甘特图-CSDN博客https://blog.csdn.net/oyoli/article/details/135388314
类别 | 作用描述 | 典型实现场景 |
---|---|---|
核心作用 | ||
时间规划 | 可视化任务时间轴,明确起止日期、持续时间和里程碑节点 | 项目启动前制定时间计划、研发阶段划分、产品上市倒计时规划 |
进度跟踪 | 实时显示任务完成状态(计划 vs 实际进度) | 施工项目周报、软件开发迭代进度监控、活动筹备进度跟踪 |
资源协调 | 识别任务并行/重叠情况,优化人力与设备资源分配 | 团队任务负载均衡、共享设备调度冲突检测、多项目资源分配 |
依赖关系管理 | 用箭头连接展示任务逻辑顺序(FS/SS/FF等依赖类型) | 工厂流水线工序优化、IT系统升级的先后依赖、科研实验步骤衔接 |
风险预警 | 通过关键路径(Critical Path)标识高风险延迟任务 | 识别可能影响总工期的瓶颈任务、提前触发应急预案 |
应用领域 | ||
工程项目管理 | 管理建筑/基建项目阶段(设计→施工→验收) | 桥梁建设进度跟踪、厂房扩建工程监控、市政改造项目 |
软件开发 | 协调敏捷开发冲刺(Sprint)、版本发布周期 | Jira任务可视化、版本迭代计划、Bug修复排期 |
产品研发 | 控制产品从概念到量产的全流程 | 汽车新车型开发、电子产品硬件迭代、药品临床试验阶段管理 |
营销活动策划 | 统筹线上线下活动执行节点 | 双十一促销筹备、新品发布会流程、广告投放时间线 |
学术研究 | 规划课题研究阶段与论文撰写进度 | 博士研究时间管理、合作课题分工、学术会议准备 |
Plotly 技术优势 | ||
交互性 | 悬停显示任务详情、拖拽调整时间、点击筛选任务类型 | 动态项目评审会演示、实时进度汇报 |
多平台支持 | 生成可嵌入Web/PPT的HTML,支持Jupyter Notebook展示 | 项目管理系统集成、在线仪表盘开发、自动化报告生成 |
高级定制 | 自定义颜色(按负责人/状态)、进度条样式、时间缩放层级 | 高管视图(关键任务聚焦)、团队视图(按成员着色)、风险视图(超期任务红色预警) |
实时协作 | 与数据库连接动态更新图表 | 连接Asana/Trello API自动更新、团队共享实时看板 |
跨设备兼容 | 响应式设计适配PC/平板/手机 | 工地现场移动端查看、远程团队协作 |
绘图库介绍
函数签名(Function Signature)
# ff.create_gantt() 是 Plotly Figure Factory 模块中用于创建甘特图的函数。
ff.create_gantt(df,colors=None,index_col=None,show_colorbar=False,reverse_colors=False,title='Gantt Chart',bar_width=0.2,showgrid_x=False,showgrid_y=False,height=600,width=None,tasks=None,task_names=None,data=None,group_tasks=False,show_hover_fill=True
)
核心参数详解
参数 | 类型 | 默认值 | 说明 |
---|---|---|---|
df | DataFrame | 必填 | 包含任务数据的 DataFrame,需有 Task 、Start 、Finish 列 |
colors | dict/list | None | 自定义颜色: - dict: {'Task1': 'rgb(0,0,255)', ...} - list: 按顺序指定颜色列表 |
index_col | str | None | 替代 Task 列作为任务名称的列名 |
show_colorbar | bool | False | 是否显示颜色条 |
title | str | 'Gantt Chart' | 图表标题 |
bar_width | float | 0.2 | 任务条的宽度(高度方向) |
height | int | 600 | 图表高度(像素) |
width | int | None | 图表宽度(像素),默认自适应 |
group_tasks | bool | False | 是否按任务分组显示(需数据包含分组列) |
DataFrame df
必须包含以下列:
-
Task
: 任务名称(字符串) -
Start
: 任务开始时间(datetime
或日期字符串) -
Finish
: 任务结束时间(datetime
或日期字符串)
可选列:
-
Resource
(或其他列): 用于颜色分组(需配合colors
参数)
示例代码
barh
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from datetime import datetime, timedelta
import numpy as np# 设置中文显示(如果注释需要中文)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用黑体显示中文
plt.rcParams['axes.unicode_minus'] = False # 正常显示负号# 示例数据:任务列表 (任务名, 开始时间, 持续时间(天))
tasks = [('需求分析', '2023-01-01', 5),('系统设计', '2023-01-06', 7),('编码实现', '2023-01-13', 10),('测试阶段', '2023-01-23', 8),('项目交付', '2023-02-01', 3)
]# 转换日期格式
start_dates = [datetime.strptime(task[1], '%Y-%m-%d') for task in tasks]
durations = [task[2] for task in tasks]
end_dates = [start + timedelta(days=dura) for start, dura in zip(start_dates, durations)]
task_names = [task[0] for task in tasks]# 创建图形
fig, ax = plt.subplots(figsize=(12, 8))# 绘制甘特图
y_pos = np.arange(len(tasks))
start_dates_num = mdates.date2num(start_dates)
ax.barh(y_pos, durations, left=start_dates_num, height=0.6, align='center',color=['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd'])# 设置y轴标签
ax.set_yticks(y_pos)
ax.set_yticklabels(task_names)
ax.invert_yaxis() # 反转y轴使任务从上到下排列# 设置日期格式
date_format = mdates.DateFormatter('%Y-%m-%d')
ax.xaxis.set_major_formatter(date_format)
ax.xaxis.set_major_locator(mdates.WeekdayLocator(interval=1))
fig.autofmt_xdate() # 自动旋转日期标签# 添加网格线
ax.grid(axis='x', linestyle='--', alpha=0.7)# 添加任务注释
for i, (start, end, duration) in enumerate(zip(start_dates, end_dates, durations)):# 在条形中间添加持续天数mid_point = start + timedelta(days=duration / 2)ax.text(mid_point, i, f'{duration}天',ha='center', va='center', color='white', fontweight='bold')# 在条形右侧添加结束日期ax.text(end + timedelta(days=0.5), i, f'结束:\n{end.strftime("%m/%d")}',ha='left', va='center', fontsize=9)# 添加特殊标记
ax.annotate('关键阶段',xy=(mdates.date2num(start_dates[2]), 2),xytext=(mdates.date2num(start_dates[2] - timedelta(days=5)), 1),arrowprops=dict(arrowstyle='->', color='red'),bbox=dict(boxstyle='round,pad=0.5', fc='yellow', alpha=0.5))# 添加图标题和坐标轴标签
plt.title('项目开发甘特图', fontsize=16, pad=20)
plt.xlabel('日期', fontsize=12)
plt.ylabel('任务', fontsize=12)# 调整布局
plt.tight_layout()# 保存图片(支持多种格式:png, jpg, pdf, svg等)
plt.savefig('project_gantt_chart.png', dpi=300, bbox_inches='tight')
print("甘特图已保存为 'project_gantt_chart.png'")# 显示图形
plt.show()
plotly
import plotly.express as px
import plotly.figure_factory as ff
import plotly.graph_objects as go
import pandas as pd
import os
from datetime import datetime
from plotly.io import to_image
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
import io# 创建示例数据 - 项目任务计划
tasks = [dict(Task="项目启动", Start='2023-06-01', Finish='2023-06-05', Resource="管理", Completion=100),dict(Task="需求分析", Start='2023-06-03', Finish='2023-06-12', Resource="分析", Completion=100),dict(Task="系统设计", Start='2023-06-10', Finish='2023-06-20', Resource="设计", Completion=90),dict(Task="开发阶段", Start='2023-06-15', Finish='2023-07-10', Resource="开发", Completion=75),dict(Task="前端开发", Start='2023-06-15', Finish='2023-06-30', Resource="开发", Completion=100),dict(Task="后端开发", Start='2023-06-20', Finish='2023-07-10', Resource="开发", Completion=60),dict(Task="测试阶段", Start='2023-06-25', Finish='2023-07-15', Resource="测试", Completion=40),dict(Task="用户培训", Start='2023-07-05', Finish='2023-07-12', Resource="培训", Completion=20),dict(Task="上线部署", Start='2023-07-13', Finish='2023-07-15', Resource="运维", Completion=0),
]# 创建DataFrame
df = pd.DataFrame(tasks)# 将日期字符串转换为日期对象
df['Start'] = pd.to_datetime(df['Start'])
df['Finish'] = pd.to_datetime(df['Finish'])# 计算任务持续时间
df['Duration'] = (df['Finish'] - df['Start']).dt.days# 创建甘特图
# 修改第33行代码
fig = ff.create_gantt(df.to_dict('records'), # 将DataFrame转换为字典列表colors=px.colors.qualitative.Pastel,index_col='Resource',show_colorbar=True,bar_width=0.4,showgrid_x=True,showgrid_y=True,group_tasks=True,title='项目开发计划甘特图'
)# 修改第50行代码(原循环部分)
for i, row in df.iterrows():# 计算任务中点位置mid_date = row['Start'] + (row['Finish'] - row['Start']) / 2# 添加完成度文本注释fig.add_annotation(x=mid_date,y=row['Task'],text=f"{row['Completion']}%",showarrow=False,font=dict(size=10, color='black'),bgcolor="white",bordercolor="black",borderwidth=1,borderpad=2)# 添加进度条progress_end = row['Start'] + (row['Finish'] - row['Start']) * (row['Completion'] / 100)fig.add_trace(go.Scatter(x=[row['Start'], progress_end, progress_end],y=[row['Task'], row['Task'], None],mode='lines',line=dict(color='black', width=3),showlegend=False))# 添加里程碑标记
milestones = [dict(Task="需求分析", Date='2023-06-12', Description="需求确认完成"),dict(Task="系统设计", Date='2023-06-20', Description="设计文档评审"),dict(Task="上线部署", Date='2023-07-15', Description="系统正式上线"),
]for milestone in milestones:date = pd.to_datetime(milestone['Date'])fig.add_trace(go.Scatter(x=[date],y=[milestone['Task']],mode='markers+text',marker=dict(symbol='diamond', size=15, color='red'),text=[milestone['Description']],textposition="top right",textfont=dict(size=10, color='red'),name='里程碑',showlegend=False))# 添加今日线
today = datetime(2023, 6, 25)
fig.add_shape(type="line",x0=today,x1=today,y0=0,y1=1,yref="paper", # 使用相对坐标line=dict(color="red",width=2,dash="dot")
)# 添加关键路径说明
fig.add_annotation(x=pd.to_datetime('2023-06-15'),y=8,text="关键路径:后端开发 → 测试阶段 → 上线部署",showarrow=True,arrowhead=2,arrowsize=1,arrowwidth=2,arrowcolor="red",ax=-50,ay=-70,font=dict(size=12, color="red"),bgcolor="rgba(255, 255, 255, 0.8)",bordercolor="red",borderwidth=1,borderpad=4
)# 添加项目总时长
total_days = (df['Finish'].max() - df['Start'].min()).days
fig.add_annotation(x=pd.to_datetime('2023-07-10'),y=0.5,text=f"项目总时长: {total_days}天",showarrow=False,font=dict(size=14, color="black", family="Arial Black"),bgcolor="rgba(173, 216, 230, 0.7)",bordercolor="blue",borderwidth=1,borderpad=4
)# 更新布局
fig.update_layout(title=dict(text='<b>项目开发计划甘特图</b>',font=dict(size=24, family='Arial', color='darkblue'),x=0.05,y=0.95),xaxis_title='日期',yaxis_title='任务',height=700,width=1200,margin=dict(l=100, r=100, t=100, b=100),hovermode="y unified",legend=dict(title='资源类型',orientation='h',yanchor='bottom',y=1.02,xanchor='right',x=1),plot_bgcolor='rgba(245, 245, 245, 1)',paper_bgcolor='rgba(255, 250, 240, 1)'
)# 确保输出目录存在
os.makedirs('output', exist_ok=True)# 保存为HTML文件(交互式)
html_path = os.path.join('output', 'gantt_chart.html')
fig.write_html(html_path)
print(f"交互式甘特图已保存至: {html_path}")# 保存为静态图片(PNG)
img_path = os.path.join('output', 'gantt_chart.png')
fig.write_image(img_path, scale=2)
print(f"静态甘特图已保存至: {img_path}")# 显示图表
img_data = to_image(fig, format='png', scale=2)
plt.imshow(mpimg.imread(io.BytesIO(img_data)))
plt.axis('off')
plt.show()