Vega-Lite - 多个数据集的一个图

Vega-Lite - One plot for multiple datasets

我正在为 Julia 开发一个包,目的是使用 Vega-Lite 作为后端进行快速绘图。 熟悉 Matplotlib 的人都知道,使用不同的向量集并将所有向量绘制在同一张图中,每个向量都有自己的标签是很常见的。例如:

x = range(0,10)
y = np.random.rand(10)
w = range(0,5)
z = np.random.rand(5)
plt.plot(x,y,label = 'y')
plt.plot(w,z,label = 'z')
plt.legend()

我想知道如何使用 Vega-Lite(或 Altair)做类似的事情。 我知道我可以做两个单独的情节,然后将一个叠加在另一个之上。我的问题主要是关于如何让传说发挥作用,因为要获得传说,通常需要另一个领域 例如“颜色”,指向数据框中的另一个字段。

我看过类似的帖子,但处理的是从不同列发布数据的问题。这种情况的答案基本上是使用折叠变换。但在我的问题中,这不太有效,因为我更感兴趣的是从两个不同的图开始,可能使用两个不同的数据集,所以“合并”数据集不是一个好的解决方案。

您可以利用在复合图表中,Vega-Lite 默认使用共享比例这一事实。如果您为每个层分配颜色、形状、strokeDash 等唯一值,将自动生成适当的图例。

这是一个例子,使用 Altair 生成 Vega-Lite 规范:

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

x = np.linspace(0, 10)

df1 = pd.DataFrame({
    'x': x,
    'y': np.sin(x)
})
df2 = pd.DataFrame({
    'x': x,
    'y': np.cos(x)
})

chart1 = alt.Chart(df1).transform_calculate(
    label='"sine"'
).mark_line().encode(
    x='x',
    y='y',
    color='label:N'
)

chart2 = alt.Chart(df2).transform_calculate(
    label='"cosine"'
).mark_line().encode(
    x='x',
    y='y',
    color='label:N'
)

alt.layer(chart1, chart2)