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

Posted

技术标签:

【中文标题】Plotly:如何在绘制列时手动更改图例项?【英文标题】:Plotly: How to manually change the legend items when plotting columns? 【发布时间】:2021-02-03 11:17:24 【问题描述】:

这些年来,我有以下两个国家人口的熊猫数据框:

>>>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.legend(('Pop1', 'Pop2'), 'upper left') 吗? @CeliusStingher 我收到错误消息 AttributeError: 'Figure' object has no attribute 'legend' fig = px.line(data, x="year", y=["pop1", "pop2"], title='Population') 应该可以解决您的图例问题。 【参考方案1】:

简答:

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

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')

所以我想我应该阐明为什么在第一步之后“缺少”图例,然后在步骤 2 中添加更多跟踪时如何确保“pop1”包含在图例中.


完整答案:


1。为什么px.line(data, x="year", y="pop1", title='Population') 的图例不见了

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

图一

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

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

当您将 fig = px.line(data, x="year", y=["pop1", "pop2"], title='Population') 与多个 y 类别一起使用时,px.line 明白将所有这些信息显示为 y 轴的标签名称已经没有多大意义,并会生成一个图例,如下图。并且同时,y轴标签重命名为红圈中的"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. 确保'name': 'pop1' 用于使用fig.data[0].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 轴标签重命名为您喜欢使用的任何名称,例如 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()

【讨论】:

以上是关于Plotly:如何在绘制列时手动更改图例项?的主要内容,如果未能解决你的问题,请参考以下文章

Plotly:如何更改图例中显示的线条的大小?

Plotly:如何自定义图例?

如何在 Python 中使用 Plotly Express 仅显示图例的子集(plotly.express,px)?

Plotly:如何更改情节表达图例的背景颜色?

Plotly:使用模板删除图例标题

在条形图上的 Plotly 中更改轴/图例名称