我正在练习使用Python在Plotly Express中构建饼图。
这就是我制作的饼图;
此图表是根据文件创建的,该文件包含名为
gender
,其值为[0, 1, 2]
count_genders
,其值为[total_count_0, total_count_1, total_count_2]
我打算在这些值上添加一些说明;例如
0 - female
1 - male
2 - undefined
这是我目前遇到的问题。
如果我没记错,是否要更改图例中的标签(至少在Choropleth映射中),可以操纵位于ticks
栏中的colorscale
。通过操作它们,您可以重命名有关数据的标签。因此,我想知道您是否可以在饼图中做同样的事情?
此图的当前代码:
import pandas as pd
import plotly.express as px
'''
Pandas DataFrame:
'''
users_genders = pd.DataFrame({'gender': {0: 0, 1: 1, 2: 2},
'count_genders': {0: 802420, 1: 246049, 2: 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')
gender_distribution.show()
我试图将ticks
中的update_layout
添加无济于事。它返回有关错误参数的错误消息。有人可以帮我解决这个问题吗?
编辑1 :如果不清楚,我想知道是否可以修改图例中显示的值而不更改文件中的原始值。非常感谢您抽空抽出宝贵的时间来帮助我解决此问题!
编辑2 :添加代码的导入和其他先前的详细信息,删除Dropbox链接。
答案 0 :(得分:1)
如果我正确理解了您的问题,那么您想更改图例中显示的内容而不更改数据源中的名称。可能有更优雅的方法,但是我整理了一个自定义函数newLegend(fig, newNames)
,它将为您完全做到这一点。
所以有这样一个数字:
...正在运行:
fig = newLegend(fig = fig, newNames = {'Australia':'Australia = Dangerous',
'New Zealand' : 'New Zealand = Peaceful'})
...会给您:
我希望这是您想要的。不要犹豫,让我知道!
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()
数据面临的挑战是genders
的类型为integer
,而不是string
。因此,自定义函数尝试将一种类型的元素替换为另一种类型的元素。我已经解决了这一问题,只需一次性替换掉包含标签的整个数组,而不是逐个元素地对其进行操作。
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()