简答:
要使解决方案接近您的原始设置,您可以这样做:
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()