Я пытаюсь сопоставить цвета с ячейками таблицы.Однако я хочу, чтобы это вызывалось из значений в отдельном столбце.В частности, для приведенного ниже примера я строю значения времени от 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](https://i.stack.imgur.com/j9iXL.png)