Ran*_*hen 5 python-3.x plotly-dash
我想根据这样的值从高到小用色标按值对列进行着色
目前,我在一个函数中创建了破折号表,并为每一列循环发送它;
def make_table_in_div(df, column_name):
pv = pd.pivot_table(df, index=[column_name], values=['val1'], aggfunc=['mean', 'count']).reset_index()
pv.columns = [column_name, 'val1', 'count']
print(column_name)
div = html.Div([html.H1(column_name), dash_table.DataTable(
columns=[{"name": i, "id": i} for i in pv.columns],
data=pv.to_dict('records'),
)], style={'height': 30, 'margin-right': 'auto', 'margin-left': 'auto', 'width': '800px'}) # 'width': '50%',
return div
div = [make_table_in_div(df, column_name) for column_name in ['column_name']]
return div
Run Code Online (Sandbox Code Playgroud)
感谢克里斯蒂安·哈加的回答。- 效果很好。
我想为未来和我有同样问题的用户总结一下选项。当我们想要在多列上运行它时,有两种选择:
原始函数将以相同的比例(最小值和最大值)对所有列进行着色,因此,如果我运行多列(来自示例:值和计数),它会返回根据所有列中的最小值和最大值范围进行着色的表格样式(来自示例:0.193,109)。
discrete_background_color_bins(df, columns=['value','count'])

def discrete_background_color_bins(df, n_bins=7, columns='all'):
bounds = [i * (1.0 / n_bins) for i in range(n_bins+1)]
if columns == 'all':
if 'id' in df:
df_numeric_columns = df.select_dtypes('number').drop(['id'], axis=1)
else:
df_numeric_columns = df.select_dtypes('number')
else:
df_numeric_columns = df[columns]
df_max = df_numeric_columns.max().max()
df_min = df_numeric_columns.min().min()
ranges = [
((df_max - df_min) * i) + df_min
for i in bounds
]
styles = []
legend = []
for i in range(1, len(bounds)):
min_bound = ranges[i - 1]
max_bound = ranges[i]
backgroundColor = colorlover.scales[str(n_bins+4)]['div']['RdYlGn'][2:-2][i - 1]
color = 'black'
for column in df_numeric_columns:
styles.append({
'if': {
'filter_query': (
'{{{column}}} >= {min_bound}' +
(' && {{{column}}} < {max_bound}' if (i < len(bounds) - 1) else '')
).format(column=column, min_bound=min_bound, max_bound=max_bound),
'column_id': column
},
'backgroundColor': backgroundColor,
'color': color
})
legend.append(
html.Div(style={'display': 'inline-block', 'width': '60px'}, children=[
html.Div(
style={
'backgroundColor': backgroundColor,
'borderLeft': '1px rgb(50, 50, 50) solid',
'height': '10px'
}
),
html.Small(round(min_bound, 2), style={'paddingLeft': '2px'})
])
)
return (styles, html.Div(legend, style={'padding': '5px 0 5px 0'}))
Run Code Online (Sandbox Code Playgroud)
如果我们想根据每列的最小值和最大值分别对其进行着色,
我们将使用下面的函数:(
非常相似,但首先在列上运行)
def discrete_background_color_bins(df, n_bins=7, columns='all'):
bounds = [i * (1.0 / n_bins) for i in range(n_bins+1)]
if columns == 'all':
if 'id' in df:
df_numeric_columns = df.select_dtypes('number').drop(['id'], axis=1)
else:
df_numeric_columns = df.select_dtypes('number')
else:
df_numeric_columns = df[columns]
df_max = df_numeric_columns.max().max()
df_min = df_numeric_columns.min().min()
ranges = [
((df_max - df_min) * i) + df_min
for i in bounds
]
styles = []
legend = []
for i in range(1, len(bounds)):
min_bound = ranges[i - 1]
max_bound = ranges[i]
backgroundColor = colorlover.scales[str(n_bins+4)]['div']['RdYlGn'][2:-2][i - 1]
color = 'black'
for column in df_numeric_columns:
styles.append({
'if': {
'filter_query': (
'{{{column}}} >= {min_bound}' +
(' && {{{column}}} < {max_bound}' if (i < len(bounds) - 1) else '')
).format(column=column, min_bound=min_bound, max_bound=max_bound),
'column_id': column
},
'backgroundColor': backgroundColor,
'color': color
})
legend.append(
html.Div(style={'display': 'inline-block', 'width': '60px'}, children=[
html.Div(
style={
'backgroundColor': backgroundColor,
'borderLeft': '1px rgb(50, 50, 50) solid',
'height': '10px'
}
),
html.Small(round(min_bound, 2), style={'paddingLeft': '2px'})
])
)
return (styles, html.Div(legend, style={'padding': '5px 0 5px 0'}))
Run Code Online (Sandbox Code Playgroud)
这个有可能。您应该查看此链接:https://dash.plotly.com/datatable/conditional-formatting 特别是“在单列上使用色阶突出显示”部分
我为你写了一个简单的例子:
import dash
import dash_table
import pandas as pd
import dash_html_components as html
import colorlover
from jupyter_dash import JupyterDash
# Dash Application
df = pd.DataFrame(list(zip(
[5,6,7,8,9,10,11,12,13,14],
[0.328, 0.323, 0.193, 0.231, 0.216, 0.284, 0.250, 0.258, 0.394, 0.455],
[67, 99, 109, 104, 88, 74, 32, 31, 33, 22]
)), columns=['column_name', 'value', 'count'])
app = JupyterDash(__name__)
# Function for styling table, defined below
cols = ['value']
(styles, legend) = discrete_background_color_bins(df, columns = cols)
app.layout = html.Div([
legend,
dash_table.DataTable(
id = 'table',
columns = [{"name": i, "id": i} for i in df.columns],
data = df.to_dict('records'),
style_data_conditional = styles
)
])
app.run_server(mode='inline')
Run Code Online (Sandbox Code Playgroud)
此函数使用给定的色阶返回指定列的每行的样式列表。
要获得色阶,您需要安装 colorloverpip install colorlover
其他色阶可以在这里找到: https: //github.com/plotly/colorlover
# Function for styling the table
def discrete_background_color_bins(df, n_bins=7, columns='all'):
bounds = [i * (1.0 / n_bins) for i in range(n_bins+1)]
if columns == 'all':
if 'id' in df:
df_numeric_columns = df.select_dtypes('number').drop(['id'], axis=1)
else:
df_numeric_columns = df.select_dtypes('number')
else:
df_numeric_columns = df[columns]
df_max = df_numeric_columns.max().max()
df_min = df_numeric_columns.min().min()
ranges = [
((df_max - df_min) * i) + df_min
for i in bounds
]
styles = []
legend = []
for i in range(1, len(bounds)):
min_bound = ranges[i - 1]
max_bound = ranges[i]
backgroundColor = colorlover.scales[str(n_bins+4)]['div']['RdYlGn'][2:-2][i - 1]
color = 'black'
for column in df_numeric_columns:
styles.append({
'if': {
'filter_query': (
'{{{column}}} >= {min_bound}' +
(' && {{{column}}} < {max_bound}' if (i < len(bounds) - 1) else '')
).format(column=column, min_bound=min_bound, max_bound=max_bound),
'column_id': column
},
'backgroundColor': backgroundColor,
'color': color
})
legend.append(
html.Div(style={'display': 'inline-block', 'width': '60px'}, children=[
html.Div(
style={
'backgroundColor': backgroundColor,
'borderLeft': '1px rgb(50, 50, 50) solid',
'height': '10px'
}
),
html.Small(round(min_bound, 2), style={'paddingLeft': '2px'})
])
)
return (styles, html.Div(legend, style={'padding': '5px 0 5px 0'}))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1921 次 |
| 最近记录: |