0

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

客观的 四分之一 任务 地位 价值
完成项目 A 1 排序数据 完全的 1
完成项目 A 2 清理数据 完全的 1
完成项目 A 2 可视化绘图 完全的 1
完成项目 A 3 开始报告 进行中 1
完成项目 A 3 编辑报告 还没开始 1
完成项目 B 1 电子邮件老板 还没开始 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
    )

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

4

1 回答 1

0
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"]
        )
    },
)
于 2021-10-02T16:30:59.610 回答