大家好!我是风哥。今天要跟大家分享 Matplotlib 库的使用,让我们用 Python 绘制出美轮美奂的数据可视化图表!
基础图表
1. 线形图
1import matplotlib.pyplot as plt
2import numpy as np
3
4# 创建数据
5x = np.linspace(0, 10, 100)
6y1 = np.sin(x)
7y2 = np.cos(x)
8
9# 绘制图形
10plt.figure(figsize=(10, 6))
11plt.plot(x, y1, label='sin(x)', color='blue', linestyle='-')
12plt.plot(x, y2, label='cos(x)', color='red', linestyle='--')
13
14# 添加标题和标签
15plt.title('正弦和余弦函数')
16plt.xlabel('X 轴')
17plt.ylabel('Y 轴')
18plt.legend()
19plt.grid(True)
20plt.show()
2. 散点图
1import matplotlib.pyplot as plt
2import numpy as np
3
4# 生成随机数据
5np.random.seed(42)
6x = np.random.normal(0, 1, 100)
7y = np.random.normal(0, 1, 100)
8
9# 绘制散点图
10plt.figure(figsize=(8, 8))
11plt.scatter(x, y, c='blue', alpha=0.6, s=100)
12plt.title('随机散点图')
13plt.xlabel('X 轴')
14plt.ylabel('Y 轴')
15plt.grid(True)
16plt.show()
3. 柱状图
1import matplotlib.pyplot as plt
2import numpy as np
3
4# 数据
5categories = ['A', 'B', 'C', 'D']
6values = [23, 45, 56, 78]
7
8# 创建柱状图
9plt.figure(figsize=(8, 6))
10bars = plt.bar(categories, values)
11
12# 添加数值标签
13for bar in bars:
14 height = bar.get_height()
15 plt.text(bar.get_x() + bar.get_width()/2., height,
16 f'{int(height)}',
17 ha='center', va='bottom')
18
19plt.title('柱状图示例')
20plt.xlabel('类别')
21plt.ylabel('数值')
22plt.show()
进阶图表
1. 子图布局
1import matplotlib.pyplot as plt
2import numpy as np
3
4# 创建数据
5x = np.linspace(0, 10, 100)
6y1 = np.sin(x)
7y2 = np.cos(x)
8y3 = np.tan(x)
9y4 = x**2
10
11# 创建2x2的子图
12fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(12, 10))
13
14# 第一个子图
15ax1.plot(x, y1, 'b-')
16ax1.set_title('sin(x)')
17
18# 第二个子图
19ax2.plot(x, y2, 'r-')
20ax2.set_title('cos(x)')
21
22# 第三个子图
23ax3.plot(x, y3, 'g-')
24ax3.set_title('tan(x)')
25
26# 第四个子图
27ax4.plot(x, y4, 'y-')
28ax4.set_title('x^2')
29
30# 调整子图间距
31plt.tight_layout()
32plt.show()
2. 饼图
1import matplotlib.pyplot as plt
2
3# 数据
4sizes = [30, 20, 25, 15, 10]
5labels = ['A', 'B', 'C', 'D', 'E']
6colors = ['#ff9999', '#66b3ff', '#99ff99', '#ffcc99', '#ff99cc']
7explode = (0.1, 0, 0, 0, 0) # 突出显示第一块
8
9plt.figure(figsize=(10, 8))
10plt.pie(sizes, explode=explode, labels=labels, colors=colors,
11 autopct='%1.1f%%', shadow=True, startangle=90)
12plt.axis('equal')
13plt.title('饼图示例')
14plt.show()
3. 3D图表
1import matplotlib.pyplot as plt
2from mpl_toolkits.mplot3d import Axes3D
3import numpy as np
4
5# 创建数据
6x = np.linspace(-5, 5, 100)
7y = np.linspace(-5, 5, 100)
8X, Y = np.meshgrid(x, y)
9Z = np.sin(np.sqrt(X**2 + Y**2))
10
11# 创建3D图
12fig = plt.figure(figsize=(12, 8))
13ax = fig.add_subplot(111, projection='3d')
14
15# 绘制3D表面
16surface = ax.plot_surface(X, Y, Z, cmap='viridis')
17
18# 添加颜色条
19fig.colorbar(surface)
20
21# 设置标签
22ax.set_xlabel('X轴')
23ax.set_ylabel('Y轴')
24ax.set_zlabel('Z轴')
25ax.set_title('3D表面图')
26
27plt.show()
高级技巧
1. 动态图表
1import matplotlib.pyplot as plt
2import numpy as np
3from matplotlib.animation import FuncAnimation
4
5# 创建图形
6fig, ax = plt.subplots(figsize=(10, 6))
7xdata, ydata = [], []
8ln, = ax.plot([], [], 'ro-')
9
10# 初始化函数
11def init():
12 ax.set_xlim(0, 2*np.pi)
13 ax.set_ylim(-1, 1)
14 return ln,
15
16# 更新函数
17def update(frame):
18 xdata.append(frame)
19 ydata.append(np.sin(frame))
20 ln.set_data(xdata, ydata)
21 return ln,
22
23# 创建动画
24ani = FuncAnimation(fig, update, frames=np.linspace(0, 2*np.pi, 128),
25 init_func=init, blit=True)
26plt.show()
2. 自定义样式
1import matplotlib.pyplot as plt
2import numpy as np
3
4# 设置全局样式
5plt.style.use('seaborn-darkgrid')
6
7# 自定义颜色映射
8colors = ['#2ecc71', '#e74c3c', '#3498db', '#f1c40f']
9plt.rcParams['axes.prop_cycle'] = plt.cycler(color=colors)
10
11# 创建数据
12x = np.linspace(0, 10, 100)
13y1 = np.sin(x)
14y2 = np.cos(x)
15
16# 创建图形
17plt.figure(figsize=(12, 6))
18
19# 绘制带阴影的线图
20plt.plot(x, y1, linewidth=2, label='sin(x)')
21plt.fill_between(x, y1, alpha=0.3)
22plt.plot(x, y2, linewidth=2, label='cos(x)')
23plt.fill_between(x, y2, alpha=0.3)
24
25# 自定义样式
26plt.title('美化后的线图', fontsize=16, pad=20)
27plt.xlabel('X 轴', fontsize=12)
28plt.ylabel('Y 轴', fontsize=12)
29plt.legend(fontsize=12)
30plt.grid(True, linestyle='--', alpha=0.7)
31
32# 设置背景色
33plt.gca().set_facecolor('#f8f9fa')
34plt.show()
3. 组合图表
1import matplotlib.pyplot as plt
2import numpy as np
3
4# 创建数据
5categories = ['A', 'B', 'C', 'D']
6values1 = [4, 3, 2, 1]
7values2 = [1, 2, 3, 4]
8
9# 创建图形
10fig, ax1 = plt.subplots(figsize=(10, 6))
11
12# 绘制柱状图
13x = np.arange(len(categories))
14width = 0.35
15rects1 = ax1.bar(x - width/2, values1, width, label='组1')
16rects2 = ax1.bar(x + width/2, values2, width, label='组2')
17
18# 创建第二个Y轴
19ax2 = ax1.twinx()
20line = ax2.plot(x, np.cumsum(values1), 'r-', label='累计值')
21
22# 设置标签和标题
23ax1.set_xlabel('类别')
24ax1.set_ylabel('数值')
25ax2.set_ylabel('累计值')
26plt.title('组合图表示例')
27
28# 添加图例
29lines1, labels1 = ax1.get_legend_handles_labels()
30lines2, labels2 = ax2.get_legend_handles_labels()
31ax1.legend(lines1 + lines2, labels1 + labels2, loc='upper left')
32
33# 设置刻度
34ax1.set_xticks(x)
35ax1.set_xticklabels(categories)
36
37plt.show()
4. 热力图
1import matplotlib.pyplot as plt
2import numpy as np
3import seaborn as sns
4
5# 创建数据
6data = np.random.rand(10, 10)
7mask = np.zeros_like(data)
8mask[np.triu_indices_from(mask)] = True
9
10# 创建热力图
11plt.figure(figsize=(10, 8))
12sns.heatmap(data, mask=mask, cmap='YlOrRd',
13 annot=True, fmt='.2f',
14 linewidths=0.5, center=0,
15 cbar_kws={'label': '相关系数'})
16
17plt.title('热力图示例')
18plt.show()
5. 地理数据可视化
1import matplotlib.pyplot as plt
2import numpy as np
3
4def create_map_visualization():
5 # 创建示例数据(经度和纬度)
6 lons = np.random.uniform(-180, 180, 50)
7 lats = np.random.uniform(-90, 90, 50)
8 values = np.random.rand(50)
9
10 plt.figure(figsize=(15, 10))
11
12 # 绘制世界地图轮廓(简化版)
13 plt.grid(True)
14 plt.xlim(-180, 180)
15 plt.ylim(-90, 90)
16
17 # 绘制散点
18 scatter = plt.scatter(lons, lats, c=values,
19 cmap='viridis', s=100)
20
21 plt.colorbar(scatter, label='值')
22 plt.title('全球数据分布图')
23 plt.xlabel('经度')
24 plt.ylabel('纬度')
25
26 plt.show()
27
28create_map_visualization()
今天的 Matplotlib 教程就到这里啦!通过这些例子,相信大家已经掌握了使用 Matplotlib 创建各种精美图表的方法。数据可视化不仅能帮助我们更好地理解数据,还能让我们的报告和演示更加生动有趣。记得关注我,下次给大家带来更多 Python 开发技巧!如果有问题,欢迎在评论区讨论。