【问题标题】:Vega-Lite - One plot for multiple datasetsVega-Lite - 多个数据集的一张图
【发布时间】:2021-02-02 19:11:27
【问题描述】:

我正在为 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)做类似的事情。 我知道我可以做两个单独的图,然后将一个相加。我的问题主要是关于如何让传奇工作,因为要获得传奇,通常需要另一个领域 例如“颜色”,指向数据框中的另一个字段。

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

【问题讨论】:

    标签: julia legend altair vega-lite


    【解决方案1】:

    您可以利用这样一个事实,即在复合图表中,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)
    

    【讨论】:

    • 非常感谢杰克!我不知道您是如何在回答有关 Vega-Lite 的问题时如此无所不在!
    猜你喜欢
    • 2016-10-15
    • 2019-06-02
    • 1970-01-01
    • 2020-03-02
    • 2019-10-18
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    相关资源
    最近更新 更多