Раскрасить фоновый цвет ячейки, сопоставленный по значению столбца - PullRequest
0 голосов
/ 25 сентября 2019

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

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

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import six

df = pd.DataFrame({
    'Place' : ['Johnathon Santiago-Guillermo','Alan','Cory','Jim','Johnathon Santiago-Guillermo','Alan','Cory','Jim'],                                
    'Number' : ['1','3','5','6','2','4','6','7'],          
    'Code' : ['1','2','3','4','1','2','3','4'],                      
    'Time' : ['1904-01-01 08:00:00','1904-01-01 09:00:00','1904-01-02 01:00:00','1904-01-02 02:00:00','1904-01-01 08:10:00','1904-01-01 09:10:00','1904-01-02 01:10:00','1904-01-02 02:10:00'],                           
    })

df['Time'] = pd.to_datetime(df['Time'])
df = df.sort_values('Time')
df['Time'] = pd.DatetimeIndex(df['Time']).time

df1 = df.pivot_table(index = 'Number', columns = 'Place', values = 'Time', 
        aggfunc = 'first').fillna('')#.reset_index()

df1 = df1.reindex(columns = df['Place'].unique())

def render_mpl_table(data, col_width, row_height = 0.3, font_size = 6,
                     header_color='black', row_colors=['#f1f1f2', 'w'], edge_color='black',
                     bbox=[0, 0, 1, 1], header_columns=0,
                     ax=None, **kwargs):

    if ax is None:
        size = (np.array(data.shape[::-1]) + np.array([0, 1])) * np.array([col_width, row_height])

        fig, ax = plt.subplots(figsize=size)
        ax.axis('off')

    # Map colors to different codes
    #vals = df['Code'].astype(int)
    #colours = plt.cm.viridis(vals)  

    # Call Table parameters
    mpl_table = ax.table(cellText=data.values, bbox=bbox, cellLoc='center',
                     rowLabels = df1.index, colLabels=data.columns, **kwargs)

    # Insert Index as Separate Column
    w, h = mpl_table[0,1].get_width(), mpl_table[0,1].get_height()
    mpl_table.add_cell(0, -1, w,h, text= 'Number')

    # Manually set cell colors based off unique value in Code        
    mpl_table._cells[(1, 0)].set_facecolor('yellowgreen')
    mpl_table._cells[(2, 0)].set_facecolor('yellowgreen')

    mpl_table._cells[(3, 1)].set_facecolor('powderblue')
    mpl_table._cells[(4, 1)].set_facecolor('powderblue')

    mpl_table._cells[(5, 2)].set_facecolor('mediumpurple')
    mpl_table._cells[(6, 2)].set_facecolor('mediumpurple')    

    mpl_table._cells[(6, 3)].set_facecolor('lightgray')
    mpl_table._cells[(7, 3)].set_facecolor('lightgray')     

    # Set Column/Index colours
    for k, cell in six.iteritems(mpl_table._cells):
        cell.set_edgecolor(edge_color)
        if k[0] == 0 or k[1] < header_columns:
            cell.set_text_props(weight='bold', color='w', wrap = True)
            cell.set_facecolor(header_color)

    mpl_table.auto_set_font_size(False)
    mpl_table.set_fontsize(font_size)             

    return ax

render_mpl_table(df1, header_columns=0, col_width = 1)

Предполагаемый выход:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...