在table_fig中将大于80的值字体颜色改为蓝色

0 投票
1 回答
22 浏览
提问于 2025-04-14 16:44

我正在执行以下代码,想要把表格中大于80的数值涂成颜色。但是,代码没有按预期把字体颜色设置为蓝色。比如说,MVS_SYSTEM_ID这一列的值XPTB本不应该被涂色,但它却被涂了。而且,代码还把一些低于80的值,比如34.17、46.38、33.06和77.12也涂上了颜色。

有没有人能帮我一下?我非常感谢大家的帮助。

这是我的代码:

import pandas as pd
import plotly.graph_objs as go

# Criar um DataFrame com os dados fornecidos
data = {
    'SYSTEM_ID': ['XPTO', 'XPTO', 'XPTO', 'XPTX', 'XPTX', 'THE_FIRM', 'THE_FIRM', 'THE_FIRM'],
    'MVS_SYSTEM_ID': ['XPTO', 'XPTB', 'XRNA', 'ZZZZ', 'CCCC', 'NABD', 'XXXX', 'YYYY'],
    'MAX_CSA_USED%': [60.47, 71.41, 70.93, 35.14, 32.26, 24.1, 31.56, 22.81],
    'MAX_ECSA_USED%': [51.46, 81.9, 53.8, 35.02, 34.87, 37.47, 40.88, 14.17],
    'MAX_SQA_USED%': [42.52, 33.64, 42.23, 45.05, 40.61, 33.7, 25.39, 29.67],
    'MAX_ESQA_USED%': [56.26, 53.55, 57.13, 34.17, 46.38, 91.31, 33.06, 77.12]
}

table_df = pd.DataFrame(data)

# Definir as colunas do DataFrame
table_columns = ['SYSTEM_ID', 'MVS_SYSTEM_ID', 'MAX_CSA_USED%', 'MAX_ECSA_USED%', 'MAX_SQA_USED%', 'MAX_ESQA_USED%']

# Criar a figura da tabela
table_fig = go.Figure(data=[go.Table(
    header=dict(values=table_columns),
    cells=dict(values=[table_df[col] if col not in ['MVS_SYSTEM_ID', 'SYSTEM_ID'] else table_df[col].astype(str) for col in table_columns],
               align=['center', 'center', 'right'],
               font=dict(color=[['blue' if val > 80 else 'black' for val in row] for row in table_df[['MAX_CSA_USED%', 'MAX_ECSA_USED%', 'MAX_SQA_USED%', 'MAX_ESQA_USED%']].values]),
               fill=dict(color=[['lightblue' if val > 80 else 'white' for val in row] for row in table_df[['MAX_CSA_USED%', 'MAX_ECSA_USED%', 'MAX_SQA_USED%', 'MAX_ESQA_USED%']].values]),
))])

# Mostrar a tabela
table_fig.show()

1 个回答

1

看代码的时候,可能发现字体颜色和填充颜色只适用于数字列。虽然可能有其他方法来实现这个功能,但我创建了一个单独的函数,用来设置数据框中值的颜色,无论是字符串还是其他类型。如果是数字的话,就根据条件来上色。而且,plotly的表格是按列来处理的,所以我把它改成了列的规格。想了解更多细节,可以查看这个参考示例:详情

import pandas as pd
import plotly.graph_objs as go
import numpy as np

table_fig = go.Figure()

font_list = []
fill_list = []
for col in table_df.values.T.tolist():
    for r in col:
        if type(r) is str:
            font_list.append('black')
            fill_list.append('white')
        else:
            if r > 80.0:
                font_list.append('blue')
                fill_list.append('lightblue')
            else:
                font_list.append('black')
                fill_list.append('white')

table_fig.add_trace(go.Table(header=dict(values=table_df.columns),
                             cells=dict(values=table_df.values.T,
                                            align=['center','center','right','right','right','right'],
                                            font_color=np.array(font_list).reshape(6,8),
                                            fill_color=np.array(fill_list).reshape(6,8))
                                )
                        )

table_fig.update_layout(height=500)
table_fig.show()

在这里输入图片描述

撰写回答