Plotly:条形图中的颜色条根据行值

Plotly: Color bars in barchart according to row value

我正在 Plotly 中制作一个条形图,它是根据特定数据框行构建的。列中的数据范围从 -1 到 1,因此我想根据 positive/negative 值对条形进行着色。知道怎么做吗?

import pandas as pd
import plotly.express as px

fig = px.bar(df.iloc[1])
fig.show()

df.iloc[0] 的数据如下所示:

RevolvingUtilizationOfUnsecuredLines    0.612380
age                                     0.142217
NumberOfTime30-59DaysPastDueNotWorse   -0.330435
DebtRatio                              -0.246493
MonthlyIncome                           0.338708
NumberOfOpenCreditLinesAndLoans        -0.213658
NumberOfTimes90DaysLate                -0.342467
NumberRealEstateLoansOrLines            0.131937
NumberOfTime60-89DaysPastDueNotWorse   -0.196677
NumberOfDependents                      0.015418
MonthlyIncomePerPerson                 -0.100884
isRetired                               0.016656
Q1_Monthly_Income_True                 -0.079412
Q3_Monthly_Income_True                  0.000109
Q1_Revolving_True                       0.023684
Q3_Revolving_True                       0.273972
  • 一种方法是将数据框的一行(一系列)重塑为数据框
df.iloc[1].T.to_frame().reset_index().rename(columns={0: "x", 1: "y"}),
  • 然后使用 Plotly Express 进行您想要的格式化就变得简单了
px.bar(
    df.iloc[1].T.to_frame().reset_index().rename(columns={0: "x", 1: "y"}),
    x="x",
    y="y",
    color="y",
    range_color=[-1, 1],
)
  • 也可以手动进行此配置
fig = px.bar(df.iloc[1])
fig.for_each_trace(
    lambda t: t.update(marker_color=t.y, marker_coloraxis="coloraxis")
).update_layout(
    coloraxis_cmin=-1,
    coloraxis_cmax=1,
    coloraxis_colorscale=px.colors.sequential.Viridis,
    showlegend=False
)

作为 MWE 的完整代码

import io
import pandas as pd
import plotly.express as px
import plotly.colors

# reconstruct dataframe
df = (
    pd.read_csv(
        io.StringIO(
            """RevolvingUtilizationOfUnsecuredLines    0.612380
age                                     0.142217
NumberOfTime30-59DaysPastDueNotWorse   -0.330435
DebtRatio                              -0.246493
MonthlyIncome                           0.338708
NumberOfOpenCreditLinesAndLoans        -0.213658
NumberOfTimes90DaysLate                -0.342467
NumberRealEstateLoansOrLines            0.131937
NumberOfTime60-89DaysPastDueNotWorse   -0.196677
NumberOfDependents                      0.015418
MonthlyIncomePerPerson                 -0.100884
isRetired                               0.016656
Q1_Monthly_Income_True                 -0.079412
Q3_Monthly_Income_True                  0.000109
Q1_Revolving_True                       0.023684
Q3_Revolving_True                       0.273972"""
        ),
        sep="\s+",
        header=None,
    )
    .set_index(0)
    .T
)
df = pd.concat([df, df])
df.iloc[1]

# question code
fig = px.bar(df.iloc[1])
fig.show()

# solution
px.bar(
    df.iloc[1].T.to_frame().reset_index().rename(columns={0: "x", 1: "y"}),
    x="x",
    y="y",
    color="y",
    range_color=[-1, 1],
)