如何在 plotly 中添加条形图上方的百分比差异

How to add difference in percentage above bars in plotly

基本上,我在 python 中的 plotly 教程中有以下代码:

import plotly.graph_objects as go
animals=['giraffes', 'orangutans', 'monkeys']

fig = go.Figure(data=[
    go.Bar(name='SF Zoo', x=animals, y=[20, 14, 23]),
    go.Bar(name='LA Zoo', x=animals, y=[12, 18, 29])
])
# Change the bar mode
fig.update_layout(barmode='group')
fig.show()

此代码生成一个简单的条形图,按类型(动物)和颜色(“SF Zoo”、“LA Zoo”)分隔。我想在红条上面加一个百分比,代表红条值和对应的blue/purple之间的百分比差值,如下图:

这个应该怎么写对应的代码?

编辑:我只想为红色条添加百分比,而不是在红色条上,而是在它们上方,如图所示

为了实现这一点,您应该拥有 y 值的列表以及百分比将超出 go.bar 的列表,如下所示:

y1 = [20, 14, 23]
y2 = [12, 18, 29]
c = []

为了计算百分比(向下舍入,您可以通过将 math.floor() 替换为 math.ceil() 来更改为向上舍入),您可以使用:

i = 0

while i < len(y1):
    i = i
    if y1[i] > y2[i]:
        q = y1[i]-y2[i]
        c.append( '-' + str(math.floor(q/y1[i]*100)) + '%')
        i=i+1
    if y1[i] < y2[i]:
        t = y2[i]-y1[i]
        c.append('+' + str(math.floor(t/y1[i]*100)) + '%')
        i=i+1

这只是找到 y 值之间的差异,然后除以您要从中找到百分比的原始值,将其乘以 100,使其成为百分比。

从那里您应该将 y-values 设置为等于您之前设置的列表,同时将文本设置为等于百分比列表 c。您必须做的另一件事是将 textposition 设置为外部,因为默认值为 none.

fig = go.Figure(data=[
    go.Bar(name='SF Zoo', x=animals, y=y1),
    go.Bar(name='LA Zoo', x=animals, y=y2, text=c, textposition='outside')
])

# Change the bar mode
fig.update_layout(barmode='group')
fig.show()

完整代码如下所示:

import plotly.graph_objects as go
import math

y1 = [20, 14, 23]
y2 = [12, 18, 29]

animals=['giraffes', 'orangutans', 'monkeys']

c = []

i = 0

while i < len(y1):
    i = i
    if y1[i] > y2[i]:
        q = y1[i]-y2[i]
        c.append( '-' + str(math.floor(q/y1[i]*100)) + '%')
        i=i+1
    if y1[i] < y2[i]:
        t = y2[i]-y1[i]
        c.append('+' + str(math.floor(t/y1[i]*100)) + '%')
        i=i+1
print(c)

fig = go.Figure(data=[
    go.Bar(name='SF Zoo', x=animals, y=y1),
    go.Bar(name='LA Zoo', x=animals, y=y2, text=c, textposition='outside')
])

# Change the bar mode
fig.update_layout(barmode='group')
fig.show()

输出的图如下所示:

由于您正在计算 SF 和 LA 值之间的百分比变化,因此将 SF 和 LA 值存储在单独的列表中,然后计算每个值之间的百分比变化并将它们存储在另一个列表中是有意义的。

然后您可以将此列表传递给第二个 go.Bar 对象的 text 参数,以确保注释仅显示在每组分组柱的第二个柱上方,以及设置文字大小和颜色。可以使用另一个带条件的列表推导式,将 + 符号添加到任何正的百分比变化中。

import plotly.graph_objects as go
animals=['giraffes', 'orangutans', 'monkeys']

SF_zoo_counts = [20, 14, 23]
LA_zoo_counts = [12, 18, 29]

## calculate percentage change of an animal from SF to LA
LA_SF_percent_change = [100*(LA_count - SF_count) / SF_count for SF_count, LA_count in zip(SF_zoo_counts, LA_zoo_counts)]

## pass the text to the second graph_object only
fig = go.Figure(data=[
    go.Bar(name='SF Zoo', x=animals, y=SF_zoo_counts),
    go.Bar(name='LA Zoo', x=animals, y=LA_zoo_counts, 
        text=[f"+{percent_change:.0f}%" if percent_change > 0 else f"{percent_change:.0f}%" 
            for percent_change in LA_SF_percent_change ],
        textposition='outside',
        textfont_size=18,
        textfont_color='red'
        )
])
# Change the bar mode
fig.update_layout(barmode='group')
fig.show()