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:如何在绘制列时手动更改图例项?的主要内容,如果未能解决你的问题,请参考以下文章