计算绘图条形图上注释的结束位置

问题描述 投票:0回答:1

我正在使用

plotly
创建一个条形图,它只有两个条形,左侧条形始终比右侧条形更大。

我需要在较小的条形上方放置一个向下的箭头,箭头的头部应该接触较小的条形,这个位置很容易计算,但是箭头的尾部需要向上延伸并停在较高的条形,事实证明很难计算,因为由于某种原因该值现在是负数并且与数据完全没有关系。

下面是我的代码片段:

data = {
    "Big Value": 34000,
    "Small Value": 18000,
}

max_value = max(data.values())

    min_value = min(data.values())

    difference = max_value - min_value

    arrow_start_position = max_value - difference

    arrow_end_position = ??

    print(arrow_end_position)

    fig = go.Figure(
        data=[
            go.Bar(
                x=list(data.keys()), y=list(data.values())
            )
        ]
    )

    fig.add_annotation(
        x=1,
        y=arrow_start_position,
        text=f"{difference}",
        showarrow=True,
        arrowhead=2,
        arrowsize=2,
        arrowwidth=2,
        arrowcolor="#84be54",
        ax=0,
        ay=arrow_end_position,
    )

如何准确计算

arrow_end_position
值? y 坐标应该是最大值(较大条形的值),但由于某种未知原因,为了使箭头指向下
ay
需要为负数,所以现在我无法使用最大值来计算线路应该停止。

python plotly
1个回答
0
投票

我已经设法拼凑出一个解决方案,这可能会对其他人有所帮助或作为一个起点,我对此并不完全满意,但我已经用相当多的不同范围测试了它,它似乎沿着正确地渲染了线注释位于该行的顶部。

我通过使用三个注释来实现这一点:一个形状和一个放置在条顶部的非常小的箭头,然后一个注释放置在直线的顶部,其中只有文本。感觉有点脏,但似乎有用。

fig.add_shape(
        type="line",
        x0=1, x1=1, xref="x",
        y0=min_value, y1=max_value - (max_value * 0.02), yref="y",
        line=dict(color="#84be54", width=2)
    )

    fig.add_annotation(
        x=1,
        y=max_value,
        text=f"{difference}",
        showarrow=False,
        arrowhead=2,
        arrowsize=2,
        arrowwidth=2,
        arrowcolor="#84be54",
        ax=0,
    )

    fig.add_annotation(
        x=1,
        y=min_value,
        text="",
        showarrow=True,
        arrowhead=2,
        arrowsize=2,
        arrowwidth=2,
        arrowcolor="#84be54",
        ax=0,
        ay=-10,
    )
© www.soinside.com 2019 - 2024. All rights reserved.