使用指标注释 altair facet plots

Annotate altair facet plots with metrics

我有以下代码片段来生成数据并将两个小平面维度 (['train','test'], ['type_a','type_b']) 的散点绘制为列和行。

import altair as alt
import numpy as np
import pandas as pd
from scipy.stats import pearsonr

np.random.seed(0)
df = pd.DataFrame(data=np.random.randn(1000, 1), columns=['A'])
df['B'] = df['A'] + np.random.rand(1000)
df['subset'] = 'test'
df.loc[:500, 'subset'] = 'train'
df['type'] = 'type_a'
df.loc[300:700, 'type'] = 'type_b'

r = df.groupby(['subset', 'type']).apply(lambda x: pearsonr(x['A'], x['B'])[0])
r.name = 'correlation'
r = pd.DataFrame(r)
print(r)

alt.Chart(df).mark_point().encode(x='A', y='B', column='subset', row='type')

现在我想用 pandas 中的 groupby 计算的皮尔逊相关性来注释每个方面子图。

有什么办法可以把它放在每个面板的上角甚至标题上(插画师除外)?

谢谢! 最大值

您可以在此处查看如何包含文本注释 。在你的情况下,问题是你有两个不同的数据帧,我 相信 不可能在一个方面有两个不同的帧分层(如果这是错误的,请有人纠正我)。您可以通过先合并到一个框架来解决这个问题:

import altair as alt
import numpy as np
import pandas as pd
from scipy.stats import pearsonr


np.random.seed(0)
df = pd.DataFrame(data=np.random.randn(1000, 1), columns=['A'])
df['B'] = df['A'] + np.random.rand(1000)
df['subset'] = 'test'
df.loc[:500, 'subset'] = 'train'
df['type'] = 'type_a'
df.loc[300:700, 'type'] = 'type_b'

r = df.groupby(['subset', 'type']).apply(lambda x: pearsonr(x['A'], x['B'])[0])
r.name = 'correlation'
r = pd.DataFrame(r)

points = alt.Chart(df.merge(r.reset_index())).mark_point().encode(x='A', y='B')
text = points.mark_text(align='left').encode(
    x=alt.value(20),  # pixels from left
    y=alt.value(20),  # pixels from top
    text='mean(correlation):N'  # taking the mean to reduce to a single value
)

(text + points).facet(column='subset', row='type')

您可以使用 transform_calculate 和 vega 表达式字符串 https://vega.github.io/vega/docs/expressions/.

创建更复杂的字符串