ホームページ  >  記事  >  バックエンド開発  >  Python でガント チャート描画を実装するにはどうすればよいですか?

Python でガント チャート描画を実装するにはどうすればよいですか?

王林
王林転載
2023-04-25 21:52:132070ブラウズ

事前準備

今回は streamlitstreamlit-aggridplotly モジュールを使用する必要があるため、最初に pip コマンドはこれらのモジュールをダウンロードします。そのうちの streamlit-aggrid は主にページ上にデータ テーブルを表示するために使用されます

pip install streamlit-aggrid
pip install plotly

ページの構造

ページ全体の構造は、左側に Web ページの簡単な紹介を含むツールバーと、ユーザーに評価とフィードバックを提供するモジュール

があるということです。右側のセクション 1 は次のとおりです。主にCSV形式のプロジェクト計画書のテンプレート形式 タスク名、タスクの説明、開始時刻と終了時刻など、タスクの詳細をファイルに明確に記述します。セクション 2 では、ユーザーが独自の CSV ファイルをアップロードし、CSV ファイル内の項目のコンテンツを変更し、視覚的なプレゼンテーションを提供できるようにします。一方、セクション 3 では、上記のコンテンツを HTML ファイルにエクスポートします。

コード パート

以下はページのコード部分です

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

次に、主にページとスコアリング機能の簡単な紹介を提供するために、左側のツールバーの部分を開発します

logo = Image.open(r'wechat_logo.jpg')
st.sidebar.image(logo,  width=120)

with st.sidebar.expander("关于此APP的功能"):
     st.write("""
        项目的简单介绍)
     """)

with st.sidebar.form(key='columns_in_form',clear_on_submit=True): 
    st.write('反馈')
    st.write(&#39;<style>div.row-widget.stRadio > div{flex-direction:row;} </style>&#39;, unsafe_allow_html=True) # 水平方向的按钮
    rating=st.radio("打分",(&#39;1&#39;,&#39;2&#39;,&#39;3&#39;,&#39;4&#39;,&#39;5&#39;),index=4)
    text=st.text_input(label=&#39;反馈&#39;)
    submitted = st.form_submit_button(&#39;提交&#39;)
    if submitted:
      st.write(&#39;感谢&#39;)
      st.markdown(&#39;您的评分是:&#39;)
      st.markdown(rating)
      st.markdown(&#39;您的反馈是:&#39;)
      st.markdown(text)

結果を以下の図に示します。

Python でガント チャート描画を実装するにはどうすればよいですか?

メイン ページの開発 - セクション 1

次のステップは、メイン ページのセクション 1 の開発です。主に表示用 プロジェクト CSV ファイルのスタイル、それに含まれる列、列名など。コードは次のとおりです。

st.markdown(""" <style> .font {                                          
    font-size:30px ; font-family: &#39;Cooper Black&#39;; color: #FF9633;} 
    </style> """, unsafe_allow_html=True)
st.markdown(&#39;<p class="font">上传您的CSV文件</p>&#39;, unsafe_allow_html=True)

st.subheader(&#39;第一步:下载模板文件&#39;)
image = Image.open(r&#39;example.png&#39;) # 模板文件的截图
st.image(image,  caption=&#39;确保列名是一致的&#39;)

@st.cache_data
def convert_df(df):
     return df.to_csv().encode(&#39;utf-8&#39;)

df=pd.read_csv(r&#39;template.csv&#39;, encoding=&#39;gbk&#39;)
csv = convert_df(df)
st.download_button(
     label="下载模板",
     data=csv,
     file_name=&#39;project_template.csv&#39;,
     mime=&#39;text/csv&#39;,
 )

ユーザーがテンプレート ファイルをダウンロードできるダウンロード ボタンを提供します。ワンクリックで、最終的な外観は次のようになります

Python でガント チャート描画を実装するにはどうすればよいですか?

ホームページの開発 - セクション 2

次のステップは、独自の CSV ファイルをアップロードすることです。ここでは streamlit_aggrid モジュールを使用します。このモジュールの利点は、データ テーブルを表示し、その中のデータを変更できることです。

st.subheader(&#39;Step 2: Upload your project plan file&#39;)
uploaded_file = st.file_uploader(
    "上传文件",
    type=[&#39;csv&#39;])
if uploaded_file is not None:
    Tasks = pd.read_csv(uploaded_file, encoding=&#39;gbk&#39;)
    Tasks[&#39;Start&#39;] = Tasks[&#39;Start&#39;].astype(&#39;datetime64&#39;)
    Tasks[&#39;Finish&#39;] = Tasks[&#39;Finish&#39;].astype(&#39;datetime64&#39;)

    grid_response = AgGrid(
        Tasks,
        editable=True,
        height=300,
        width=&#39;100%&#39;,
    )

    updated = grid_response[&#39;data&#39;]
    df = pd.DataFrame(updated)

output

Python でガント チャート描画を実装するにはどうすればよいですか?

次に、データの視覚的なプレゼンテーションです。ここでは、Plotly モジュールを使用してガント チャートを描画します。チームの次元またはプロジェクトの進捗状況に基づいて描画することを選択できます。コードは次のとおりです

st.subheader(&#39;第三部:绘制甘特图&#39;)

Options = st.selectbox("以下面哪种维度来绘制甘特图:", [&#39;Team&#39;, &#39;Completion Pct&#39;], index=0)
if st.button(&#39;绘制甘特图&#39;):
    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=&#39;Project Plan Gantt Chart&#39;,
        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=&#39;Rockwell&#39;, color=&#39;blue&#39;, size=15))
    st.plotly_chart(fig, use_container_width=True)  # 绘制甘特图至页面上
    st.subheader(
        &#39;Bonus: 导出至HTML&#39;) 
    buffer = io.StringIO()
    fig.write_html(buffer, include_plotlyjs=&#39;cdn&#39;)
    html_bytes = buffer.getvalue().encode()
    st.download_button(
        label=&#39;Export to HTML&#39;,
        data=html_bytes,
        file_name=&#39;Gantt.html&#39;,
        mime=&#39;text/html&#39;
    )
else:
    st.write(&#39;---&#39;)

以上がPython でガント チャート描画を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。