【问题标题】:How to specify additional colors in Plotly Gantt-chart?如何在 Plotly 甘特图中指定其他颜色?
【发布时间】:2019-05-03 08:04:56
【问题描述】:

我正在使用 Plotly 绘制甘特图:

fig = ff.create_gantt(df, index_col='Resource', show_colorbar=True, group_tasks=True)

当索引在

index_col='Resource'

超过 10 出现错误:

plotly.exceptions.PlotlyError:错误。 'colors' 中的颜色数量不得少于您的组列中唯一索引值的数量。

我认为这是因为 Plotly 的默认颜色仅限于十种不同的颜色(例如 Plotly colours list

我想要更多颜色 (>= index of 'Resource')。如何添加和定义它们?

编辑: 这是一个可用于测试的示例

from __future__ import print_function

from collections import defaultdict

from plotly.offline import plot
import plotly.figure_factory as ff
import pandas as pd
from pandas import ExcelWriter
from pandas import ExcelFile

import datetime



def gantt_test():
    """Solve a small flexible jobshop problem."""

    # convert to date
    serial = 43466.0 # 01.01.2019 Excel
    seconds = (serial - 25569) * 86400.0 # convert to seconds
    date_date = datetime.datetime.utcfromtimestamp(seconds)
    date_string = date_date.strftime("%Y-%m-%d %H:%M:%S")

    df = [dict(Task="machine_99", Start=0, Finish=1, Resource="job_99")]
    df.clear()

    start_value = 0 # in min
    duration = 120  # in min

    for i in range(1, 12):              
        b_dict = dict(Task="M " + str(i), Start=datetime.datetime.utcfromtimestamp((serial - 25569 + (start_value/(60*24.0))) * 86400.0).strftime("%Y-%m-%d %H:%M:%S"), Finish=datetime.datetime.utcfromtimestamp((serial - 25569 + (start_value +duration)/(60*24.0)) * 86400.0).strftime("%Y-%m-%d %H:%M:%S"), Resource="job " + str(i))            
        df.append(b_dict)
        start_value = 10*i





    fig = ff.create_gantt(df, index_col='Resource', show_colorbar=True, group_tasks=True)

    plot(fig, filename='gantt-group-tasks-together.html')


gantt_test()


如果你改变了

    for i in range(1, 12):   

到小于

12

它有效:

【问题讨论】:

  • 您能否在帖子中包含您的数据框,以便其他人可以轻松重现您的问题?
  • @glhr 我已经更新了最初的帖子并包含了一个运行示例。

标签: python-3.x plotly gantt-chart


【解决方案1】:

我通过改变让它工作

fig = ff.create_gantt(df, index_col='Resource', show_colorbar=True, group_tasks=True)

fig = ff.create_gantt(df, colors=colors, index_col='Resource', show_colorbar=True, group_tasks=True)

附加colors,如图所示

    r = lambda: random.randint(0,255)
    #print('#%02X%02X%02X' % (r(),r(),r()))
    colors = ['#%02X%02X%02X' % (r(),r(),r())]

    for i in range(1, 15):              
        b_dict = dict(Task="M " + str(i), Start=datetime.datetime.utcfromtimestamp((serial - 25569 + (start_value/(60*24.0))) * 86400.0).strftime("%Y-%m-%d %H:%M:%S"), Finish=datetime.datetime.utcfromtimestamp((serial - 25569 + (start_value +duration)/(60*24.0)) * 86400.0).strftime("%Y-%m-%d %H:%M:%S"), Resource="job " + str(i))            
        df.append(b_dict)
        start_value = 10*i

        colors.append('#%02X%02X%02X' % (r(),r(),r()))

现在为每个资源添加随机颜色。

【讨论】:

  • 我使用了你的建议,但修改后简化了一点。 r = lambda: random.randint(0,255) colors = ['#%02X%02X%02X' % (r(),r(),r())] for i in range(1, df.Resource.nunique()+1): colors.append('#%02X%02X%02X' % (r(),r(),r()))
【解决方案2】:

您还可以使用hashlib 根据一些输入字符串(即熊猫数据框列)创建更多颜色。

一个最小的例子:

import hashlib

colours = []
for key in listOfStrings:
    colour = colFromStr(str(key))
    colours.append(f"#{colour}")
fig = plotly.figure_factory.create_gantt(dataToPlot, colors=colours)


def colFromStr(inputString):
    hashedString = hashlib.sha256(inputString.encode())
    return hashedString.hexdigest()[len(hashedString.hexdigest())-6:] 

【讨论】:

    猜你喜欢
    • 2021-03-12
    • 2020-12-12
    • 2017-12-05
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 2016-05-11
    相关资源
    最近更新 更多