2 回答

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超6個(gè)贊
如果我正確理解您的問題,您希望更改圖例中顯示的內(nèi)容,而不更改數(shù)據(jù)源中的名稱??赡苡懈鼉?yōu)雅的方法可以做到這一點(diǎn),但我已經(jīng)組合了一個(gè)自定義函數(shù)newLegend(fig, newNames)
來為您完成此任務(wù)。
因此,對于這樣的數(shù)字:
...跑步:
fig = newLegend(fig = fig, newNames = {'Australia':'Australia = Dangerous', 'New Zealand' : 'New Zealand = Peaceful'})
...會給你:
我希望這就是您正在尋找的。如果沒有,請隨時(shí)告訴我!
完整代碼:
import plotly.express as px
df = px.data.gapminder().query("continent == 'Oceania'")
fig = px.pie(df, values='pop', names='country')
fig.update_traces(textposition='inside')
fig.update_layout(uniformtext_minsize=12, uniformtext_mode='hide')
def newLegend(fig, newNames):
for item in newNames:
for i, elem in enumerate(fig.data[0].labels):
if elem == item:
fig.data[0].labels[i] = newNames[item]
return(fig)
fig = newLegend(fig = fig, newNames = {'Australia':'Australia = Dangerous',
'New Zealand' : 'New Zealand = Peaceful'})
fig.show()
編輯 1:來自 OP 的數(shù)據(jù)樣本示例
您的數(shù)據(jù)面臨的挑戰(zhàn)是genders屬于類型integer而不是類型string。因此,自定義函數(shù)嘗試將一種類型的元素替換為另一種類型的元素。我通過一次性替換包含標(biāo)簽的整個(gè)數(shù)組來解決這個(gè)問題,而不是逐個(gè)元素地操作它。
陰謀:
完整代碼:
import pandas as pd
import plotly.express as px
import numpy as np
# custom function to change labels
def newLegend(fig, newNames):
newLabels = []
for item in newNames:
for i, elem in enumerate(fig.data[0].labels):
if elem == item:
#fig.data[0].labels[i] = newNames[item]
newLabels.append(newNames[item])
fig.data[0].labels = np.array(newLabels)
return(fig)
'''
Pandas DataFrame:
'''
users_genders = pd.DataFrame({'0': {0: 1, 1: 2},
'802420': {0: 246049, 1: 106}})
users_genders = pd.DataFrame({'gender':[0,1,2],
'count_genders': [802420, 246049, 106]})
''' Pie Chart Viz '''
gender_distribution = px.pie(users_genders,
values='count_genders',
names='gender',
color_discrete_map={'0': 'blue',
'1': 'red',
'2': 'green'},
title='Gender Distribution <br>'
'between 2006-02-16 to 2014-02-20',
hole=0.35)
gender_distribution.update_traces(textposition='outside',
textinfo='percent+label',
marker=dict(line=dict(color='#000000',
width=4)),
pull=[0.05, 0, 0.03],
opacity=0.9,
# rotation=180
)
gender_distribution.update_layout(legend=dict({'traceorder': 'normal'}
# ticks='inside',
# tickvals=[0, 1, 2],
# ticktext=["0 - Female",
# "1 - Male",
# "2 - Undefined"],
# dtick=3
),
legend_title_text='User Genders')
# custom function set to work
gender_distribution=newLegend(gender_distribution, {0:"0 - Female",
1:"1 - Male",
2: "2 - Undefined"})
gender_distribution.show()

TA貢獻(xiàn)1795條經(jīng)驗(yàn) 獲得超7個(gè)贊
newnames = {'0': 'zero', '1': 'one', '2': 'two'}
fig.for_each_trace(lambda t: t.update(
labels=[newnames[label] for label in t.labels]
)
添加回答
舉報(bào)