Python 打印饼图中的自定义文本标签

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

我正在尝试将自定义文本添加到绘图饼图中

我希望最大的份额被标记为排名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=("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()