如何在Altair中创建分组的多条时间序列图表,底部的DATE和图例或弹出窗口中的Column标签?

时间:2019-07-18 13:55:23

标签: python altair

例如,您可能需要以下数据:

DATE,KEY,VALUE
2019-01-01,REVENUE,100
2019-01-01,COST,100.1
...

被绘制为时间序列条形图,条形图之间的空间很小,除了日期以外没有标签。弹出窗口或图例会告诉您REV,COST列是什么。

具有alt.Column,alt.X,alt.Y的基本条形图有效,但标签和分组错误。是否可以使“列”组与x轴相对应并隐藏X轴标签?

编辑:

最好的:

import altair as alt
import pandas as pd
m = 100
data = pd.DataFrame({
    'DATE': pd.date_range('2019-01-01', freq='D', periods=m),
    'REVENUE': np.random.randn(m),
    'COST': np.random.randn(m),
}).melt('DATE', var_name='KEY', value_name='VALUE')

bars = alt.Chart(data, width=10).mark_bar().encode(
    y=alt.Y('VALUE:Q', title=None),
    x=alt.X('KEY:O', axis=None),
    color=alt.Color('KEY:O', scale=alt.Scale(scheme='category20')),
    tooltip=['DATE', 'KEY', 'VALUE'],
)

(bars).facet(
    column=alt.Column(
        'yearmonthdate(DATE):T', header=alt.Header(labelOrient="bottom",
                                                   labelAngle=-45,
                                                   format='%b %d %Y'
                                                  )
        ),
    align="none",
    spacing=0,
).configure_header(
    title=None
).configure_axis(
    grid=False
).configure_view(
    strokeOpacity=0
)

update


另一篇文章,因为我似乎无法在原始文章中添加多张图片。

这是另一种缺陷的方式:条形重叠。请注意,但是日期已正确处理,因为它使用的是实际轴。

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

m = 250
data = pd.DataFrame({
    'DATE': pd.date_range('2019-01-01', freq='D', periods=m),
    'REVENUE': np.random.randn(m),
    'COST': np.random.randn(m),
}).melt('DATE', var_name='KEY', value_name='VALUE')

# Create a selection that chooses the nearest point & selects based on x-value
nearest = alt.selection(type='single', nearest=True, on='mouseover',
                        fields=['REVENUE'], empty='none')

# The basic line
line = alt.Chart(data).mark_bar(interpolate='basis').encode(
    x='DATE:T',
    y='VALUE:Q',
    color='KEY:N'
).configure_bar(opacity=0.5)

line

enter image description here

1 个答案:

答案 0 :(得分:1)

您可以使用编码和构面的组合来创建分组的条形图,还可以调整轴标题和比例以自定义外观。这是一个例子(如您在评论中提到的,在Altair中复制https://vega.github.io/editor/#/examples/vega/grouped-bar-chart

import altair as alt
import pandas as pd

data = pd.DataFrame([
    {"category":"A", "position":0, "value":0.1},
    {"category":"A", "position":1, "value":0.6},
    {"category":"A", "position":2, "value":0.9},
    {"category":"A", "position":3, "value":0.4},
    {"category":"B", "position":0, "value":0.7},
    {"category":"B", "position":1, "value":0.2},
    {"category":"B", "position":2, "value":1.1},
    {"category":"B", "position":3, "value":0.8},
    {"category":"C", "position":0, "value":0.6},
    {"category":"C", "position":1, "value":0.1},
    {"category":"C", "position":2, "value":0.2},
    {"category":"C", "position":3, "value":0.7}
])

text = alt.Chart(data).mark_text(dx=-10, color='white').encode(
    x=alt.X('value:Q', title=None),
    y=alt.Y('position:O', axis=None),
    text='value:Q'
)

bars = text.mark_bar().encode(
    color=alt.Color('position:O', legend=None, scale=alt.Scale(scheme='category20')),
)

(bars + text).facet(
    row='category:N'
).configure_header(
    title=None
)

enter image description here


原始答案:

我无法从您的问题中准确地解析出您要尝试做的事情(以后请考虑提供一个代码片段,以展示您的尝试并指出为什么结果不够充分),但这是一个示例带有这种形式的数据的条形图,其x轴仅用日期标记,并带有工具提示和图例,显示收入和成本:

import altair as alt
import pandas as pd

data = pd.DataFrame({
    'DATE': pd.date_range('2019-01-01', freq='D', periods=4),
    'REVENUE': [100, 200, 150, 50],
    'COST': [150, 125, 75, 80],
}).melt('DATE', var_name='KEY', value_name='VALUE')

alt.Chart(data).mark_bar().encode(
    x='yearmonthdate(DATE):O',
    y='VALUE',
    color='KEY',
    tooltip=['KEY', 'VALUE'],
)

enter image description here