使用指标注释 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/.
创建更复杂的字符串
我有以下代码片段来生成数据并将两个小平面维度 (['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')
有什么办法可以把它放在每个面板的上角甚至标题上(插画师除外)?
谢谢! 最大值
您可以在此处查看如何包含文本注释
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/.