使用Altair,我想创建一个多面散点图,其中每个面板中的X和Y轴是相同的,但在整个面板中也是独立的(即,面板1的X和Y轴都具有边界[0,1] ,并且面板2的X和Y轴都有边界[-1,0]。需要动态选择每个面板的边界,以便它们显示在每个面板中可见的整个数据范围。
我在这里的想法是用另外一组点(min(X,Y),min(X,Y))和(max(X,Y),max(X,Y))扩充原始数据集min()和max()函数按构面变量分组;换句话说,对于每个面板,创建两个附加点,一个将位于左下角,另一个将位于右上角。这很好用,但是我不知道的是如何控制这些点的不透明度,使它们不可见。在下面的代码示例中,当df
时,我需要使ptype=='limits'
中的值不可见。
import altair as alt
import pandas as pd
df = pd.concat([
pd.DataFrame({'group': 'A', 'x': [1,2,3,4,5], 'y': [3,4,5,7,8]}),
pd.DataFrame({'group': 'B', 'x': [0,2,3,4,6], 'y': [3,4,5,7,20]})
])
limits = df.groupby('group').agg(['min','max']).reset_index().melt('group').groupby('group')
limits = pd.concat([
limits.max().reset_index().rename(columns={'value': 'x'}),
limits.min().reset_index().rename(columns={'value': 'x'})
]).assign(y=lambda x: x['x'])[['group','x','y']]
df = pd.concat([df.assign(ptype='Original'), limits.assign(ptype='limits')])
chart = alt.Chart(df).mark_point().encode(
x='x',
y='y',
column='group'
).resolve_scale(
y='independent',
x='independent'
)
我想做的另一件事是在每个面板上创建一条45度的线。如果没有任何方面,我想我可以创建一个分层图表,在其中将线形图分层放置在散点图的顶部,并将其数据源设置为limits
DataFrame。但是,我的印象是,使用多面图表无法实现这种类型的分层。