Plotly Express Icicle 可视化中的自定义排序

Posted

技术标签:

【中文标题】Plotly Express Icicle 可视化中的自定义排序【英文标题】:Custom Sorting in Plotly Express Icicle Visualizations 【发布时间】:2021-11-22 09:51:25 【问题描述】:

我正在处理一个具有季度任务的数据集,并且我试图通过一个快速表达的冰柱图表来可视化它。数据的结构是这样的:

Objective Quarter Task Status Value
Finish Project A 1 Sort data Complete 1
Finish Project A 2 Clean data Complete 1
Finish Project A 2 Visualize plot Complete 1
Finish Project A 3 begin report In Progress 1
Finish Project A 3 Edit report Haven't started 1
Finish Project B 1 Email boss Haven't started 1

问题出在图表中,即使使用这种格式读取数据,它也会根据对应于该季度的行数对其进行排序。因此,在图中,项目 a 的第 2 季度和第 3 季度将排在第一位,而第 1 季度则排在最后。我想把它翻转过来,让它按照季度的顺序排列,即 Q1->Q2->Q3->Q4,但我似乎找不到在情节表达中做到这一点的好方法。以下是我目前正在使用的代码:

fig = px.icicle(df, path=['Objective','Quarter','Task','Status'], values='Value', color='Status',
                color_discrete_map='Haven't started':'red','In Progress':'yellow','Complete':'green',
                maxdepth=3
    )

我遇到的另一个问题是,我将它按状态列着色,但每当一个季度的混合状态不是全部一个状态(即全部完成或进行中)时,它默认为紫色,这对于其余的单元格基本上是不可读的。有没有办法可以更改默认颜色,而不会因状态而丢失颜色?

【问题讨论】:

您的示例代码不适用于您的示例代码。没有列 Value 哦,修好了!简化数据时忘记包含该部分。 【参考方案1】: https://plotly.com/python-api-reference/generated/plotly.graph_objects.Icicle.html sort 是一个参数,使用update_traces() 将其设置为False 图形构建后,检查 colors,如果不在 status 定义的 dict 中,则覆盖
import pandas as pd
import plotly.express as px

df = pd.DataFrame(
    [
        ["Finish Project A", 1, "Sort data", "Complete", 1],
        ["Finish Project A", 2, "Clean data", "Complete", 1],
        ["Finish Project A", 2, "Visualize plot", "Complete", 1],
        ["Finish Project A", 3, "begin report", "In Progress", 1],
        ["Finish Project A", 3, "Edit report", "Haven't started", 1],
        ["Finish Project B", 1, "Email boss", "Haven't started", 1],
    ],
    columns=["Objective", "Quarter", "Task", "Status", "Value"],
)

cm = "Haven't started": "red", "In Progress": "yellow", "Complete": "green"
fig = px.icicle(
    df,
    path=["Objective", "Quarter", "Task", "Status"],
    values="Value",
    color="Status",
    color_discrete_map=cm,
    maxdepth=3,
)

# required changes.  sort – Determines whether or not the sectors are reordered from largest to smallest.
# override color assigned to blocks with ambiguous status
fig.update_traces(
    sort=False,
    marker=
        "colors": tuple(
            c if c in cm.values() else "white" for c in fig.data[0]["marker"]["colors"]
        )
    ,
)

【讨论】:

以上是关于Plotly Express Icicle 可视化中的自定义排序的主要内容,如果未能解决你的问题,请参考以下文章

高可用数据可视化神器plotly_express详解

Plotly.express、熊猫和 NaN

4000字,25张精美交互图表,开启Plotly Express之旅

4000字,25张精美交互图表,开启Plotly Express之旅

如何更改使用 Plotly Express 创建的堆积条形图的文本方向?

用 Python 当中 Plotly.Express 模块绘制几张图表,真的被惊艳到了!!