如何在 Altair 中突出显示多线图 python
How to highlight multiline graph in Altair python
我正在尝试使用 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
有人可以帮我吗?
另外,是否可以让图例具有交互性?所以将鼠标悬停在一年上会突出显示一条线?
两期:
- 在
alt.condition
中,您需要提供字段列表而不是单个字段
- y 编码不接受条件。我怀疑你是想把条件放在颜色上。
通过这两个修复,您的图表可以正常工作:
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 顺序,您会发现突出显示的线通常隐藏在其他灰色线后面。如果你想让它在前面弹出,你可以使用类似于
中的方法
我想创建一个类似于上面的多线图
- 没有传说
- 无需悬停或鼠标悬停。
只想传递一个 highlighted_value 并突出显示一行。
我修改了代码,因为我不太熟悉“选择”的正确用法,并且认识到获得我想要的结果有点笨拙。
有更简洁的方法吗?
highlight = alt.selection(type='single', on='mouseover',
fields=['variable'], nearest=True, empty="none")
background = alt.Chart(df[df['variable'] != 1995]).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
)
foreground = alt.Chart(df[df['variable'] == 1995]).mark_line(color= "blue").encode(
x='day:N',
y='value:Q',
color=alt.Color('variable',legend=None)
)
foreground + background
我正在尝试使用 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
有人可以帮我吗?
另外,是否可以让图例具有交互性?所以将鼠标悬停在一年上会突出显示一条线?
两期:
- 在
alt.condition
中,您需要提供字段列表而不是单个字段 - y 编码不接受条件。我怀疑你是想把条件放在颜色上。
通过这两个修复,您的图表可以正常工作:
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 顺序,您会发现突出显示的线通常隐藏在其他灰色线后面。如果你想让它在前面弹出,你可以使用类似于
中的方法我想创建一个类似于上面的多线图
- 没有传说
- 无需悬停或鼠标悬停。
只想传递一个 highlighted_value 并突出显示一行。
我修改了代码,因为我不太熟悉“选择”的正确用法,并且认识到获得我想要的结果有点笨拙。
有更简洁的方法吗?
highlight = alt.selection(type='single', on='mouseover',
fields=['variable'], nearest=True, empty="none")
background = alt.Chart(df[df['variable'] != 1995]).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
)
foreground = alt.Chart(df[df['variable'] == 1995]).mark_line(color= "blue").encode(
x='day:N',
y='value:Q',
color=alt.Color('variable',legend=None)
)
foreground + background