我有一个使用下面的代码片段创建的示例数据框
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
我想得到以下 -
我尝试使用以下方法创建饼图
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
这给了我一个饼图,但在悬停或显示为文本时不显示百分比值。 另外,将选择链接到与饼图相邻的表格的方法是什么?
感谢@joelostblom 的建议。我做了以下工作来实现我所需要的 -
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)
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
希望这对需要类似东西的其他人有用。