Python绘图库及图像类型之特殊领域可视化

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]  # 主图是第一个axes
    ax.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()

Python绘图库及图像类型之特殊领域可视化_第1张图片

科学可视化(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 strintScene 或 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 是待处理的字符串

关键参数详解 

参数 说明 示例值
widthheight 图像宽高(像素) 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()

Python绘图库及图像类型之特殊领域可视化_第2张图片

甘特图(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,需有 TaskStartFinish 列
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()

Python绘图库及图像类型之特殊领域可视化_第3张图片

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='项目开发计划甘特图',
        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()

Python绘图库及图像类型之特殊领域可视化_第4张图片

你可能感兴趣的:(python,开发语言,金融图表,科学可视化,词云,甘特图)