Python 标准库中没有一个专门叫做 polylines 的函数,折线是一种数据结构(由一系列点连接而成),而处理它的功能通常分布在多个专业的库中,最核心和常用的库是 Matplotlib(用于绘图)和 Shapely(用于几何操作)。

下面我将分模块详细介绍这两个库中与折线相关的核心函数和用法。
Matplotlib - 用于绘制折线图
Matplotlib 是 Python 最著名的绘图库,它提供了非常方便的函数来绘制折线图,这在数据可视化中非常常见。
核心函数:plt.plot()
matplotlib.pyplot.plot() 是绘制折线图最基础的函数,它接收 x 和 y 坐标序列,并将它们连接起来形成折线。
基本用法
import matplotlib.pyplot as plt
# 1. 准备数据
x_coords = [1, 2, 3, 4, 5]
y_coords = [2, 5, 3, 6, 4]
# 2. 绘制折线
plt.plot(x_coords, y_coords)
# 3. 添加标题和标签"简单折线图")
plt.xlabel("X 轴")
plt.ylabel("Y 轴")
# 4. 显示图形
plt.show()
绘制多条折线
你可以在同一个图上多次调用 plt.plot() 来绘制多条折线。

import matplotlib.pyplot as plt
# 数据
x = [1, 2, 3, 4, 5]
y1 = [2, 5, 3, 6, 4]
y2 = [1, 3, 2, 5, 3]
# 绘制两条折线
plt.plot(x, y1, label='折线 1', color='blue', marker='o') # 添加标签、颜色和标记
plt.plot(x, y2, label='折线 2', color='red', marker='s') # s 代表方形
# 添加图例
plt.legend()
"多条折线图")
plt.xlabel("X 轴")
plt.ylabel("Y 轴")
plt.grid(True) # 添加网格
plt.show()
绘制闭合折线(多边形)
要绘制一个闭合的多边形,只需要将折线的起点和终点坐标连接起来即可,一个简单的方法是在数据序列的末尾再次添加第一个点的坐标。
import matplotlib.pyplot as plt
import numpy as np
# 定义一个三角形的顶点
x = np.array([1, 3, 2, 1]) # 末尾重复第一个点 x=1
y = np.array([1, 2, 3, 1]) # 末尾重复第一个点 y=1
plt.plot(x, y, 'b-') # 'b-' 表示蓝色实线
plt.fill(x, y, color='lightblue', alpha=0.5) # 填充多边形内部
"闭合折线(多边形)")
plt.axis('equal') # 保证 x, y 轴比例相同,图形不变形
plt.show()
Shapely - 用于几何操作
Shapely 是一个强大的 Python 库,用于处理和分析平面几何对象,如果你需要对折线进行几何计算(如判断相交、计算长度、求缓冲区等),Shapely 是不二之选。
核心类:LineString
shapely.geometry.LineString 类是用来表示一条由两个或更多点组成的折线(或线串)。
安装
pip install shapely
基本用法
from shapely.geometry import LineString, Point
# 1. 创建一条折线
# 使用一个包含 (x, y) 元组的列表来定义点
coords = [(0, 0), (2, 2), (4, 0), (6, 2)]
line = LineString(coords)
print(f"折线对象: {line}")
print(f"折线长度: {line.length}")
print(f"折线中心点: {line.centroid}")
# 2. 创建另一条折线用于演示交互
line2 = LineString([(1, 1), (3, 1), (5, 1)])
# 3. 判断两条折线是否相交
if line.intersects(line2):
print("\n两条折线相交。")
# 获取相交点
intersection = line.intersection(line2)
print(f"相交结果类型: {type(intersection)}")
if intersection.geom_type == 'Point':
print(f"相交点坐标: {intersection.x}, {intersection.y}")
else:
print("\n两条折线不相交。")
# 4. 计算折线的缓冲区
# 缓冲区是指以折线为中心,向外扩展一定距离的区域,形成一个“带状”多边形
buffered_line = line.buffer(distance=0.5)
print(f"\n缓冲区对象类型: {type(buffered_line)}")
print(f"缓冲区面积: {buffered_line.area}")
其他相关几何对象
Shapely 还提供了其他相关的类,它们经常和 LineString 一起使用:

Point: 表示单个点。LinearRing: 表示一个闭合的、没有交叉的线串,它必须是闭合的(首尾点相同)。Polygon: 表示一个多边形,由一个外环和零个或多个内环(孔洞)组成。
from shapely.geometry import Polygon, LinearRing
# 使用 LineString 创建一个 Polygon
# 外环
shell = LineString([(0, 0), (10, 0), (10, 10), (0, 10), (0, 0)])
# 内环(孔洞)
hole = LineString([(2, 2), (4, 2), (4, 4), (2, 4), (2, 2)])
polygon = Polygon(shell, [hole]) # 注意内环是一个列表
print(f"多边形面积: {polygon.area}") # 面积会是外环减去内环
print(f"多边形外环: {polygon.exterior}")
print(f"多边形内环数量: {len(polygon.interiors)}")
其他相关库
除了 Matplotlib 和 Shapely,还有一些库也处理折线,但侧重点不同。
GeoPandas
如果你在处理地理空间数据(比如地图上的道路、河流),GeoPandas 是最佳选择,它在 Pandas 的基础上扩展了对地理空间数据的支持。
- 核心数据结构:
GeoDataFrame和GeoSeries,它们的每一行或每个元素都是一个 Shapely 几何对象(如LineString,Point,Polygon)。 - 用途: 读取/写入 Shapefile、GeoJSON 等地理数据格式,进行空间连接、空间投影等操作。
import geopandas as gpd
from shapely.geometry import LineString
# 创建一个包含折线数据的 GeoDataFrame
data = {'geometry': [LineString([(0, 0), (1, 1)]), LineString([(2, 2), (3, 3)])]}
gdf = gpd.GeoDataFrame(data, crs="EPSG:4326") # crs 是坐标参考系统
print(gdf)
# 可以轻松地绘制
gdf.plot()
plt.show()
OpenCV
如果你在进行计算机视觉或图像处理,OpenCV 是常用的库,它使用 NumPy 数组来表示图像,折线通常以像素坐标的形式存在。
- 核心函数:
cv2.polylines() - 用途: 在图像上绘制一条或多条折线。
import cv2
import numpy as np
# 创建一个黑色背景的图像
image = np.zeros((400, 600, 3), dtype=np.uint8)
# 定义折线的点 (注意 OpenCV 要求点是 NumPy 数组)
pts = np.array([[50, 50], [200, 150], [50, 250], [150, 350]], np.int32)
# 绘制折线
# pts.reshape((-1, 1, 2)) 是 OpenCV polylines 函数要求的格式
# isClosed=True 表示闭合折线
# color=(0, 255, 0) 是绿色
# thickness=5 是线宽
cv2.polylines(image, [pts.reshape((-1, 1, 2))], isClosed=True, color=(0, 255, 0), thickness=5)
# 显示图像
cv2.imshow("OpenCV Polylines", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
总结与对比
| 库/模块 | 主要用途 | 核心类/函数 | 数据表示 |
|---|---|---|---|
| Matplotlib | 数据可视化,绘制图表 | plt.plot() |
列表、NumPy 数组 |
| Shapely | 几何计算,空间分析 | LineString, Point, Polygon |
Shapely 几何对象 |
| GeoPandas | 地理空间数据处理 | GeoDataFrame |
Shapely 几何对象(封装在 Pandas 结构中) |
| OpenCV | 计算机视觉,图像处理 | cv2.polylines() |
NumPy 数组 |
如何选择?
- 如果你想画一张图来展示数据的变化趋势,用 Matplotlib。
- 如果你想分析两条线是否相交、计算一条线的长度或它围成的区域,用 Shapely。
- 如果你的数据是地图上的道路,并且你需要读取、存储或进行地理空间分析,用 GeoPandas。
- 如果你想在图片上画出一条标记线,用 OpenCV。
希望这个详细的解释能帮助你理解 Python 中处理“折线”的各种函数和库!
