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()
我有以下 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()