Plotly express 动画:hoverlabel 的更改仅适用于第一帧
Plotly express animation: changes in hoverlabel only applied for the first frame
import pandas as pd
from pandas import Timestamp
import plotly.express as px
df = pd.DataFrame({'continent': {127: 'South America',
128: 'South America',
129: 'South America',
130: 'South America',
131: 'South America'},
'date': {127: Timestamp('2021-03-01 00:00:00'),
128: Timestamp('2021-03-26 00:00:00'),
129: Timestamp('2021-04-20 00:00:00'),
130: Timestamp('2021-05-15 00:00:00'),
131: Timestamp('2021-06-09 00:00:00')},
'total_cases': {127: 20465329.0,
128: 23470911.0,
129: 26544779.0,
130: 29891133.0,
131: 30534015.0}})
fig = px.bar(df, x='continent', y='total_cases', animation_frame=df.date.astype(str),
# hover_data={'animation_frame':False,
# 'continent':False,
# }
)
fig.update_traces(hovertemplate='Date:%{animation_frame}<br>Total Cases:%{y}')
运行 上面的代码输出带有动画滑块的条形图。仅当您不移动滑块时,对悬停标签所做的更改才可见。一旦你这样做并且框架发生变化,默认的 plotly.express
hoverlabel 会重新出现(我认为是因为跟踪更新)。有什么解决办法吗?
编辑: 添加 GIF 以显示问题
这是一个 known issue,在撰写本文时,唯一的解决方案似乎是将以下内容添加到您的设置中:
for f in fig.frames:
f.data[0].update(hovertemplate='Date:%{animation_frame}<br>Total Cases:%{y}')
您还需要保留:
fig.update_traces(hovertemplate='Date:%{animation_frame}<br>Total Cases:%{y}')
如果您不这样做,那么在您 运行 通过按 play
或来回移动滑块的任何动画之前 之前的第一帧仍然会显示这个:
完整代码:
import pandas as pd
from pandas import Timestamp
import plotly.express as px
df = pd.DataFrame({'continent': {127: 'South America',
128: 'South America',
129: 'South America',
130: 'South America',
131: 'South America'},
'date': {127: Timestamp('2021-03-01 00:00:00'),
128: Timestamp('2021-03-26 00:00:00'),
129: Timestamp('2021-04-20 00:00:00'),
130: Timestamp('2021-05-15 00:00:00'),
131: Timestamp('2021-06-09 00:00:00')},
'total_cases': {127: 20465329.0,
128: 23470911.0,
129: 26544779.0,
130: 29891133.0,
131: 30534015.0}})
fig = px.bar(df, x='continent', y='total_cases', animation_frame=df.date.astype(str),
# hover_data={'animation_frame':False,
# 'continent':False,
# }
)
fig.update_traces(hovertemplate='Date:%{animation_frame}<br>Total Cases:%{y}')
for f in fig.frames:
f.data[0].update(hovertemplate='Date:%{animation_frame}<br>Total Cases:%{y}')
fig.show()
import pandas as pd
from pandas import Timestamp
import plotly.express as px
df = pd.DataFrame({'continent': {127: 'South America',
128: 'South America',
129: 'South America',
130: 'South America',
131: 'South America'},
'date': {127: Timestamp('2021-03-01 00:00:00'),
128: Timestamp('2021-03-26 00:00:00'),
129: Timestamp('2021-04-20 00:00:00'),
130: Timestamp('2021-05-15 00:00:00'),
131: Timestamp('2021-06-09 00:00:00')},
'total_cases': {127: 20465329.0,
128: 23470911.0,
129: 26544779.0,
130: 29891133.0,
131: 30534015.0}})
fig = px.bar(df, x='continent', y='total_cases', animation_frame=df.date.astype(str),
# hover_data={'animation_frame':False,
# 'continent':False,
# }
)
fig.update_traces(hovertemplate='Date:%{animation_frame}<br>Total Cases:%{y}')
运行 上面的代码输出带有动画滑块的条形图。仅当您不移动滑块时,对悬停标签所做的更改才可见。一旦你这样做并且框架发生变化,默认的 plotly.express
hoverlabel 会重新出现(我认为是因为跟踪更新)。有什么解决办法吗?
编辑: 添加 GIF 以显示问题
这是一个 known issue,在撰写本文时,唯一的解决方案似乎是将以下内容添加到您的设置中:
for f in fig.frames:
f.data[0].update(hovertemplate='Date:%{animation_frame}<br>Total Cases:%{y}')
您还需要保留:
fig.update_traces(hovertemplate='Date:%{animation_frame}<br>Total Cases:%{y}')
如果您不这样做,那么在您 运行 通过按 play
或来回移动滑块的任何动画之前 之前的第一帧仍然会显示这个:
完整代码:
import pandas as pd
from pandas import Timestamp
import plotly.express as px
df = pd.DataFrame({'continent': {127: 'South America',
128: 'South America',
129: 'South America',
130: 'South America',
131: 'South America'},
'date': {127: Timestamp('2021-03-01 00:00:00'),
128: Timestamp('2021-03-26 00:00:00'),
129: Timestamp('2021-04-20 00:00:00'),
130: Timestamp('2021-05-15 00:00:00'),
131: Timestamp('2021-06-09 00:00:00')},
'total_cases': {127: 20465329.0,
128: 23470911.0,
129: 26544779.0,
130: 29891133.0,
131: 30534015.0}})
fig = px.bar(df, x='continent', y='total_cases', animation_frame=df.date.astype(str),
# hover_data={'animation_frame':False,
# 'continent':False,
# }
)
fig.update_traces(hovertemplate='Date:%{animation_frame}<br>Total Cases:%{y}')
for f in fig.frames:
f.data[0].update(hovertemplate='Date:%{animation_frame}<br>Total Cases:%{y}')
fig.show()