user3680510
user3680510

Reputation: 277

Color DataTable From python dash with color dataframe

from dash import Dash, dash_table
import pandas as pd
from collections import OrderedDict

data = OrderedDict(
    [
        ("Date", ["2015-01-01", "2015-10-24", "2016-05-10", "2017-01-10", "2018-05-10", "2018-08-15"]),
        ("Region", ["Montreal", "Toronto", "New York City", "Miami", "San Francisco", "London"]),
        ("Temperature", [1, -20, 3.512, 4, 10423, -441.2]),
        ("Humidity", [10, 20, 30, 40, 50, 60]),
        ("Pressure", [2, 10924, 3912, -10, 3591.2, 15]),
    ]
)

df = pd.DataFrame(data)

data_color = OrderedDict(
    [
        ("Date", ["#26118f", "#ce1177", "#26118f", "#26118f", "#26118f", "#26118f"]),
        ("Region", ["#ce1177", "#26118f", "#ce1177", "#ce1177", "#ce1177", "#ce1177"]),
        ("Temperature", ["#ce1177", "#ce1177", "#26118f", "#ce1177", "#ce1177", "#ce1177"]),
        ("Humidity", ["#26118f", "#ce1175", "#ce1177", "#ce1177", "#ce1177", "#ce1177"]),
        ("Pressure", ["#cf1177", "#ce1173", "#ce1177", "#ce1177", "#ce1177", "#ce1177"]),
    ]
)

df_color = pd.DataFrame(data_color)


app = Dash(__name__)

app.layout = dash_table.DataTable(
    data=df.to_dict('records'),
    columns=[{'id': c, 'name': c} for c in df.columns],
)

if __name__ == '__main__':
    app.run_server(debug=True)

I have a data frame displayed as a data table. I have another same sized data frame with colours. I want to fill each cell with the corresponding color in the other dataframe. How can I do this?

Upvotes: 0

Views: 728

Answers (1)

r-beginners
r-beginners

Reputation: 35135

The code in question refers to the official reference, but the color coding can be completed by using the example on that page to set the color values of the column data of the same name for the data in the table, where a color is defined for each column name. The ability to change the color for each column in the header was not found at the stage of my research.

Update

To set the background color for a unit of cells, the color setting is conditioned on the row index and column name. Prepare a list, take a row from the data frame, and create a dictionary of background colors using the contents of that row as a secondary loop process. Add that created dictionary to the list.

c_list = []
cols = ['Date', 'Region', 'Temperature', 'Humidity', 'Pressure']

for row in df_color.itertuples():
    for i in range(len(cols)):
        color_dict = {}
        color_dict.update(
            {
                 'if':{'row_index': row[0], 'column_id': cols[i]},
                 'backgroundColor': row[i+1]
            }
        )
        c_list.append(color_dict)

app = Dash(__name__)

app.layout = dash_table.DataTable(
    data=df.to_dict('records'),
    columns=[{'id': c, 'name': c} for c in df.columns],
    style_data_conditional=c_list
)

if __name__ == '__main__':
    app.run_server(debug=True)

enter image description here

Upvotes: 2

Related Questions