Altair结合多个数据集

时间:2018-09-14 08:04:24

标签: python visualization vega-lite altair

我最近才发现有关 Vega / Vega-Lite Altair 的信息,并将其视为最佳Python绘图工具的真正竞争者。

我目前正在努力的工作是将来自两个数据框的信息绘制到共享一个或两个轴的同一图表中。

我尝试过类似的事情:

plot1 = alt.Chart(df1).mark_point().encode(x = 'time:T', y = [...])[...]
plot2 = alt.Chart(df2).mark_point().encode(x = 'time:T', y = [...])[...]

这行得通,但是它很笨重,而且不是很好。

我遇到了LayerChart对象,但是从文档中我还不清楚如何正确使用它来绘制多个数据集。

  • 有人有这样一个图表的例子吗?
  • 我需要做什么才能获得双y轴?

2 个答案:

答案 0 :(得分:3)

通过将函数中的图表逻辑分开来制作DRYer代码,然后进行迭代。

给予

import pandas as pd
import altair as alt


df0 = pd.DataFrame(dict(times=[1, 2, 3], values=[2, 2, 7]))
df1 = pd.DataFrame(dict(times=[2, 3, 5], values=[3, 9, 8]))
df2 = pd.DataFrame(dict(times=[3, 6, 8], values=[2, 6, 7]))
df3 = pd.DataFrame(dict(times=[6, 7, 9], values=[3, 2, 5]))

代码

def base_chart(df):
    """Return an Altair chart."""
    # Add lengthy chart arguments here
    base = alt.Chart(
        df,
        width=500,
        height=300,
    ).mark_line(
    ).encode(
        x="times", 
        y="values"
    )
    return base


def layer_charts(dfs, chart_func):
    """Return a layered chart."""

    return alt.layer(*[chart_func(df) for df in dfs])

演示

layer_charts([df0, df1, df2, df3], base_chart)

enter image description here

答案 1 :(得分:0)

具有不同数据集的图表可以与Altair documentation中描述的任何机制一起分层。

例如:

import pandas as pd
import altair as alt

df1 = pd.DataFrame({
    'times': [1, 2, 3],
    'values': [1, 5, 4],
})

df2 = pd.DataFrame({
    'times': [2, 3, 4],
    'values': [4, 2, 3],
})

chart1 = alt.Chart(df1).mark_line().encode(x='times', y='values')
chart2 = alt.Chart(df2).mark_line().encode(x='times', y='values')

chart1 + chart2

enter image description here