如何突出显示 Altair 热图中的列?

如何解决如何突出显示 Altair 热图中的列?

我想将读者的注意力引导到热图中的某些列(或行和列)上,同时仍保留完整的上下文。

我可以使用 alt.condition 来改变颜色和不透明度。两者都在某种程度上起作用。但是不透明度的变化以与值变化类似的方式可视化。使用不同的颜色会改变对价值观的看法。我想做的是在要突出显示的连续列周围放置黄色或红色边框。

这就是我现在所拥有的。还有其他想法吗?

    import altair as alt
    alt.data_transformers.disable_max_rows()
    
    def create_att_chart(df,keys_to_highlight=[],width=150,height=150,title=None,labels_x=True,labels_y=True):
        
        properties = {}
        if title:  
            properties['title'] = title  
         
        if width:  properties['width']  = width
        if height: properties['height'] = height
            
        chart = alt.Chart(df).mark_rect().encode(
            x=alt.X('k:N',sort=None,axis=alt.Axis(labels=labels_x,ticks=False),title=None),y=alt.Y('q:N',axis=alt.Axis(labels=labels_y,opacity=alt.Opacity('a:Q',legend=None),column=alt.Column('h:N',header=alt.Header(labels=False),spacing=0.),row=   alt.Row(   'l:N',spacing=5.))
            
        if keys_to_highlight:
            chart = chart.encode(
                color=alt.condition(
                    alt.Predicate(alt.FieldOneOfPredicate(field='k',oneOf=keys_to_highlight)),alt.value('orange'),alt.value('blue')))
        else:
            chart = chart.encode(color=alt.value('blue'))
        
        return chart.properties(**properties)

    [..]

    ((create_att_chart(df_pt,['sage','##maker'],title='Pre-Trained') | create_att_chart(df_ft,title='Fine-Tuned',labels_y=False)).properties(padding=0))

Screenshot

解决方法

您可以尝试使用 stroke 编码的条件而不是 color,但我认为这会给您在每个框周围画笔,这可能不是您想要的。相反,您可以在文档中的此示例中使用 mark_rulemark_rect

import altair as alt
import numpy as np
import pandas as pd

# Compute x^2 + y^2 across a 2D grid
x,y = np.meshgrid(range(-5,5),range(-5,5))
z = x ** 2 + y ** 2
# Convert this grid to columnar data expected by Altair
source = pd.DataFrame({'x': x.ravel(),'y': y.ravel(),'z': z.ravel()})

heatmap = alt.Chart(source).mark_rect().encode(
    x='x:O',y='y:O',color=alt.Color('z:Q',scale=alt.Scale(scheme='blues')))

现在添加规则:

rule1 = alt.Chart(df).mark_rule(stroke='orange',strokeWidth=2).encode(x=alt.value(20))
rule2 = alt.Chart(df).mark_rule(stroke='orange',strokeWidth=2).encode(x=alt.value(60))
heatmap + rule1 + rule2

enter image description here

顶级规则可能更具吸引力/优雅,如果需要,您可以使用 mark_text 在其上方添加文本:

rule1 = alt.Chart(df).mark_rule(stroke='orange',strokeWidth=3).encode(
    y=alt.value(-5),x=alt.value(20),x2=alt.value(60))
heatmap + rule1

enter image description here

mark_rect 有效,但在正方形中间添加线条,因为比例是有序的,并且定量 mark_rect 弄乱了轴:

df = pd.DataFrame({'x': [0],'x2': [3]})
box = alt.Chart(df).mark_rect(color='',stroke='orange',strokeWidth=2).encode(
    x='x:O',x2=alt.X2('x2:O',title='x'))
heatmap + box

enter image description here

如果您尝试在它们之间添加线,则会创建新的顺序轴标记。您可以滥用这一点并通过分离使线条变白以突出显示,但轴上的刻度线仍然存在,因此您必须使用 lablExpr 或类似方法将它们删除。

df = pd.DataFrame({'x': [0.5],'x2': [3.5]})
box = alt.Chart(df).mark_rect(color='',stroke='white').encode(
    x='x:O',title='x'))
(heatmap + box).configure_view(stroke=None)

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元字符(。)和普通点?