Python實(shí)現(xiàn)甘特圖繪制的示例詳解
相信大家在平常實(shí)際工作當(dāng)中,需要對(duì)整體的項(xiàng)目做一個(gè)梳理,這時(shí)如果有一個(gè)網(wǎng)頁(yè)應(yīng)用能夠?qū)φw項(xiàng)目有一個(gè)可視化頁(yè)面的展示,是不是會(huì)對(duì)你的實(shí)際工作有所幫助呢?說(shuō)不定還可以讓你事半功倍,今天小編就想通過(guò)Python+Streamlit框架來(lái)對(duì)整體項(xiàng)目的進(jìn)展做一個(gè)可視化的展示。
前期準(zhǔn)備
因?yàn)槲覀冞@次需要用到streamlit、streamlit-aggrid以及plotly模塊,先通過(guò)pip命令將這些模塊下載下來(lái),其中streamlit-aggrid主要是將數(shù)據(jù)表能夠呈現(xiàn)在頁(yè)面上
pip install streamlit-aggrid pip install plotly
頁(yè)面的結(jié)構(gòu)
整體頁(yè)面的結(jié)構(gòu)是左邊有一個(gè)工具欄,包含了該網(wǎng)頁(yè)的一些簡(jiǎn)短介紹、以及一個(gè)希望使用者評(píng)分和反饋的模塊
而右邊則的Section1是項(xiàng)目規(guī)劃文件的模板樣式,主要是在CSV文件當(dāng)中寫清楚任務(wù)的細(xì)節(jié),包括任務(wù)名稱、任務(wù)描述、開始與結(jié)束時(shí)間等等內(nèi)容。Section2則是允許用戶上傳自己的CSV文件,修改CSV文件中項(xiàng)目的內(nèi)容以及一個(gè)可視化的呈現(xiàn),而Section3則是將上述的內(nèi)容導(dǎo)出至HTML文件當(dāng)中去
代碼部分
下面便是該頁(yè)面的代碼部分
from st_aggrid import AgGrid import streamlit as st import pandas as pd import numpy as np import plotly.express as px from PIL import Image import io
接下來(lái)我們針對(duì)左邊工具欄的部分進(jìn)行一個(gè)開發(fā),主要是對(duì)該頁(yè)面進(jìn)行一個(gè)簡(jiǎn)單的介紹以及評(píng)分等功能
logo = Image.open(r'wechat_logo.jpg')
st.sidebar.image(logo, width=120)
with st.sidebar.expander("關(guān)于此APP的功能"):
st.write("""
項(xiàng)目的簡(jiǎn)單介紹)
""")
with st.sidebar.form(key='columns_in_form',clear_on_submit=True):
st.write('反饋')
st.write('<style>div.row-widget.stRadio > div{flex-direction:row;} </style>', unsafe_allow_html=True) # 水平方向的按鈕
rating=st.radio("打分",('1','2','3','4','5'),index=4)
text=st.text_input(label='反饋')
submitted = st.form_submit_button('提交')
if submitted:
st.write('感謝')
st.markdown('您的評(píng)分是:')
st.markdown(rating)
st.markdown('您的反饋是:')
st.markdown(text)結(jié)果如下圖所示

主頁(yè)面的開發(fā)-Section 1
接下去便是主頁(yè)面的Section 1部分的開發(fā),主要是展示項(xiàng)目CSV文件的樣式,包含了哪些列、列名分別是什么等等,代碼如下
st.markdown(""" <style> .font {
font-size:30px ; font-family: 'Cooper Black'; color: #FF9633;}
</style> """, unsafe_allow_html=True)
st.markdown('<p class="font">上傳您的CSV文件</p>', unsafe_allow_html=True)
st.subheader('第一步:下載模板文件')
image = Image.open(r'example.png') # 模板文件的截圖
st.image(image, caption='確保列名是一致的')
@st.cache_data
def convert_df(df):
return df.to_csv().encode('utf-8')
df=pd.read_csv(r'template.csv', encoding='gbk')
csv = convert_df(df)
st.download_button(
label="下載模板",
data=csv,
file_name='project_template.csv',
mime='text/csv',
)我們提供了下載按鈕可以讓用戶一鍵下載模板文件,最后呈現(xiàn)的樣子是這樣的

主頁(yè)頁(yè)面的開發(fā)-Section 2
接下去便是上傳我們自己的CSV文件,這里我們用到了streamlit_aggrid模塊,該模塊的好處就在于可以對(duì)數(shù)據(jù)表進(jìn)行一個(gè)展示,并且可以對(duì)其中的數(shù)據(jù)進(jìn)行修改,
st.subheader('Step 2: Upload your project plan file')
uploaded_file = st.file_uploader(
"上傳文件",
type=['csv'])
if uploaded_file is not None:
Tasks = pd.read_csv(uploaded_file, encoding='gbk')
Tasks['Start'] = Tasks['Start'].astype('datetime64')
Tasks['Finish'] = Tasks['Finish'].astype('datetime64')
grid_response = AgGrid(
Tasks,
editable=True,
height=300,
width='100%',
)
updated = grid_response['data']
df = pd.DataFrame(updated)output

接下去便是對(duì)數(shù)據(jù)的可視化呈現(xiàn)了,這里是用Plotly模塊來(lái)繪制甘特圖,我們可以選擇是以團(tuán)隊(duì)的維度來(lái)繪制或者是以項(xiàng)目完成的進(jìn)度來(lái)繪制,代碼如下
st.subheader('第三部:繪制甘特圖')
Options = st.selectbox("以下面哪種維度來(lái)繪制甘特圖:", ['Team', 'Completion Pct'], index=0)
if st.button('繪制甘特圖'):
fig = px.timeline(
df,
x_start="Start",
x_end="Finish",
y="Task",
color=Options,
hover_name="Task Description"
)
fig.update_yaxes(
autorange="reversed")
fig.update_layout(
title='Project Plan Gantt Chart',
bargap=0.2,
height=600,
xaxis_title="Date",
yaxis_title="Project Name",
title_x=0.5,
xaxis=dict(
tickfont_size=15,
tickangle=270,
rangeslider_visible=True,
side="top",
showgrid=True,
zeroline=True,
showline=True,
showticklabels=True,
tickformat="%x\n",
)
)
fig.update_xaxes(tickangle=0, tickfont=dict(family='Rockwell', color='blue', size=15))
st.plotly_chart(fig, use_container_width=True) # 繪制甘特圖至頁(yè)面上
st.subheader(
'Bonus: 導(dǎo)出至HTML')
buffer = io.StringIO()
fig.write_html(buffer, include_plotlyjs='cdn')
html_bytes = buffer.getvalue().encode()
st.download_button(
label='Export to HTML',
data=html_bytes,
file_name='Gantt.html',
mime='text/html'
)
else:
st.write('---')到此這篇關(guān)于Python實(shí)現(xiàn)甘特圖繪制的示例詳解的文章就介紹到這了,更多相關(guān)Python甘特圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python使用django框架實(shí)現(xiàn)多人在線匿名聊天的小程序
很多網(wǎng)站都提供了在線匿名聊天的小功能,下面小編基于python的django框架實(shí)現(xiàn)一個(gè)多人在線匿名聊天的小程序,具體實(shí)現(xiàn)代碼大家參考下本文2017-11-11
python3.x編碼解碼unicode字符串的實(shí)現(xiàn)示例
ASCII文本編碼是一種Unicode,存儲(chǔ)為表示字符的字節(jié)值的一個(gè)序列,本文主要介紹了python3.x編碼解碼unicode字符串的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01
Python九九乘法表的七種實(shí)現(xiàn)方式詳解
在Python中,輸出九九乘法表是一道非?;A(chǔ)的題目,但對(duì)于初學(xué)者來(lái)說(shuō),也是一個(gè)很好的練習(xí)和鞏固基礎(chǔ)知識(shí)的機(jī)會(huì),這篇文章主要給大家介紹了關(guān)于Python九九乘法表的七種實(shí)現(xiàn)方式,需要的朋友可以參考下2023-09-09
python統(tǒng)計(jì)中文字符數(shù)量的兩種方法
今天小編就為大家分享一篇python統(tǒng)計(jì)中文字符數(shù)量的兩種方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
python獲取當(dāng)前計(jì)算機(jī)cpu數(shù)量的方法
這篇文章主要介紹了python獲取當(dāng)前計(jì)算機(jī)cpu數(shù)量的方法,涉及Python操作計(jì)算機(jī)硬件的技巧,代碼簡(jiǎn)單易懂,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04

