Plotly:如何在绘制列时手动更改图例项?

Plotly: How to manually change the legend items when plotting columns?

我有以下 pandas 数据框,其中包含这些年来两国的人口:

>>>year   pop1            pop2
0   1   1.000000e+08    1.000000e+08
1   2   9.620000e+07    9.970000e+07
2   3   9.254440e+07    9.940090e+07
3   4   8.902771e+07    9.910270e+07
4   5   8.564466e+07    9.880539e+07

我想创建绘图线,以便 y 值将弹出列:

fig = px.line(data, x="year", y="pop1", title='Population')

fig.add_scatter(x=data['year'], y=data['pop2'], mode='lines')

fig.show()

结果如下所示:

我的问题是图例只显示一行,似乎我无法控制它(例如将它从 mtrace 更改为 pop1 和 pop 2)。我已经看到可以选择使用“颜色”,但在绘制列时似乎是不可能的。

我的最终目标是能够控制图例 - 将列名(pop1 和 pop2)作为图例项。

简答:

要使解决方案接近您的原始设置,您可以这样做:

fig = px.line(data, x="year", y="pop1", title='Population')
fig.data[0].name="pop1"
fig.update_traces(showlegend=True)
fig.add_scatter(x=data['year'], y=data['pop2'], mode='lines', name = "pop2")

一些细节:

@TeejayBruno 评论表中的建议将解决您的问题。但是那里描述的方法与您描述的步骤根本不同。我怀疑您首先使用

构建图形是有原因的
fig = px.line(data, x="year", y="pop1", title='Population')

然后使用以下方法添加新的轨迹:

fig.add_scatter(x=data['year'], y=data['pop2'], mode='lines')

所以我想我会阐明为什么图例在第一步后“丢失”,然后如何确保在添加更多痕迹时图例中包含“pop1”步骤 2.


完整答案:


1。为什么缺少 px.line(data, x="year", y="pop1", title='Population')

的图例

对此有一个很好的解释。看看下面的情节。当px.line只拾取到一条痕迹时,它认为图例是多余的,并且信息可以更自然地显示为y-axis的标签。我非常同意情节开发人员在那里所做的决定:

图一

但是,当用户决定通过 fig.add_scatter() 添加轨迹来构建该图形时,这就没有多大意义了。这正是您偶然发现的问题。

2。如何手动修复图例并继续添加痕迹?

当您将 fig = px.line(data, x="year", y=["pop1", "pop2"], title='Population') 与多个 y 类别一起使用时,px.line 明白将所有信息显示为 y-axis 的标签名称不再有意义,并生成如下图绿色圆圈中的图例。并且同时将红圈中的y-axis标签重命名为"value"

另外在幕后发生的是,fig 对象的数据属性被命名为 "pop1""pop2":

<bound method BaseFigure.show of Figure({
    'data': [{'hovertemplate': 'variable=pop1<br>year=%{x}<br>value=%{y}<extra></extra>',
              'legendgroup': 'pop1',
              'line': {'color': '#636efa', 'dash': 'solid'},
              'mode': 'lines',
              'name': 'pop1',
              'orientation': 'v',
              'showlegend': True,
              'type': 'scatter',
              'x': array([1, 2, 3, 4, 5], dtype=int64),
              'xaxis': 'x',
              'y': array([1.000000e+08, 9.620000e+07, 9.254440e+07, 8.902771e+07, 8.564466e+07]),
              'yaxis': 'y'},
             {'hovertemplate': 'variable=pop2<br>year=%{x}<br>value=%{y}<extra></extra>',
              'legendgroup': 'pop2',
              'line': {'color': '#EF553B', 'dash': 'solid'},
              'mode': 'lines',
              'name': 'pop2',
              'orientation': 'v',

其中包含如何根据需要调整图例属性的解决方案:

1. 使用 fig.data[0].name="pop1".

确保第一条轨迹 'name': 'pop1'

2. 将图设置为在图例中显示迹线名称 fig.update_traces(showlegend=True)(图 2.1)。

3. 使用 fig.add_scatter(x=data['year'], y=data['pop2'], mode='lines', name = "pop2")(图 2.2)包含所有连续轨迹的名称。

4. 将 y-axis 标签重命名为您喜欢的名称,例如 fig.update_yaxes(title=dict(text='People')).

图2.1

图2.2

完整代码:

import plotly.graph_objs as go
import plotly.express as px
import pandas as pd

data = pd.DataFrame({'year': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5},
                     'pop1': {0: 100000000.0,
                      1: 96200000.0,
                      2: 92544400.0,
                      3: 89027710.0,
                      4: 85644660.0},
                     'pop2': {0: 100000000.0,
                      1: 99700000.0,
                      2: 99400900.0,
                      3: 99102700.0,
                      4: 98805390.0}})

fig = px.line(data, x="year", y="pop1", title='Population')
#fig = px.line(data, x="year", y=["pop1", "pop2"], title='Population')
fig.data[0].name="pop1"
fig.update_traces(showlegend=True)

fig.add_scatter(x=data['year'], y=data['pop2'], mode='lines', name = "pop2")#
fig.update_yaxes(title=dict(text='People'))
fig.show()