0

I have a code which converts a pandas dataframe to table from here Now, I want to change the whole row color based on specific condition. If one of the cell meets my condition then the text color of whole row will be changed.

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

trend = ['uptrend', 'downtrend', '10 uptrend', '20 downtrend']
value = ['10', '20', '30', '50']
df = pd.DataFrame({'Trend':trend, 'Value':value})


def render_mpl_table(data, col_width=3.0, row_height=0.625, font_size=14,
                 header_color='#40466e', row_colors=['#f1f1f2', 'w'], edge_color='w',
                 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])
     print(size)
     fig, ax = plt.subplots(figsize=size)
     ax.axis('off')

  mpl_table = ax.table(cellText=data.values, bbox=bbox, colLabels=data.columns, **kwargs)

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

  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')
          cell.set_facecolor(header_color)
      else:
          cell.set_facecolor(row_colors[k[0]%len(row_colors) ])

      if 'uptrend' in cell.get_text().get_text():
          cell.set_text_props(weight='bold', color='g')
      elif 'downtrend' in cell.get_text().get_text():
          cell.set_text_props(weight='bold', color='r')
  return ax


render_mpl_table(
    df, 
    header_columns=0, 
    header_color='#40466e', 
    edge_color='grey', 
    row_height = 1, 
    col_width=2.5
)

I want to change all cell's text colors if one condition is met. Like I want to change the color of 10 to green, 20 red, 30 green and

  • As the coordinates of the table can be specified in tuples, the following code can be added to the if condition to make 10 green. `if 'uptrend' in cell.get_text().get_text():cell.set_text_props(weight='bold', color='g');mpl_table._cells[(k[0],k[1]+1)].set_text_props(weight='bold', color='g')` – r-beginners Sep 08 '21 at 08:35
  • @r-beginners mpl_table._cells[(k[0],k[1]+1)].set_text_props(weight='bold', color='g') this chunk of code only change the color if my column number is two. I have added another column but the color of that column doesn't change. – SamuraiSam Sep 08 '21 at 11:01
  • `print(k)` will print the coordinates of the table in tuple form: (k[0].k[1]+2) when the third column is added. – r-beginners Sep 08 '21 at 11:38
  • any way to add the last coordinate dynamically? Like if the data frame changes every time it will automatically take the length of the row. – SamuraiSam Sep 08 '21 at 12:44
  • The number of rows in the target DF can be obtained with `len(df)`and`len(mpl._table._cells)`, and the number of columns with `len(df.columns)` . – r-beginners Sep 09 '21 at 02:55

0 Answers0