我正在尝试使用Python中的Altair模块创建一个包含20多个数据行的交互式时间序列图。
用于创建我正在查看的形状的数据框的代码在这里:
import numpy as np
import altair as alt
year = np.arange(1995, 2020)
day = np.arange(1, 91)
def gen_next_number(previous, limit, max_reached):
if max_reached:
return np.NAN, True
increment = np.random.randint(0, 10)
output = previous + increment
if output >= 100:
output = 100
max_reached = True
return output, max_reached
def gen_list():
output_list = []
initial = 0
limit = 100
max_reached = False
value = 0
for i in range(1, 91):
value, max_reached = gen_next_number(value, limit, max_reached)
if max_reached:
value = np.NAN
output_list.append(value)
return output_list
df = pd.DataFrame(index = day, columns=year )
for y in year:
data = gen_list()
df[y] = data
df['day'] = df.index
df = df.melt("day")
df = df.dropna(subset=["value"])
我可以使用以下Altair代码来生成初始图,但这并不漂亮:
alt.Chart(df).mark_line().encode(
x='day:N',
color="variable:N",
y='value:Q',
tooltip=["variable:N", "value"]
)
但是当我尝试使用此代码来创建交互式内容时,它会失败:
highlight = alt.selection(type='single', on='mouseover',
fields='variable', nearest=True, empty="none")
alt.Chart(plottable).mark_line().encode(
x='day:N',
color="variable:N",
y=alt.condition(highlight, 'value:Q', alt.value("lightgray")),
tooltip=["variable:N", "value"]
).add_selection(
highlight
)
它失败并显示错误:
TypeError: sequence item 1: expected str instance, int found
有人可以帮我吗?
还可以使图例具有交互性吗?那么将鼠标悬停在一年上方会突出显示一行吗?
答案 0 :(得分:1)
两个问题:
alt.condition
中,您需要提供字段列表,而不是单个字段通过这两个修复程序,您的图表可以工作:
highlight = alt.selection(type='single', on='mouseover',
fields=['variable'], nearest=True, empty="none")
alt.Chart(df).mark_line().encode(
x='day:N',
y='value:Q',
color=alt.condition(highlight, 'variable:N', alt.value("lightgray")),
tooltip=["variable:N", "value"]
).add_selection(
highlight
)
由于选择不会改变z顺序,因此您会发现突出显示的行通常隐藏在其他灰线的后面。如果希望它弹出在前面,可以使用类似于https://stackoverflow.com/a/55796860/2937831
中的方法