堆积条形图。使用来自所有类别的信息创建一个集成的工具提示 (Altair)
Stacked bar chart. Create one integrated Tooltip with information from all categories (Altair)
目前,我图表中的工具提示对于条形图的每个 'stack'/类别都是独立的。
我想创建一个统一的工具提示,在同一栏的任何位置显示来自所有类别的相同综合信息。
例如:
- 日期(年):2020
- 计数(总计):2
- 计数'true':1
- 计数'false':1
- % 'true': 50%
这在 Altair 中可行吗?
在我现在的代码和输出下面。
import altair as alt
import pandas as pd
df = pd.DataFrame({
'date': ['20-03-2017', '20-03-2017', '20-03-2018', '21-03-2018', '20-10-2019', '20-03-2019', '1-02-2019', '10-03-2020', '20-06-2020'],
'value': [True, True, True, False, True, False, False, True, False]
})
df['date'] = pd.to_datetime(df['date'])
alt.Chart(df).mark_bar().encode(
x = 'year(date):O',
y = 'count(value)',
color = 'value',
tooltip = ['year(date)', 'count(value)']
)
没有任何超级干净的方法可以做到这一点,因为给定标记的工具提示(例如其中一个条的橙色部分)只能包含与该标记实际关联的值。
因此,要获得您想要的行为,您必须使用 transforms 来计算这些聚合值并将它们与原始数据集连接起来,以便工具提示可以访问它们以获得所需的标记。这是一个例子:
alt.Chart(df).transform_timeunit(
year='year(date)'
).transform_joinaggregate(
count='count(value)',
count_true='sum(value)',
groupby=['year']
).transform_calculate(
count_false = "datum.count - datum.count_true"
).mark_bar(opacity=1).encode(
x='year(date):O',
y='count():Q',
color='value',
tooltip=['year(date):O', 'count:Q', 'count_true:Q', 'count_false:Q']
)
目前,我图表中的工具提示对于条形图的每个 'stack'/类别都是独立的。
我想创建一个统一的工具提示,在同一栏的任何位置显示来自所有类别的相同综合信息。 例如:
- 日期(年):2020
- 计数(总计):2
- 计数'true':1
- 计数'false':1
- % 'true': 50%
这在 Altair 中可行吗? 在我现在的代码和输出下面。
import altair as alt
import pandas as pd
df = pd.DataFrame({
'date': ['20-03-2017', '20-03-2017', '20-03-2018', '21-03-2018', '20-10-2019', '20-03-2019', '1-02-2019', '10-03-2020', '20-06-2020'],
'value': [True, True, True, False, True, False, False, True, False]
})
df['date'] = pd.to_datetime(df['date'])
alt.Chart(df).mark_bar().encode(
x = 'year(date):O',
y = 'count(value)',
color = 'value',
tooltip = ['year(date)', 'count(value)']
)
没有任何超级干净的方法可以做到这一点,因为给定标记的工具提示(例如其中一个条的橙色部分)只能包含与该标记实际关联的值。
因此,要获得您想要的行为,您必须使用 transforms 来计算这些聚合值并将它们与原始数据集连接起来,以便工具提示可以访问它们以获得所需的标记。这是一个例子:
alt.Chart(df).transform_timeunit(
year='year(date)'
).transform_joinaggregate(
count='count(value)',
count_true='sum(value)',
groupby=['year']
).transform_calculate(
count_false = "datum.count - datum.count_true"
).mark_bar(opacity=1).encode(
x='year(date):O',
y='count():Q',
color='value',
tooltip=['year(date):O', 'count:Q', 'count_true:Q', 'count_false:Q']
)