You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python的plotnine绘图中添加可自定义参数的花括号标注

plotnine自定义花括号标注实现方案

plotnine底层基于matplotlib渲染,因此可以通过调用matplotlib的FancyArrowPatch接口绘制高度可定制的花括号,完美解决字符标注的适配问题。

完整可运行代码

import pandas as pd
from plotnine import *
from matplotlib.patches import FancyArrowPatch

df = pd.DataFrame({
    'Group':('Group1',)*6 + ('Group2',)*6,
    'AgeRange':(6,5,4,3,2,1)*2,
    'Mean':(1,3,5,7,9,11,2,4,6,8,10,12)
})

# 绘制基础图表
p = (ggplot(df,aes(x='AgeRange', y='Mean', fill='Group'))
  + theme_minimal()
  + geom_col(position='dodge', width=0.8)
  + coord_flip()
)

# 获取matplotlib轴对象
fig = p.draw()
ax = fig.axes[0]

# 花括号配置(可根据需求自定义调整)
brace_config = {
    "y_start": 0,    # 花括号左端y坐标(控制覆盖范围左边界)
    "y_end": 4,      # 花括号右端y坐标(控制覆盖范围右边界)
    "x_pos": 5,      # 花括号所在的x轴位置
    "depth": 0.2,    # 花括号中间凹陷的深度
    "linewidth": 1.5,# 花括号线条粗细
    "color": "black" # 花括号颜色
}

# 绘制花括号
brace = FancyArrowPatch(
    (brace_config["y_start"], brace_config["x_pos"]),
    (brace_config["y_end"], brace_config["x_pos"]),
    arrowstyle=f'{{}}, width=0.4, length={brace_config["depth"]}',
    linewidth=brace_config["linewidth"],
    color=brace_config["color"],
    clip_on=False
)
ax.add_patch(brace)

# 添加标注文本
ax.text(
    brace_config["y_end"] + 0.2,
    brace_config["x_pos"],
    'Something pithy...',
    fontsize=10,
    va='center'
)

# 显示图表
import matplotlib.pyplot as plt
plt.show()

可调参数说明

  • 调整y_start和y_end可以自由控制花括号的覆盖范围,支持跨多个分组、跨多个坐标区间的标注场景
  • 调整linewidth可以修改花括号的线条粗细,不会出现字符拉伸后线条过粗的问题
  • 调整arrowstyle中的width参数可以修改花括号两端的展开宽度
  • 调整arrowstyle中的length参数可以修改花括号中间凹陷的深度
  • 额外支持linestyle、alpha等matplotlib patch通用参数,可实现虚线、半透明等特殊效果

内容的提问来源于stack exchange,提问作者brb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 09:36:07