在Python中使用Altair饼图显示pandas列的交互式比例值?

问题描述 投票:0回答:1

我有一个使用下面的代码片段创建的示例数据框

categories = [
    "Network Issue",
    "Hardware Failure",
    "Software Bug",
    "User Error",
    "Other",
]
locations = ["Location A", "Location B", "Location C", "Location D", "Location E"]
data = {
    "Root Cause": [random.choice(categories) for _ in range(20)],
    "LocationName": [random.choice(locations) for _ in range(20)],
}
df = pd.DataFrame(data)
df

我想得到以下 -

  1. 使用 Altair 的 alt.Chart(source).mak_arc() 方法绘制饼图(或圆环图),其中 theta 基于根本原因列的比例值,即 - (sum('Root Cause') / count('Root原因'))
  2. 允许用户选择饼图(或圆环图)的弧线,并让表格根据选择显示这些行。

我尝试使用以下方法创建饼图

import altair as alt
# Create the pie chart
pie_chart = (
    alt.Chart(df)
    .mark_arc()
    .encode(
        theta=alt.Theta(field="Root Cause", type="nominal", aggregate="count"),
        color=alt.Color(field="Root Cause", type="nominal"),
        tooltip=[
            "Root Cause",
            alt.Tooltip(field="Root Cause", type="nominal"),
            alt.Tooltip(field="count()", title="Percentage"),
        ],
    )
)

pie_chart

这给了我一个饼图,但在悬停或显示为文本时不显示百分比值。 另外,将选择链接到与饼图相邻的表格的方法是什么?

我尝试查看文档herehere,但运气不佳,请提出建议。

python visualization altair
1个回答
0
投票

感谢@joelostblom 的建议。我做了以下工作来实现我所需要的 -

  1. 聚合原始数据框以将其减少到更少的行数,然后根据此聚合数据框绘制饼图

使用缩减/聚合数据框的饼图

selection = alt.selection_point(fields=['Root Cause'])

pieChart = (
    alt.Chart(forPieChart)
    .mark_arc(innerRadius=80)
    .encode(
        theta=alt.Theta(field="Percentage", type="quantitative"),
        color=alt.Color(field="Root Cause", type="nominal", legend = alt.Legend(orient='left')

        ),
        tooltip=["Root Cause"],
    )
    .properties(title="Proportion of root cause", width=300, height=300)
).add_params(selection)
  1. 使用文档中链接中指定的代码声明基表对象

数据表的基础图表

ranked_text = alt.Chart(pieChartData).mark_text(align='right', stroke=None, strokeWidth=0).encode(
    y=alt.Y('row_number:O').axis(None)
).transform_filter(
    selection
).transform_window(
    row_number='row_number()'
).transform_filter(
    alt.datum.row_number < 20
).properties(view=alt.ViewConfig(strokeWidth=0))

注意 - alt.ViewConfig(tripWidth=0) 属性有助于隐藏列边框。 接下来使用基表对象创建“列”,如下所示 -

rootCauseField = drawTable(ranked_text, 'Root Cause:N', 'Root Cause')

field1= drawTable(ranked_text, 'Field1:Q', 'Field1')

field2 = drawTable(ranked_text,'Field2:Q', 'Field2')

合并所有相邻的“列”...

text = alt.hconcat(rootCauseField, field1,field2)

然后使用

将饼图和表格连接在一起
pieChart | text

希望这对需要类似东西的其他人有用。

© www.soinside.com 2019 - 2024. All rights reserved.