我正在尝试在悬停模板中包含其他数据,类似于此Plotly:在 hovertemplate 中包含其他数据,但在 Pandas 上使用 Plotly 绘图后端。
我有两个 2D Pandas 数据框,第一个是国家和年份的人口,第二个是国家和年份的人口增长率,使用以下代码生成。
import pandas as pd
pd.options.plotting.backend = 'plotly'
df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/gapminderDataFiveYear.csv')
df_pop = df.pivot_table(index='year', columns='country', values='pop').copy()
df_pct_growth = df_pop.pct_change().fillna(0) * 100
我将每个国家的人口可视化如下。如您所见,悬停文本只有 country、year 和 population。我想将 df_pct_growth 中的 % growth 添加到悬停文本中。有谁知道怎么做?
df_pop.plot(labels=dict(value='Population'))
我还没有看到任何将自定义数据与“Plotly”后端一起使用的示例。查看图形结构,我认为可以添加自定义数据并更新悬停模板。我添加的代码会将国家名称设置为 meta。 (可以提供与自定义数据相同的功能)并将按国家/地区的增长率列数据设置为自定义数据。悬停模板是通过添加增长率字段来完成的。
import plotly.express as px
import pandas as pd
pd.options.plotting.backend = 'plotly'
df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/gapminderDataFiveYear.csv')
df_pop = df.pivot_table(index='year', columns='country', values='pop').copy()
df_pct_growth = df_pop.pct_change().fillna(0) * 100
fig = df_pop.plot(labels=dict(value='Population'))
for i,country in enumerate(df.country.unique()):
fig.data[i]['meta'] = country
fig.data[i]['customdata'] = df_pct_growth.loc[:,country].to_frame().values
fig.data[i]['hovertemplate'] = 'country: %{meta}<br>year: %{x}<br>population: %{y:,}<br>growth: %{customdata[0]:.2f}<extra></extra>'
fig.show()
无需后端的 Plotly 代码
import plotly.graph_objects as go
fig = go.Figure()
for country in df.country.unique():
dff = df.query('country == @country')
fig.add_trace(go.Scatter(x=dff['year'],
y=dff['pop'],
mode='lines',
name=country,
meta=country,
customdata=df_pct_growth.loc[:,country].to_frame().values,
hovertemplate=
'country: %{meta}<br>' +
'year: %{x}<br>' +
'population: %{y:,}<br>' +
'growth: %{customdata[0]:.2f}' +
'<extra></extra>'
))
fig.show()