我正尝试在绘图饼图中添加自定义文本。
我希望最大的份额被标记为Rank 1,第二大Rank 2,依此类推...
有没有办法使用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=("Rank %i" % 1))])
fig.show()

发布于 2020-12-03 12:58:00
您需要此函数:
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 resimport plotly.graph_objects as go
import numpy as np
labels = list('ABCD')
values = [25,45,13,78]
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()尽可能多地使用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()
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()发布于 2020-12-03 12:57:19
将数组传递给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()https://stackoverflow.com/questions/65120048
复制相似问题