使用 plotly 将折线图/面积图创建为甘特图

Posted

技术标签:

【中文标题】使用 plotly 将折线图/面积图创建为甘特图【英文标题】:Create a line/area chart as a gantt chart with plotly 【发布时间】:2021-12-24 20:41:16 【问题描述】:

我正在尝试创建一个折线图/面积图,它看起来像一个甘特图,在 python 中带有 plotly。那是因为我没有开始和结束的列(px.timeline 需要)。相反,我有几个向量,它们在某个时间点开始,并在几个月内减少。为了更好地说明,这就是我的数据框:

periods      0       1       2       3       4       5       6      7      8      9      10     11     12     13     14     15     16     17    18
start                                                                                                                                             
2018-12     2.0     2.0     2.0     2.0     2.0     2.0     2.0    2.0    1.0    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN   NaN
2019-01   252.0   240.0   228.0   208.0   199.0   182.0   168.0  152.0  141.0  132.0  120.0  108.0   91.0   77.0   66.0   52.0   37.0   19.0   7.0
2019-02   140.0   135.0   129.0   123.0   114.0   101.0    99.0   91.0   84.0   74.0   62.0   49.0   45.0   39.0   33.0   26.0   20.0   10.0   3.0
2019-03    97.0    93.0    85.0    79.0    73.0    68.0    62.0   60.0   54.0   50.0   45.0   41.0   37.0   31.0   23.0   18.0   11.0    4.0   NaN
2019-04    92.0    90.0    86.0    82.0    78.0    73.0    67.0   58.0   51.0   46.0   41.0   38.0   36.0   34.0   32.0   19.0   14.0    3.0   1.0
2019-05   110.0   106.0    98.0    94.0    88.0    84.0    81.0   74.0   66.0   64.0   61.0   53.0   42.0   37.0   32.0   20.0   15.0   11.0   1.0
2019-06   105.0   101.0    96.0    87.0    84.0    80.0    75.0   69.0   65.0   60.0   56.0   46.0   40.0   32.0   30.0   18.0   10.0    6.0   2.0
2019-07   123.0   121.0   113.0   105.0    97.0    90.0    82.0   77.0   74.0   69.0   68.0   66.0   55.0   47.0   36.0   32.0   24.0   11.0   2.0
2019-08   127.0   122.0   117.0   112.0   108.0   100.0    94.0   82.0   78.0   69.0   65.0   58.0   53.0   43.0   35.0   24.0   17.0    8.0   2.0
2019-09   122.0   114.0   106.0   100.0    90.0    83.0    76.0   69.0   58.0   50.0   45.0   39.0   32.0   28.0   24.0   17.0    8.0    5.0   1.0
2019-10   164.0   161.0   151.0   138.0   129.0   121.0   114.0  102.0   95.0   88.0   81.0   72.0   62.0   56.0   48.0   40.0   22.0   16.0   5.0
2019-11   216.0   214.0   202.0   193.0   181.0   165.0   150.0  139.0  126.0  116.0  107.0   95.0   82.0   65.0   54.0   44.0   31.0   14.0   7.0
2019-12   341.0   327.0   311.0   294.0   274.0   261.0   245.0  225.0  210.0  191.0  171.0  136.0  117.0   96.0   79.0   55.0   45.0   26.0   6.0
2020-01  1167.0  1139.0  1089.0  1009.0   948.0   881.0   826.0  745.0  682.0  608.0  539.0  473.0  401.0  346.0  292.0  244.0  171.0   90.0  31.0
2020-02   280.0   274.0   262.0   247.0   239.0   226.0   204.0  184.0  169.0  158.0  141.0  125.0  105.0   89.0   68.0   55.0   29.0   18.0   3.0
2020-03   723.0   713.0   668.0   629.0   581.0   537.0   499.0  462.0  419.0  384.0  340.0  293.0  268.0  215.0  172.0  136.0  103.0   67.0  19.0
2020-04  1544.0  1502.0  1420.0  1337.0  1256.0  1149.0  1065.0  973.0  892.0  795.0  715.0  637.0  538.0  463.0  371.0  283.0  199.0  111.0  29.0
2020-05  1355.0  1313.0  1241.0  1175.0  1102.0  1046.0   970.0  890.0  805.0  726.0  652.0  569.0  488.0  415.0  331.0  255.0  180.0   99.0  19.0
2020-06  1042.0  1009.0   949.0   886.0   834.0   784.0   740.0  670.0  611.0  558.0  493.0  438.0  380.0  312.0  257.0  195.0  125.0   78.0   NaN
2020-07   719.0   698.0   663.0   624.0   595.0   547.0   512.0  460.0  424.0  387.0  341.0  301.0  256.0  215.0  172.0  124.0   90.0    NaN   NaN
2020-08   655.0   633.0   605.0   566.0   537.0   492.0   453.0  417.0  377.0  333.0  294.0  259.0  222.0  189.0  162.0  118.0    NaN    NaN   NaN
2020-09   715.0   687.0   647.0   617.0   562.0   521.0   479.0  445.0  408.0  371.0  331.0  297.0  257.0  208.0  165.0    NaN    NaN    NaN   NaN
2020-10   345.0   333.0   313.0   297.0   284.0   267.0   252.0  225.0  201.0  183.0  159.0  141.0  123.0  108.0    NaN    NaN    NaN    NaN   NaN
2020-11  1254.0  1221.0  1162.0  1094.0  1027.0   965.0   892.0  816.0  743.0  682.0  607.0  549.0  464.0    NaN    NaN    NaN    NaN    NaN   NaN
2020-12   387.0   379.0   352.0   338.0   319.0   292.0   275.0  257.0  230.0  207.0  185.0  157.0    NaN    NaN    NaN    NaN    NaN    NaN   NaN
2021-01   805.0   782.0   742.0   692.0   649.0   599.0   551.0  500.0  463.0  417.0  371.0    NaN    NaN    NaN    NaN    NaN    NaN    NaN   NaN
2021-02   469.0   458.0   434.0   407.0   380.0   357.0   336.0  317.0  296.0  263.0    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN   NaN
2021-03  1540.0  1491.0  1390.0  1302.0  1221.0  1128.0  1049.0  967.0  864.0    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN   NaN
2021-04  1265.0  1221.0  1145.0  1086.0  1006.0   937.0   862.0  793.0    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN   NaN
2021-05   558.0   548.0   520.0   481.0   446.0   417.0   389.0    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN   NaN
2021-06   607.0   589.0   560.0   517.0   484.0   455.0     NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN   NaN
2021-07   597.0   572.0   543.0   511.0   477.0     NaN     NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN   NaN
2021-08   923.0   902.0   850.0   792.0     NaN     NaN     NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN   NaN
2021-09   975.0   952.0   899.0     NaN     NaN     NaN     NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN   NaN
2021-10   647.0   628.0     NaN     NaN     NaN     NaN     NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN   NaN
2021-11   131.0     NaN     NaN     NaN     NaN     NaN     NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN   NaN

如您所见,对于每个周期,我从 0 开始,直到最后一个可用周期。现在,我的代码是这样的:

vectors = []
for i in pivot_period.index:
    vectors.append(list(pivot_period.loc[i]))

fig = px.area(y=[i for i in vectors])

如果您绘制图表,您会看到 x 轴是周期数。但是,当我尝试实现日期(即索引)时,只要我有 18 个句点和 36 个日期,它就会返回错误长度。我的想法是绘制这样的图(对不起,糟糕的图片):

以一种可以在其自己的时间线上可视化每个向量的衰减的方式。有什么想法吗?

【问题讨论】:

【参考方案1】: 从此数据生成面积图很简单:px.area(df, x=df.index, y=df.columns) 我看不到此数据集中的作业/任务来自何处,与所附图像相匹配
df = pd.read_csv(io.StringIO("""periods      0       1       2       3       4       5       6      7      8      9      10     11     12     13     14     15     16     17    18
start                                                                                                                                             
2018-12     2.0     2.0     2.0     2.0     2.0     2.0     2.0    2.0    1.0    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN   NaN
2019-01   252.0   240.0   228.0   208.0   199.0   182.0   168.0  152.0  141.0  132.0  120.0  108.0   91.0   77.0   66.0   52.0   37.0   19.0   7.0
2019-02   140.0   135.0   129.0   123.0   114.0   101.0    99.0   91.0   84.0   74.0   62.0   49.0   45.0   39.0   33.0   26.0   20.0   10.0   3.0
2019-03    97.0    93.0    85.0    79.0    73.0    68.0    62.0   60.0   54.0   50.0   45.0   41.0   37.0   31.0   23.0   18.0   11.0    4.0   NaN
2019-04    92.0    90.0    86.0    82.0    78.0    73.0    67.0   58.0   51.0   46.0   41.0   38.0   36.0   34.0   32.0   19.0   14.0    3.0   1.0
2019-05   110.0   106.0    98.0    94.0    88.0    84.0    81.0   74.0   66.0   64.0   61.0   53.0   42.0   37.0   32.0   20.0   15.0   11.0   1.0
2019-06   105.0   101.0    96.0    87.0    84.0    80.0    75.0   69.0   65.0   60.0   56.0   46.0   40.0   32.0   30.0   18.0   10.0    6.0   2.0
2019-07   123.0   121.0   113.0   105.0    97.0    90.0    82.0   77.0   74.0   69.0   68.0   66.0   55.0   47.0   36.0   32.0   24.0   11.0   2.0
2019-08   127.0   122.0   117.0   112.0   108.0   100.0    94.0   82.0   78.0   69.0   65.0   58.0   53.0   43.0   35.0   24.0   17.0    8.0   2.0
2019-09   122.0   114.0   106.0   100.0    90.0    83.0    76.0   69.0   58.0   50.0   45.0   39.0   32.0   28.0   24.0   17.0    8.0    5.0   1.0
2019-10   164.0   161.0   151.0   138.0   129.0   121.0   114.0  102.0   95.0   88.0   81.0   72.0   62.0   56.0   48.0   40.0   22.0   16.0   5.0
2019-11   216.0   214.0   202.0   193.0   181.0   165.0   150.0  139.0  126.0  116.0  107.0   95.0   82.0   65.0   54.0   44.0   31.0   14.0   7.0
2019-12   341.0   327.0   311.0   294.0   274.0   261.0   245.0  225.0  210.0  191.0  171.0  136.0  117.0   96.0   79.0   55.0   45.0   26.0   6.0
2020-01  1167.0  1139.0  1089.0  1009.0   948.0   881.0   826.0  745.0  682.0  608.0  539.0  473.0  401.0  346.0  292.0  244.0  171.0   90.0  31.0
2020-02   280.0   274.0   262.0   247.0   239.0   226.0   204.0  184.0  169.0  158.0  141.0  125.0  105.0   89.0   68.0   55.0   29.0   18.0   3.0
2020-03   723.0   713.0   668.0   629.0   581.0   537.0   499.0  462.0  419.0  384.0  340.0  293.0  268.0  215.0  172.0  136.0  103.0   67.0  19.0
2020-04  1544.0  1502.0  1420.0  1337.0  1256.0  1149.0  1065.0  973.0  892.0  795.0  715.0  637.0  538.0  463.0  371.0  283.0  199.0  111.0  29.0
2020-05  1355.0  1313.0  1241.0  1175.0  1102.0  1046.0   970.0  890.0  805.0  726.0  652.0  569.0  488.0  415.0  331.0  255.0  180.0   99.0  19.0
2020-06  1042.0  1009.0   949.0   886.0   834.0   784.0   740.0  670.0  611.0  558.0  493.0  438.0  380.0  312.0  257.0  195.0  125.0   78.0   NaN
2020-07   719.0   698.0   663.0   624.0   595.0   547.0   512.0  460.0  424.0  387.0  341.0  301.0  256.0  215.0  172.0  124.0   90.0    NaN   NaN
2020-08   655.0   633.0   605.0   566.0   537.0   492.0   453.0  417.0  377.0  333.0  294.0  259.0  222.0  189.0  162.0  118.0    NaN    NaN   NaN
2020-09   715.0   687.0   647.0   617.0   562.0   521.0   479.0  445.0  408.0  371.0  331.0  297.0  257.0  208.0  165.0    NaN    NaN    NaN   NaN
2020-10   345.0   333.0   313.0   297.0   284.0   267.0   252.0  225.0  201.0  183.0  159.0  141.0  123.0  108.0    NaN    NaN    NaN    NaN   NaN
2020-11  1254.0  1221.0  1162.0  1094.0  1027.0   965.0   892.0  816.0  743.0  682.0  607.0  549.0  464.0    NaN    NaN    NaN    NaN    NaN   NaN
2020-12   387.0   379.0   352.0   338.0   319.0   292.0   275.0  257.0  230.0  207.0  185.0  157.0    NaN    NaN    NaN    NaN    NaN    NaN   NaN
2021-01   805.0   782.0   742.0   692.0   649.0   599.0   551.0  500.0  463.0  417.0  371.0    NaN    NaN    NaN    NaN    NaN    NaN    NaN   NaN
2021-02   469.0   458.0   434.0   407.0   380.0   357.0   336.0  317.0  296.0  263.0    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN   NaN
2021-03  1540.0  1491.0  1390.0  1302.0  1221.0  1128.0  1049.0  967.0  864.0    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN   NaN
2021-04  1265.0  1221.0  1145.0  1086.0  1006.0   937.0   862.0  793.0    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN   NaN
2021-05   558.0   548.0   520.0   481.0   446.0   417.0   389.0    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN   NaN
2021-06   607.0   589.0   560.0   517.0   484.0   455.0     NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN   NaN
2021-07   597.0   572.0   543.0   511.0   477.0     NaN     NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN   NaN
2021-08   923.0   902.0   850.0   792.0     NaN     NaN     NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN   NaN
2021-09   975.0   952.0   899.0     NaN     NaN     NaN     NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN   NaN
2021-10   647.0   628.0     NaN     NaN     NaN     NaN     NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN   NaN
2021-11   131.0     NaN     NaN     NaN     NaN     NaN     NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN   NaN""")
           ,sep="\s+").drop(0).set_index("periods")

px.area(df, x=df.index, y=df.columns)

【讨论】:

以上是关于使用 plotly 将折线图/面积图创建为甘特图的主要内容,如果未能解决你的问题,请参考以下文章

matplotlib画散点图折线图柱状图

echartsjs 饼图柱状图折线图实例

R绘制面积图(area plot)

数据可视化分析(柱状图折线图热力图)

Echarts基本学习 柱状图折线图通用配置

Plotly:如何在甘特图上标记条形?