折线图是最常用的数据可视化图表之一,用于展示数据随时间或有序类别变化的趋势。
Matplotlib 中通过 plt.plot() 函数可以快速绘制美观的折线图。
直接传入 x 和 y 轴的数据即可绘制一条折线:
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]
plt.plot(x, y)
plt.title('基本折线图')
plt.xlabel('X 轴')
plt.ylabel('Y 轴')
plt.show()
plot() 函数支持许多参数来控制线条的外观:颜色、线型、标记等。常用的方式有两种:
'ro--' 表示红色圆点虚线。color, linestyle, marker 等。| 参数 | 说明 | 常用值示例 |
|---|---|---|
color 或 c | 线条颜色 | 'b' (蓝), 'g' (绿), 'r' (红), 'c' (青), 'm' (品红), 'y' (黄), 'k' (黑), 'w' (白) 或十六进制 '#ff0000' |
linestyle 或 ls | 线条样式 | '-' (实线), '--' (虚线), '-.' (点划线), ':' (点线) |
marker | 数据点标记 | '.' (点), 'o' (圆圈), 's' (正方形), '*' (星号), '+' (加号), 'x' (叉号), 'D' (菱形) |
linewidth 或 lw | 线宽 | 浮点数,默认1.5 |
markersize 或 ms | 标记大小 | 浮点数 |
import matplotlib.pyplot as plt
x = [1, 2, 3, 4]
y = [1, 4, 9, 16]
# 方式一:格式字符串
plt.plot(x, y, 'ro--') # 红色圆圈虚线
# 方式二:显式参数(效果相同)
plt.plot(x, y, color='red', marker='o', linestyle='dashed', linewidth=2, markersize=8)
plt.title('定制线条样式')
plt.show()
多次调用 plot() 可以在同一坐标系中绘制多条折线:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.sin(x) * np.cos(x)
plt.plot(x, y1, label='sin(x)', color='b', linestyle='-')
plt.plot(x, y2, label='cos(x)', color='r', linestyle='--')
plt.plot(x, y3, label='sin(x)cos(x)', color='g', linestyle=':')
plt.title('多条折线示例')
plt.xlabel('x')
plt.ylabel('y')
plt.legend() # 显示图例
plt.show()
label 参数指定图例名称,调用 legend() 显示图例。可以使用 xlim(), ylim() 设置坐标轴范围,xticks(), yticks() 设置刻度:
plt.plot([1,2,3,4], [1,4,9,16])
plt.xlim(0, 5) # X轴范围 0~5
plt.ylim(0, 20) # Y轴范围 0~20
plt.xticks([1,2,3,4], ['一','二','三','四']) # 修改刻度标签
plt.yticks([0,5,10,15,20])
plt.title('坐标轴设置')
plt.show()
使用 grid() 可以添加网格线,使数据更容易读取:
plt.plot([1,2,3,4], [1,4,9,16])
plt.grid(True) # 显示网格
# 或者定制网格样式
plt.grid(True, linestyle='--', color='gray', alpha=0.5)
plt.title('带网格的折线图')
plt.show()
下面是一个模拟股票价格走势的折线图,综合了上述大部分功能:
import matplotlib.pyplot as plt
import numpy as np
# 生成模拟数据
days = np.arange(1, 31)
price_a = 100 + np.cumsum(np.random.randn(30)) # 随机游走
price_b = 100 + np.cumsum(np.random.randn(30))
# 绘制两条折线
plt.plot(days, price_a, 'b-o', label='股票 A', linewidth=2, markersize=4)
plt.plot(days, price_b, 'r--s', label='股票 B', linewidth=1.5, markersize=3)
# 标题和标签
plt.title('股票价格走势对比', fontsize=14)
plt.xlabel('交易日')
plt.ylabel('价格 (元)')
# 坐标轴范围
plt.xlim(0, 31)
plt.ylim(min(price_a.min(), price_b.min()) - 5, max(price_a.max(), price_b.max()) + 5)
# 网格
plt.grid(True, linestyle=':', alpha=0.7)
# 图例
plt.legend(loc='upper left')
# 添加注释(最高点)
max_idx = np.argmax(price_a)
plt.annotate(f'最高 {price_a[max_idx]:.1f}', xy=(days[max_idx], price_a[max_idx]),
xytext=(days[max_idx]+2, price_a[max_idx]+2),
arrowprops=dict(arrowstyle='->', color='blue'))
plt.tight_layout()
plt.show()
使用 savefig() 代替 show() 即可保存:
plt.plot(x, y)
plt.title('保存示例')
plt.savefig('line_plot.png', dpi=300, bbox_inches='tight') # 保存为PNG
# plt.savefig('line_plot.pdf') # 保存为PDF矢量格式
折线图是 Matplotlib 中最基础但最强大的工具。掌握了本章内容,你就能应对大多数趋势展示需求。下一章我们将学习散点图的绘制。