我正在使用
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
需要为负数,所以现在我无法使用最大值来计算线路应该停止。
我已经设法拼凑出一个解决方案,这可能会对其他人有所帮助或作为一个起点,我对此并不完全满意,但我已经用相当多的不同范围测试了它,它似乎沿着正确地渲染了线注释位于该行的顶部。
我通过使用三个注释来实现这一点:一个形状和一个放置在条顶部的非常小的箭头,然后一个注释放置在直线的顶部,其中只有文本。感觉有点脏,但似乎有用。
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,
)