matplotlib
matplotlib
是 Python 中一个强大而灵活的绘图库,广泛用于数据可视化 。它允许创建多种类型的图表,包括线图、散点图、柱状图、饼图、直方图 等。matplotlib
的基础是 pyplot
模块,它为绘图提供了简单的接口。这里详细讲解一下 matplotlib
的使用方法及其核心概念:
1. 基础结构和模块
matplotlib
的核心模块是pyplot
,通常以plt缩写来使用:
python
import matplotlib.pyplot as plt
matplotlib
中常用的集中图表类型方法介绍:
2. 线图
线图通常用于展示数据的连续变化,比如时间序列数据等。plot
函数适合绘制线图。
python
import matplotlib.pyplot as plt
import numpy as np
# 生成数据
x = np.linspace(0, 10, 100)
y = np.sin(x)
# 绘制线图
plt.plot(x, y, color='b', linestyle='-', linewidth=2)
plt.title("Line Plot - Sine Wave")
plt.xlabel("X Axis")
plt.ylabel("Y Axis")
plt.show()

3. 散点图
散点图适合显示两个变量之间的关系,例如,展示变量之间是否存在关联。scatter
函数用于创建散点图。
python
import matplotlib.pyplot as plt
import numpy as np
# 生成数据
x = np.random.rand(50)
y = np.random.rand(50)
# 绘制散点图
plt.scatter(x, y, color='r', marker='o')
plt.title("Scatter Plot")
plt.xlabel("X Axis")
plt.ylabel("Y Axis")
plt.show()

4. 柱状图
柱状图用于比较不同类别之间的数值大小,特别适合表示分类数据。bar
函数可以创建柱状图。
python
import matplotlib.pyplot as plt
import numpy as np
# 数据
categories = ['A', 'B', 'C', 'D']
values = [3, 7, 5, 2]
# 绘制柱状图
plt.bar(categories, values, color='g')
plt.title("Bar Chart")
plt.xlabel("Categories")
plt.ylabel("Values")
plt.show()

5. 饼图
饼图用于显示部分与整体的比例关系。pie
函数适合创建饼图。
python
import matplotlib.pyplot as plt
import numpy as np
# 数据
sizes = [30, 20, 25, 25]
labels = ['A', 'B', 'C', 'D']
colors = ['gold', 'lightblue', 'lightgreen', 'pink']
# 绘制饼图
plt.pie(sizes, labels=labels, colors=colors, autopct='%1.1f%%', startangle=140)
plt.title("Pie Chart")
plt.show()

6. 直方图
直方图展示数据分布情况,特别适合连续数据的频率分布。hist
函数用于创建直方图。
python
import matplotlib.pyplot as plt
import numpy as np
# 生成数据
data = np.random.randn(1000) # 正态分布数据
# 绘制直方图
plt.hist(data, bins=30, color='purple', edgecolor='black')
plt.title("Histogram")
plt.xlabel("Value")
plt.ylabel("Frequency")
plt.show()

除了上面的之外,还有以下类型的图表可以使用mappltlilb进行绘制:
7. 箱线图
箱线图用于显示数据的分布情况,包括中位数、四分位数及异常值,非常适合比较不同组的数据。
python
import matplotlib.pyplot as plt
import numpy as np
# 生成数据
data = [np.random.normal(0, std, 100) for std in range(1, 4)]
# 绘制箱线图
plt.boxplot(data, vert=True, patch_artist=True, labels=['Group 1', 'Group 2', 'Group 3'])
plt.title("Box Plot")
plt.ylabel("Value")
plt.show()

8. 雷达图(Radar Chart)
雷达图用于显示多变量数据,特别适合比较不同对象的特征。
python
import matplotlib.pyplot as plt
import numpy as np
# 生成数据
labels = np.array(['A', 'B', 'C', 'D', 'E'])
values = np.array([4, 3, 2, 5, 4])
# 绘制雷达图
angles = np.linspace(0, 2 * np.pi, len(labels), endpoint=False).tolist()
values = np.concatenate((values,[values[0]])) # 闭合图形
angles += angles[:1] # 闭合图形
plt.polar(angles, values, marker='o')
plt.title("Radar Chart")
plt.xticks(angles[:-1], labels)
plt.show()

9. 条形图(Horizontal Bar Chart)
条形图是柱状图的横向版本,适合显示较长的类别名称。
python
import matplotlib.pyplot as plt
import numpy as np
# 数据
categories = ['Category A', 'Category B', 'Category C']
values = [10, 20, 15]
# 绘制条形图
plt.barh(categories, values, color='orange')
plt.title("Horizontal Bar Chart")
plt.xlabel("Values")
plt.ylabel("Categories")
plt.show()

10. 面积图(Area Plot)
面积图用于显示随时间变化的总量,强调数值的累积。
python
import matplotlib.pyplot as plt
import numpy as np
# 生成数据
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
# 绘制面积图
plt.fill_between(x, y1, color='skyblue', alpha=0.5, label='Sine')
plt.fill_between(x, y2, color='lightgreen', alpha=0.5, label='Cosine')
plt.title("Area Plot")
plt.xlabel("X Axis")
plt.ylabel("Y Axis")
plt.legend()
plt.show()

11. 曲线图(Step Plot)
曲线图显示数据的阶梯变化,适合显示离散变化或不连续数据。
python
import matplotlib.pyplot as plt
import numpy as np
# 生成数据
x = np.arange(10)
y = np.random.rand(10)
# 绘制曲线图
plt.step(x, y, where='mid', label='Step Plot', color='orange')
plt.title("Step Plot")
plt.xlabel("X Axis")
plt.ylabel("Y Axis")
plt.legend()
plt.show()

14. 概率分布图(Probability Distribution Function, PDF)
用于展示概率分布的形状,通常与正态分布等一起使用。
python
import matplotlib.pyplot as plt
import numpy as np
# 生成数据
data = np.random.randn(1000)
# 绘制概率分布图
plt.hist(data, bins=30, density=True, alpha=0.5, color='g', label='Histogram')
xmin, xmax = plt.xlim()
x = np.linspace(xmin, xmax, 100)
p = (1 / (np.sqrt(2 * np.pi))) * np.exp(-0.5 * (x**2)) # 正态分布函数
plt.plot(x, p, 'k', linewidth=2, label='PDF')
plt.title("Probability Distribution")
plt.xlabel("Value")
plt.ylabel("Probability")
plt.legend()
plt.show()

15. 极坐标图(Polar Plot)
极坐标图用于展示数据在极坐标系中的分布。
python
import matplotlib.pyplot as plt
import numpy as np
# 生成数据
theta = np.linspace(0, 2 * np.pi, 100)
r = np.abs(np.sin(2 * theta)) # 半径
# 绘制极坐标图
plt.polar(theta, r, color='purple')
plt.title("Polar Plot")
plt.show()

16. 瀑布图(Waterfall Chart)
瀑布图用于展示数据的逐步累加,常用于财务数据的可视化。
python
import matplotlib.pyplot as plt
# 数据
categories = ['Start', 'Increase', 'Decrease', 'Increase', 'End']
values = [100, 30, -20, 50, 0]
# 计算累计值
cumulative = [sum(values[:i+1]) for i in range(len(values))]
# 绘制瀑布图
plt.bar(categories, cumulative, color=['blue', 'green', 'red', 'green', 'blue'])
plt.title("Waterfall Chart")
plt.ylabel("Values")
plt.show()

17. 轨迹图(Trajectory Plot)
轨迹图展示对象在空间中的运动轨迹,常用于物理和工程领域。
python
import matplotlib.pyplot as plt
import numpy as np
# 生成数据
t = np.linspace(0, 10, 100)
x = np.sin(t)
y = np.cos(t)
# 绘制轨迹图
plt.plot(x, y, label='Trajectory', color='orange')
plt.title("Trajectory Plot")
plt.xlabel("X Coordinate")
plt.ylabel("Y Coordinate")
plt.axis('equal') # 保持比例
plt.legend()
plt.show()

18. 网格图(Grid Plot)
网格图展示多个变量的散点图或其他图表的组合,通常用于展示高维数据。
python
import matplotlib.pyplot as plt
import numpy as np
# 生成数据
x = np.random.rand(100)
y = np.random.rand(100)
z = np.random.rand(100)
# 绘制网格图
fig, axs = plt.subplots(1, 3, figsize=(15, 5))
axs[0].scatter(x, y)
axs[0].set_title('Scatter Plot')
axs[1].hist(x, bins=10)
axs[1].set_title('Histogram')
axs[2].bar(range(10), z[:10])
axs[2].set_title('Bar Chart')
plt.show()

19. 频率多边形图(Frequency Polygon)
频率多边形图展示数据的分布,类似于直方图但用线连接各个顶点。
python
import matplotlib.pyplot as plt
import numpy as np
# 生成数据
data = np.random.randn(1000)
# 绘制频率多边形图
plt.hist(data, bins=30, density=True, alpha=0.5, color='g', edgecolor='black')
plt.plot(np.sort(data), np.arange(1, len(data)+1) / len(data), color='red', linewidth=2, label='Frequency Polygon')
plt.title("Frequency Polygon")
plt.xlabel("Value")
plt.ylabel("Density")
plt.legend()
plt.show()

20. 堆叠图(Stacked Plot)
堆叠图用于展示各部分对整体的贡献,适合展示多个数据系列的堆叠效果。
python
import matplotlib.pyplot as plt
import numpy as np
# 数据
categories = ['A', 'B', 'C']
values1 = [3, 2, 5]
values2 = [2, 3, 1]
# 绘制堆叠图
plt.bar(categories, values1, color='blue', label='Series 1')
plt.bar(categories, values2, bottom=values1, color='orange', label='Series 2')
plt.title("Stacked Bar Chart")
plt.ylabel("Values")
plt.legend()
plt.show()

21. 条形折线图(Bar Line Plot)
条形折线图同时展示条形图和折线图,适合展示不同数据的对比。
python
import matplotlib.pyplot as plt
import numpy as np
# 数据
categories = ['A', 'B', 'C']
values1 = [3, 5, 2]
values2 = [4, 2, 5]
# 绘制条形折线图
plt.bar(categories, values1, color='blue', label='Bar Values')
plt.plot(categories, values2, color='red', marker='o', label='Line Values')
plt.title("Bar and Line Plot")
plt.ylabel("Values")
plt.legend()
plt.show()
