график Ганта с цветовой шкалой - PullRequest
0 голосов
/ 22 января 2020

Я создаю диаграмму Ганта, как здесь https://plot.ly/python/gantt/#index -by-Numberri c -вариабельная Однако моя переменная Numberri c, которую я хочу использовать в качестве индекса, является положительным числом, намного превышающим 100. Когда я использую пример кода, цветовая полоса ограничивается [0,100], в результате чего все столбцы имеют цвет 100. Есть ли способ поднять максимальное значение в диаграмме Глота, построенной с использованием кода, как в пример?

Я хочу, чтобы цвет был "пропорционален" значению индекса.

Это пример кода:

import plotly.figure_factory as ff

df = [dict(Task="Job A", Start='2009-01-01', Finish='2009-02-28', Complete=10),
      dict(Task="Job B", Start='2008-12-05', Finish='2009-04-15', Complete=60),
      dict(Task="Job C", Start='2009-02-20', Finish='2009-05-30', Complete=95)]

fig = ff.create_gantt(df, colors='Viridis', index_col='Complete', show_colorbar=True)
fig.show()

Чтобы быть понятным: в в моем случае переменная Complete может достигать значений 700000

1 Ответ

1 голос
/ 23 января 2020

Согласно документации, он должен масштабироваться, когда указывается числовой индекс c. Однако, глядя на код, кажется, что минимальные / максимальные значения жестко закодированы в 0 и 100. См. code , строки 285 и 286.

Один из обходных путей - масштабирование индекса в диапазоне от 0 до 100 и вручную установите метки цветовой полосы на исходные минимальные / максимальные значения:

import warnings
warnings.filterwarnings('ignore', category=FutureWarning)  # plotly returns a FutureWarning due to using .ix

from sklearn import preprocessing
import plotly.figure_factory as ff

# create a dataframe for easier processing wrt the scaled index
df = pd.DataFrame([dict(Task="Job A", Start='2009-01-01', Finish='2009-02-28', Complete=10),
      dict(Task="Job B", Start='2008-12-05', Finish='2009-04-15', Complete=60),
      dict(Task="Job C", Start='2009-02-20', Finish='2009-05-30', Complete=995)])

# scale index (0-100) and add as new column
min_max_scaler = preprocessing.MinMaxScaler()
index_scaled = min_max_scaler.fit_transform(df.Complete.values.reshape(-1,1))
df['index_scaled'] = index_scaled * 100

# create figure based on scaled index
fig = ff.create_gantt(df, index_col='index_scaled', colors='Viridis', show_colorbar=True)

# set scale of color bar
fig.data[-1]['marker']['cmin'] = df.Complete.min()
fig.data[-1]['marker']['cmax'] = df.Complete.max()
fig.data[-2]['marker']['cmin'] = df.Complete.min()
fig.data[-2]['marker']['cmax'] = df.Complete.max()

# Due to indexing on the scaled value, the tooltip of the bars shows this values instead of its original.
# You could iterate over them and adjust, but you'll need to match the sorting of fig.data to the sorting of the dataframe.
# fig.data[0].name = original_value

fig.show()

Обратите внимание, что, как уже упоминалось в комментариях выше, вам может потребоваться позаботиться о всплывающей подсказке для полос (отображая индексированное значение). Они также могут быть установлены вручную, но вам нужно будет сопоставить порядок в fig.data с порядком вашего исходного кадра данных.

...