Python 打印饼图中的自定义文本标签
我正在尝试将自定义文本添加到绘图饼图中 我希望最大的份额被标记为排名1,第二大的排名2,依此类推 有没有办法使用Python 打印饼图中的自定义文本标签,python,plotly,Python,Plotly,我正在尝试将自定义文本添加到绘图饼图中 我希望最大的份额被标记为排名1,第二大的排名2,依此类推 有没有办法使用textmplate或其他方法来实现这一点 import plotly.graph_objects as go labels = list('ABCD') values = [25,45,13,78] fig = go.Figure(data=[go.Pie(labels=labels, values=values, texttemplate
textmplate
或其他方法来实现这一点
import plotly.graph_objects as go
labels = list('ABCD')
values = [25,45,13,78]
fig = go.Figure(data=[go.Pie(labels=labels, values=values,
texttemplate=("Rank %i" % 1))])
fig.show()
将数组传递给texttemplate有助于
import plotly.graph_objects as go
labels = list('ABCD')
values = [25,45,13,78]
fig = go.Figure(data=[go.Pie(labels=labels, values=values,
texttemplate=([4,2,3,'Rank 1']))])
fig.show()
您需要此功能:
def get_ranks(lst, begin_with_one=False):
srtd = sorted(lst, reverse=True)
res = [srtd.index(x) for x in lst]
return [x + 1 for x in res] if begin_with_one else res
尽可能多地使用Python3中的f字符串-它们非常方便
由于这只适用于唯一的列表元素,因此我创建了一个更好的索引评估器:
def map_to_index(lst1, lst2):
"""Return lst1 as indexes of lst2"""
dct = {}
for i, x in enumerate(lst2):
dct[x] = dct.get(x, []) + [i]
indexes = []
for x in lst1:
indexes.append(dct[x][0])
if len(dct[x]) > 0:
dct[x] = dct[x][1:]
return indexes
以及改进的get_ranks()
:
然后,它还与:
import plotly.graph_objects as go
import numpy as np
labels = list('ABCDEF')
values = [25,45,13,78,45,78] # with elements of same value
fig = go.Figure(data=[go.Pie(labels=labels, values=values,
texttemplate=[f"Rank {x}" for x in get_ranks(values, begin_with_one=True)])])
fig.show()
在
get_ranks()
中,您可以执行srtd=sorted(lst,reverse=True)
保存创建多个列表的操作。@TomMyddeltyn Yes True!但问题是,它只适用于唯一的值…所以,现在我编写了一个改进的版本,当值列表中的几个元素具有相同的值时,它也可以工作。
def get_ranks(lst, begin_with_one=False):
srtd = sorted(lst, reverse=True)
res = map_to_index(lst, srtd)
return [x + 1 for x in res] if begin_with_one else res
import plotly.graph_objects as go
import numpy as np
labels = list('ABCDEF')
values = [25,45,13,78,45,78] # with elements of same value
fig = go.Figure(data=[go.Pie(labels=labels, values=values,
texttemplate=[f"Rank {x}" for x in get_ranks(values, begin_with_one=True)])])
fig.show()