如何使用matplotlib/seaborn将直线转为曲线以区分两点间重叠线段
解决matplotlib/seaborn绘制多条同起点终点线段重叠的方案
你需要的效果可以通过matplotlib的patches.FancyArrowPatch接口实现,这个接口支持自定义连线的弯曲弧度,完美适配区分多条同端点线段的场景。


实现思路
- 固定其中1条线段为直线,剩下的2条线段分别设置不同方向的弯曲弧度,避免三条线完全重叠
- 通过
connectionstyle参数控制弧度大小和方向,数值越大弯曲程度越高,正负值控制弯曲方向
可运行代码示例
import matplotlib.pyplot as plt from matplotlib.patches import FancyArrowPatch # 定义A、B两点坐标,可替换为自己的实际坐标 point_a = (0, 0) point_b = (1, 1) fig, ax = plt.subplots(figsize=(5,5)) # 绘制第一条无弯曲的直线 line1 = FancyArrowPatch(point_a, point_b, arrowstyle='-', color='blue', linewidth=2) ax.add_patch(line1) # 绘制第二条曲线,向左弯曲,弧度设为0.3 line2 = FancyArrowPatch(point_a, point_b, arrowstyle='-', color='orange', linewidth=2, connectionstyle='arc3,rad=0.3') ax.add_patch(line2) # 绘制第三条曲线,向右弯曲,弧度设为-0.3 line3 = FancyArrowPatch(point_a, point_b, arrowstyle='-', color='green', linewidth=2, connectionstyle='arc3,rad=-0.3') ax.add_patch(line3) # 调整坐标轴范围适配坐标 ax.set_xlim(-0.1, 1.1) ax.set_ylim(-0.1, 1.1) plt.show()
额外说明
- 如果使用seaborn绘图,可以直接在seaborn生成的坐标轴对象上调用
add_patch()方法添加上述曲线,不需要调整seaborn原有样式 - 弧度值可以根据线段数量、坐标范围灵活调整,只要保证不同线段的
rad参数不同,就可以避免重叠 - 如果需要带箭头的连线,把
arrowstyle参数改成'->'即可,还可以自定义调整箭头大小、样式等参数
内容的提问来源于stack exchange,提问作者Clare L
相关产品推荐
相关产品推荐

