pyplot으로 Gantt 차트를 만들어 보았습니다.

Summary


  • matplotlib.pyplot.barh를 사용하여 가로 막대 그래프를 그립니다
  • width 인수로 막대의 폭, left 인수로 막대의 오프셋 위치를 지정



  • 코드


    import matplotlib.pyplot as plt
    import matplotlib.dates as mdates
    import datetime as dt
    
    # 描画用データ、csvなどから取り込んでこの形にしても良い
    periods = [
        ["one",   dt.datetime(2021,  4,  1), dt.datetime(2021,  8,  1)],
        ["two",   dt.datetime(2021,  6,  1), dt.datetime(2021,  8,  1)],
        ["three", dt.datetime(2021,  8,  1), dt.datetime(2021, 10,  1)],
    ]
    
    # barhがy軸正方向に描画していくので、ガントチャートらしくなるよう逆向きにする
    periods.reverse()
    # periodsが2重のlistになっているので、行と列を入れ替えて取り出す
    titles, begins, ends = list(zip(*periods))
    
    # pyplot内でDatesとして扱われるように変換
    edate, bdate = [mdates.date2num(item) for item in (ends, begins)]
    
    # 実際に描画
    fig, ax = plt.subplots()
    ax.barh(y=titles, width=edate - bdate, left=bdate)
    #  横軸目盛の表示形式をdateに変更する
    ax.xaxis_date()
    
    # 描画
    plt.savefig("hoge.png")
    #plt.show()
    

    보충 정보


  • Gantt 차트의 y축은 라벨이 길어지기 쉽기 때문에
  • plt.subplots(figsize=(12, 6)) 등으로 그래프를 가로로 늘립니다.
  • fig.subplots_adjust(left=0.5, right=0.95) 등으로 yticks 라벨의 영역을 늘릴 수 있습니다

  • y축의 순서가 의도한 대로 되지 않는 경우
  • ax.barh(y=range(len(titles), ...) ax.yticks(range(len(titles)), titles) 로 titles의 순서대로 할 수 있다

  • ax.xaxis.set_major_formatter() 에서 x 축의 표시 형식을 만지기
  • ax.xaxis.set_major_locator() 로 주 눈금, minor 로 하면 보조 눈금의 간격을 만지
  • 더 자세한 내용은 bdate 등과 같은 용도로 xticks를 만들고 ax.set_xticks(xticks, minor=False)
  • 최대·최소는 ax.set_xlim(bdate[-1], edate[0]) 등으로 정렬된다

  • 좋은 웹페이지 즐겨찾기