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(x2 + y2) * 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()