2016-06-21 3 views
1

Я хочу создать пользовательский участок. Я хочу точно указать цвет каждого объекта. В частности, я создаю диаграмму Ганта для системных событий. Я классифицирую эти события на группы и кодирую их цвета для визуализации.Настройка цветов отдельно в matplotlib

Пожалуйста, обратите внимание на следующий код:

import matplotlib.pyplot as plt 
import pandas as pd 

df = pd.DataFrame() 
df['y'] = [0,4,5,6,10] 
df['color'] = [(.5, .5, .5, .5),]*len(df) 
print df['color'] 

#fig = plt.figure(figsize=(12, 6)) 
#vax = fig.add_subplot(1,1,1) 
#vax.hlines(df['y'], 0, 10, colors=df['color']) 
#fig.savefig('ok.png') 

only_four = df['y']==4 
df['color'][only_four] = [(0.7, 0.6, 0.5, 0.4),]*sum(only_four) 
print df['color'] 

Обратите внимание, что я первый я настройка цвета для всех, чтобы быть полупрозрачным серым. Позже, для определенного набора значений, я хочу изменить цвет. Я получаю эту таблицу цветов.

0 (0.5, 0.5, 0.5, 0.5) 
1      0.6 
2 (0.5, 0.5, 0.5, 0.5) 
3 (0.5, 0.5, 0.5, 0.5) 
4 (0.5, 0.5, 0.5, 0.5) 

Я хочу, чтобы иметь возможность указать любое значение RGBA (т.е. включая прозрачность) для любого подмножества hlines. Может ли кто-нибудь поделиться, как это сделать? Я открыт для любого другого способа сделать это, пока я могу точно покрасить каждую строку, включая прозрачность.

ПРИСОЕДИНЕНИЕ К ВОПРОСУ: Я могу обновить несколько строк итерируя как в:

def set_color(df, row_bool, r, g, b, a=1.0): 
    idx = np.where(row_bool)[0] 
    for i in idx: 
     df['color'][i] = (r,g,b,a) 
    return 

Этого вполне достаточно, но я действительно хотел операцию вектора (т.е. без явного цикла мной).

ответ

0

Я предполагаю, что проблема заключается в том, что вы не можете получить обновленный кортеж для ввода в DataFrame, и вы получите только это значение 0.6 в DataFrame. Вы пробовали использовать DataFrame.set_value?

In [1]: df 
Out[1]: 
    y     color 
0 0 (0.5, 0.5, 0.5, 0.5) 
1 4     0.6 
2 5 (0.5, 0.5, 0.5, 0.5) 
3 6 (0.5, 0.5, 0.5, 0.5) 
4 10 (0.5, 0.5, 0.5, 0.5) 

In [2]: df.set_value(1, 'color', (0.7, 0.6, 0.5, 0.4)) 
Out[2]: 
    y     color 
0 0 (0.5, 0.5, 0.5, 0.5) 
1 4 (0.7, 0.6, 0.5, 0.4) 
2 5 (0.5, 0.5, 0.5, 0.5) 
3 6 (0.5, 0.5, 0.5, 0.5) 
4 10 (0.5, 0.5, 0.5, 0.5) 
+0

спасибо. Я собираюсь принять ваш ответ. Я действительно искал способ сделать это так, как в моем использовании «only_four». Это был только частный случай одной клетки. В общем случае он может содержать любое количество ячеек. Итак, я ищу массивный метод. Это сказало ваше предложение. Я обновлю вопрос, если кто-то еще посмотрит :) –

Смежные вопросы