如何解决Altair:创建组合的整体工具提示
我有一个斜率图,其中我标记了前后条件的值(使用 mark_point 和 mark_line,x 轴类型是名义上的)。我还使用 mark_rect 为背景着色(在计算变换中使用图表的宽度/高度)。
现在我想为矩形创建一个整体工具提示(而不是使悬停在斜坡的两个点上)。如何将斜率值汇总到一个工具提示位置(前值、后值)?
我已经开始尝试使用枢轴变换,但它不知道如何将每个图表的参数 (date_time) 的 post 和 pre 值合并到一个工具提示中
示例代码:
import pandas as pd
import altair as alt
from datetime import datetime
#https://vega.github.io/vega/docs/schemes/#redyellowgreen
data = pd.DataFrame({'value_rel': [0.41,0.52,0.39,0.58],'section': ['SECTION','SECTION','SECTION'],'parameter': ['ParaM1','ParaM1','ParaM1'],'date_time': [datetime(2018,4,19),datetime(2019,16),datetime(2018,16)],'value_class': ['medium','medium','heavy','medium'],'dilation': ['PRE','PRE','POST','POST'],'predicted': [3.06,3.04,3.06,3.04],'value': [1.25,1.68,1.21,1.74],'predicted_rel': [1,1,1],'title_de': ['ParaM_1','ParaM_1','ParaM_1'],'title_description_de': ['Parameter 1 %','Parameter 1 %','Parameter 1 %'],'diffs_rel': [None,None,-0.019,0.028],})
pd.set_option('display.max_rows',None)
pd.set_option('display.max_columns',None)
pd.set_option('display.width',None)
pd.set_option('display.max_colwidth',None)
# print(data)
parameter_encode_y = 'value_rel:Q'
slope_chart_width = 180
slope_chart_height = 180
min_y = data['value_rel'].min() * 0.9
max_y = data['value_rel'].max() * 1.1
custom_scale = alt.Scale(domain=[min_y,max_y])
slope_base = alt.Chart(data).encode(
x=alt.X(
'dilation',type='nominal',sort='descending',title=None,axis=None
),y=alt.Y(
parameter_encode_y,axis=None,scale=custom_scale
)
).properties(
width=slope_chart_width,height=slope_chart_height
)
slope_points = slope_base.mark_point(
filled=True,size=150,opacity=1,strokeWidth=1,stroke='black',clip=True
).encode(
color=alt.Color(
'value_class',title='severity'
),tooltip=[alt.Tooltip('value_class',title='Severity '),alt.Tooltip('dilation',title='Pre/Post Param'),alt.Tooltip('value',format='.3',title='Absolute'),alt.Tooltip('predicted',title='Target'),alt.Tooltip('value_rel',format='.1%',title='% of Target'),alt.Tooltip('diffs_rel',title='Change Pre-Post')
],strokeDash=alt.condition(
alt.datum.dilation == 'PRE',alt.value([4,2]),alt.value([])
)
)
slope_line = slope_base.mark_line(
color='black',strokeWidth=1
)
slope_ruler = slope_base.mark_rule(
color="#A6D96A",size=1,clip=True
).encode(
x=alt.X(
'x1c:Q',x2='x2c:Q',y=alt.Y('y1c:Q',axis=None
)
).transform_calculate(
x1c='0',x2c=str(slope_chart_width),y1c='1'
)
columns = sorted(data.columns.unique())
#print(columns)
# data_wide = data.pivot(index='date_time',columns=['dilation'])
#print(data_wide)
#print(data_wide.shape)
slope_background = slope_base.transform_pivot(
'date_time',#groupby=['dilation',],value='dilation',op='values'
).mark_rect(
color='gray',opacity=0.05,clip=True
).encode(
y=alt.Y('y1c:Q',#scale=custom_scale
),y2='y2c:Q',x=alt.X('x1c:Q',axis=None),tooltip=[# alt.Tooltip('value_3:N',title='Absolut 2')
],).transform_calculate(
y1c='0',y2c=str(slope_chart_height),x1c='0',# value_3= f"if(datum.dilation == 'PRE',datum[datum.dilation == 'PRE'].value,datum[datum.dilation == 'POST'].value)"
)
# slope_background
final_slope_chart = (slope_ruler + slope_line + slope_points).resolve_scale(
x='shared',color='shared'
).resolve_axis(
x='shared'
)
final_slope_chart = (slope_background + final_slope_chart).resolve_scale(
y='shared'
).resolve_axis(
y='independent'
)
final_slope_chart = final_slope_chart.facet(
facet=alt.Facet('date_time:T',title='',header=alt.Header(format="%Y-%m-%d",formatType='time')),title=''
)
final_slope_chart
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。