Python 如何在altair中制作分组多条形时间序列图,底部显示日期,在图例或弹出窗口中显示列标签?

Python 如何在altair中制作分组多条形时间序列图,底部显示日期,在图例或弹出窗口中显示列标签?,python,altair,Python,Altair,例如,您可能需要以下数据: DATE,KEY,VALUE 2019-01-01,REVENUE,100 2019-01-01,COST,100.1 ... 绘制为时间序列条形图,条形图之间的空间很小,除日期外没有标签。弹出窗口或图例将显示版本、成本和成本 带有alt.Column、alt.X、alt.Y的基本条形图可以工作,但标签和分组错误。是否可以使列组对应于x轴并隐藏x轴标签 编辑: 最新最佳: import altair as alt import pandas as pd m = 10

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

DATE,KEY,VALUE
2019-01-01,REVENUE,100
2019-01-01,COST,100.1
...
绘制为时间序列条形图,条形图之间的空间很小,除日期外没有标签。弹出窗口或图例将显示版本、成本和成本

带有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
)


另一篇文章,因为我似乎无法将多个图像添加到原始图像中

这是另一种方式与另一个缺陷:酒吧重叠。请注意,日期处理正确,因为这是使用实际轴

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

您可以使用编码和面组合创建分组条形图,还可以调整轴标题和比例以自定义外观。下面是一个examle(在Altair中复制,正如您在评论中提到的):


原始答复:

<>我有困难从你的问题中解析你到底想做什么(在将来,请考虑包括一个代码片段来说明你尝试了什么,并指出为什么结果不够),但是这里有一个条形图的例子,这个条形图具有只有日期的X轴标记,带有显示收入和成本的工具提示和图例:

将altair导入为alt
作为pd进口熊猫
data=pd.DataFrame({
“日期”:pd.日期范围('2019-01-01',频率='D',周期=4),
“收入”:[10020015050],
“成本”:[150、125、75、80],
}).melt('DATE',var\u name='KEY',value\u name='value')
alt.Chart(数据).mark_bar().编码(
年月日,
y='VALUE',
color='KEY',
工具提示=[“键”,“值”],
)

嘿!是的,我也到了这个阶段,但还没有弄清楚如何从altair本身拆下条带。这个例子也很相关:所以这个例子基本上就是我想要的:我怀疑这与可能尚未通过altair公开的较低级别构造有关。我已经用我最新的最佳版本进行了更新。唯一剩下的事情就是弄清楚是否有一个记号标签优化器。。。例如,在拥挤时在x轴上放置较少的日期。不过我怀疑这取决于渲染器。如果我没有弄错的话,它看起来像altair.HeaderConfig目前没有labelOverlap。可能它不像轴心一样工作。这个:似乎就是问题所在。但在vega-lite中可能不受支持。总的来说,如果日期范围轴与标准条形图配合得很好,那么使用这种方式感觉是错误的。标准条形图唯一的缺点是在未处理的情况下条形图重叠。。。有没有办法让酒吧系列不重叠?
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
)