Altair:创建组合的整体工具提示

如何解决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

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?