分类分组条形图中的形状定位

Shape positioning in categorical grouped bar chart

如何将下面分类条形图中的形状放在指定SF动物园长颈鹿数量的条形中间(如附图中洋红色所示)?

import plotly.graph_objects as go
import plotly.express as px
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')

# Shape
fig.add_trace(go.Scatter(x=['giraffes', 'giraffes', 'orangutans', 'orangutans'],
                         y=[21, 25, 25, 16],
                         fill=None, mode="lines", line=dict(color='rgba(0,0,0,1)',width=2),
                         showlegend=False
                        )
             )

    
fig.show()

正如@Maximilian Peters 指出的那样,没有一种很好的方法可以在 分类坐标 .

之间引用任意数量的点

你能做的最好的事情是将 xref 设置为 paper,这意味着 x 轴被缩放到 0 到 1 之间。然后你必须猜测并检查 x-坐标应该排列在你想要的地方。由于您的 y 轴是数字,您可以直接引用您喜欢的 y 值。经过一些尝试和错误后,在 (0.10, 20)、(0,10, 25)、(0.44, 25)、(0.44, 14) 之间画线可以使您非常接近所需的注释。

这绝对是 hacky,如果您添加更多条或以任何方式更改条的宽度,则无法推广。

import plotly.graph_objects as go
import plotly.express as px
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')

# Shape composed of three lines, looping through coordinates
x_coords = [0.10, 0.10, 0.44, 0.44]
y_coords = [20, 25, 25, 14]
for i in range(1,len(x_coords)):
    fig.add_shape(
        type="line",
        xref="paper",
        x0=x_coords[i-1], 
        y0=y_coords[i-1], 
        x1=x_coords[i], 
        y1=y_coords[i],
        line=dict(color="magenta",width=3)
    )
    
fig.show()