Plotly可以创建交互式图表的库,能支持多种编程语言,如Python、R和JavaScript。下面华纳云整理了在新加坡vps服务器上用Python和Plotly创建单项目/多项目甘特图的方法。
先要保证新加坡vps服务器上安装Python,再用pip安装Plotly:
pip install plotly
在Python脚本中,导入Plotly的graph_objects 模块:
import plotly.graph_objects as go
准备好甘特图数据,数据一般包含任务名称、开始日期、结束日期等:
tasks = [
{"Task": "Task 1", "Start": "2024-01-01", "Finish": "2024-01-05"},
{"Task": "Task 2", "Start": "2024-01-03", "Finish": "2024-01-09"},
# 添加更多任务...
]
再用Plotly的go.Figure 和 go.Bar 创建甘特图:
fig = go.Figure()
for task in tasks:
fig.add_trace(go.Bar(
name=task["Task"],
x=[task["Start"], task["Finish"]],
y=[0, 0], # y值设为0,因为我们只需要显示条形图的高度为任务名称
orientation='h', # 水平条形图
text=task["Task"], # 任务名称作为文本显示
textposition='outside' # 文本位置在条形图外侧
))
fig.update_layout(
title="Gantt Chart",
xaxis_title="Date",
yaxis_title="Tasks",
xaxis_range=["2024-01-01", "2024-01-10"] # 设置x轴的范围
)
在Python脚本中显示图表:
fig.show()
如果是在web服务器上托管图表,可以使用Dash框架,这是Plotly的用于创建web应用程序的产品。安装Dash:
pip install dash
创建Dash再添加甘特图:
import dash
from dash import dcc
from dash import html
app = dash.Dash(__name__)
app.layout = html.Div([
dcc.Graph(
id='gantt-chart',
figure=fig
)
])
if __name__ == '__main__':
app.run_server(host='0.0.0.0', port=8050) # 在8050端口上运行服务器
把Dash应用程序部署到新加坡vps服务器上,确保防火墙和网络相关设置允许外部访问。
还可以用Plotly创建一个多项目的甘特图,用plotly.graph_objects模块中的Figure和Bar对象如:
import plotly.graph_objects as go
from datetime import datetime
# 定义项目和任务数据
projects = ["Project A", "Project B", "Project C"]
tasks = {
"Project A": [
{"Task": "Task 1", "Start": "2024-01-01", "Finish": "2024-01-05"},
{"Task": "Task 2", "Start": "2024-01-03", "Finish": "2024-01-10"}
],
"Project B": [
{"Task": "Task 3", "Start": "2024-01-06", "Finish": "2024-01-12"},
{"Task": "Task 4", "Start": "2024-01-08", "Finish": "2024-01-15"}
],
"Project C": [
{"Task": "Task 5", "Start": "2024-01-10", "Finish": "2024-01-18"},
{"Task": "Task 6", "Start": "2024-01-12", "Finish": "2024-01-20"}
]
}
# 创建一个Figure对象
fig = go.Figure()
# 为每个项目添加任务条形图
for project, project_tasks in tasks.items():
for task in project_tasks:
fig.add_trace(go.Bar(
name=project,
x=[datetime.strptime(task["Start"], "%Y-%m-%d"), datetime.strptime(task["Finish"], "%Y-%m-%d")],
y=[task["Task"], task["Task"]], # 使用任务名称作为y值
orientation='h', # 水平条形图
text=[task["Task"]]*2, # 任务名称作为文本显示
textposition='auto' # 文本位置自动调整
))
# 更新布局
fig.update_layout(
title="Multi-Project Gantt Chart",
xaxis_title="Date",
yaxis_title="Tasks",
xaxis_range=["2024-01-01", "2024-01-31"], # 设置x轴的范围
legend_title="Projects"
)
# 显示图表
fig.show()
其中,先定义项目名称和每个项目的任务列表,每个人物含一个名称、开始日期和结束日期。创建一个figure对象且为每个人物添加一个水平条形图,x值设置为任务开始和结束日期,y值设置为任务名称,orientation='h'来创建水平条形图,并使用text属性在条形图旁边显示任务名称。用update_layout方法更新了图表的布局,包括标题、轴标题和图例标题,并设置了x轴的范围。用了datetime.strptime函数来将日期字符串转换为datetime对象,以便Plotly能够正确地解析和显示日期。还可以根据需要调整xaxis_range参数来设置x轴的显示范围。