matplotlib
是一个强大的Python绘图库,用于创建高质量的静态、动态和交互式图表。它提供了广泛的绘图选项,适用于数据可视化、科学计算、工程绘图等多个领域。
主要特点:
matplotlib
支持各种常见的图表类型,包括折线图、散点图、柱状图、饼图、箱线图、等高线图等。这使得你可以根据不同需求选择最适合的图表类型来展示数据。matplotlib
提供了丰富的配置选项,允许你自定义图表的各个方面,包括线条样式、颜色、坐标轴刻度、标签、标题等。你可以通过调整这些参数来使图表符合你的需求,并保证图表的美观与易读性。matplotlib
可以将图表保存为多种格式,如图像文件(PNG、JPEG、SVG等)、PDF文档等。这方便了图表的保存和共享,使其可以在各种媒介上使用。matplotlib
可以与其他库(如NumPy、Pandas、Seaborn)以及IPython等交互式环境相结合,实现动态和交互式的数据可视化。这让你能够通过操作图表来探索和分析数据。pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
import matplotlib
print(matplotlib.__version__) #3.8.0
对象 | 描述 |
---|---|
Figure(图形) | 包含了所有的绘图元素 |
Axes(坐标轴) | Figure对象可以包含一个或多个Axes对象。通过add_subplot()方法可以创建和添加多个Axes对象 |
Axis(坐标系) | 控制坐标轴的刻度、标签和范围等属性 |
Title(标题) | Figure对象可以有一个或多个标题 |
Legend(图例) | 显示图例,即解释图表中不同元素的标签和样式 |
Tick(刻度标签) | Tick对象代表坐标轴上的刻度线和刻度标签。 |
Axis Labels(轴标签) | 轴标签,xlable、ylable |
Annotation(注释) | 添加带有标签的注释 |
import matplotlib.pyplot as plt
# 创建 Figure 和 Axes 对象
fig, ax = plt.subplots()
# 绘制曲线
x = [1, 2, 3, 4, 5]
y = [10, 20, 30, 40, 50]
ax.plot(x, y, label='Line')
# 设置标题
ax.set_title('My Plot')
# 设置 x 轴和 y 轴标签
ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis')
# 设置刻度标签
ax.set_xticks([1, 2, 3, 4, 5]) # 设置 x 轴刻度位置
ax.set_xticklabels(['A', 'B', 'C', 'D', 'E']) # 设置 x 轴刻度标签
ax.set_yticks([0, 20, 40, 60]) # 设置 y 轴刻度位置
ax.set_yticklabels(['zero', 'twenty', 'forty', 'sixty']) # 设置 y 轴刻度标签
# 添加图例
ax.legend()
# 添加网格
ax.grid()
# 添加注释
ax.annotate('Max value', xy=(4, 40), xytext=(4, 30),
arrowprops=dict(arrowstyle='->'))
# 保存图形
plt.savefig('my_plot.png')
# 显示图形
plt.show()
创建一个包含多个子图(Axes
对象)的Figure
对象
fig, ax = plt.subplots(nrows=1, ncols=1, ...)
nrows
:子图的行数,默认为1。ncols
:子图的列数,默认为1。sharex
、sharey
等,用于指定子图是否共享坐标轴、网格等属性。返回值:一个包含Figure
和一个或多个Axes
对象的元组(fig, ax)
import matplotlib.pyplot as plt
# 创建一个包含2行2列的子图布局
fig, ax = plt.subplots(nrows=2, ncols=2) # axes
# 在第一个子图(ax[0, 0])中绘制折线图
ax[0, 0].plot([1, 2, 3], [1, 4, 9])
ax[0, 0].set_title('Subplot 1')
# 在第二个子图(ax[0, 1])中绘制散点图
ax[0, 1].scatter([1, 2, 3], [1, 4, 9])
ax[0, 1].set_title('Subplot 2')
# 在第三个子图(ax[1, 0])中绘制柱状图
ax[1, 0].bar(['A', 'B', 'C'], [3, 2, 5])
ax[1, 0].set_title('Subplot 3')
# 在第四个子图(ax[1, 1])中绘制饼图
ax[1, 1].pie([2, 4, 6])
ax[1, 1].set_title('Subplot 4')
# 调整子图之间的间距
plt.tight_layout()
# 显示图形
plt.show()
Figure
、Axes
和其他绘图对象来构建图表。Figure
对象,然后在其中添加一个或多个Axes
对象来绘制数据。Axes
对象调用各种方法来设置坐标轴、添加线条、散点、图例等。以下是一个使用面向对象范式绘制折线图的简单示例:
import matplotlib.pyplot as plt
# 创建一个空白的Figure对象和一个Axes对象
fig, ax = plt.subplots()
# 绘制折线图
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]
ax.plot(x, y)
# 设置标题、坐标轴标签等
ax.set_title('My First Plot')
ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis')
# 显示图形
plt.show()
pyplot
模块中的函数来绘制图表,而不需要显式地创建和操作Figure
和Axes
对象。以下是一个使用快速绘图范式绘制折线图的简单示例:
import matplotlib.pyplot as plt
# 绘制折线图
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]
plt.plot(x, y)
# 设置标题、坐标轴标签等
plt.title('My First Plot')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
# 显示图形
plt.show()
在matplotlib
中,可以使用color
参数来修改线条的颜色。下面介绍两种常用的方法来指定线条的颜色:
matplotlib
提供了一些预定义的颜色名称,如'blue'
、'red'
、'green'
等。color
参数的值传递给绘图函数。plt.plot(x, y, color='blue')
会将线条颜色设置为蓝色。import matplotlib.pyplot as plt
import numpy as np
# 创建一个包含100个元素的等间隔数组x,其取值范围从0到5(包含0和5)
x = np.linspace(0, 5, 100)
plt.figure(figsize=(10, 5))
# 使用预定义的颜色名称设置线条颜色为红色
plt.subplot(1,2,1)
plt.plot(x, x, 'red')
# 使用预定义的颜色名称设置线条颜色为蓝色
plt.subplot(1,2,2)
plt.plot(x, x**2, 'blue')
# 显示图形
plt.show()
以下是一个示例,展示如何修改线条的颜色:
import matplotlib.pyplot as plt
import numpy as np
# 创建一个包含100个元素的等间隔数组x,其取值范围从0到5(包含0和5)
x = np.linspace(0, 5, 100)
plt.figure(figsize=(10, 5))
# 使用预定义的颜色名称设置线条颜色为红色
plt.subplot(1,2,1)
plt.plot(x, x, color='red')
# 使用RGBA颜色值设置线条颜色为蓝色,并设置透明度为0.5
plt.subplot(1,2,2)
plt.plot(x, x**2, color=[0, 0, 1, 0.5]) #设置线条颜⾊
# 显示图形
plt.show()
'-'
或'solid'
'--'
或'dashed'
':'
或'dotted'
'-.'
或'dashdot'
面向对象(Object-Oriented)范式
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]
# 创建一个2x2的子图布局,将整个图形分割为2行2列
fig, axes = plt.subplots(2, 2)
# 在第一个子图中绘制数据
axes[0, 0].plot(x, y, linestyle='-')
axes[0, 0].set_title('Plot 1')
# 在第二个子图中绘制数据
axes[0, 1].plot(x, y, linestyle='--')
axes[0, 1].set_title('Plot 2')
# 在第三个子图中绘制数据
axes[1, 0].plot(x, y, linestyle=':')
axes[1, 0].set_title('Plot 3')
# 在第四个子图中绘制数据
axes[1, 1].plot(x, y, linestyle='-.')
axes[1, 1].set_title('Plot 4')
# 调整子图之间的间距
plt.tight_layout()
# 显示图形
plt.show()
快速绘图(Pyplot)范式
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]
plt.figure(figsize=(10, 5))
plt.subplot(2,2,1)
plt.plot(x, y, 'C0', linewidth=3, linestyle='solid')
plt.title('Plot 1')
plt.subplot(2,2,2)
plt.plot(x, y,'C1', linewidth=5, linestyle='dashed')
plt.title('Plot 2')
plt.subplot(2,2,3)
plt.plot(x, y,'C2', linewidth=5, linestyle='dotted')
plt.title('Plot 3')
plt.subplot(2,2,4)
plt.plot(x, y,'C3', linewidth=5, linestyle='dashdot')
plt.title('Plot 4')
# 调整子图之间的间距
plt.tight_layout()
plt.show()
import matplotlib.pyplot as plt
import numpy as np
plt.figure(figsize=(12,8))
fontsize = 16
# 绘制第⼀幅图:双折线图
plt.subplot(2,2,1)
# 创建一个包含100个元素的等间隔数组x,其取值范围从0到3(包含0和3)
x = np.linspace(0,3,100)
# 刻度设置为从0到4.5,步长为0.5的位置
plt.xticks(np.arange(0,4.5,0.5))
plt.yticks(np.arange(0,10,1))
#设置显示范围
plt.xlim(left=0, right=4)
plt.ylim(bottom=0, top=10)
plt.plot(x, x, 'C0', linewidth=3, linestyle='solid', label='$y=x$')
plt.plot(x, x**2, 'C1', linewidth=3, linestyle='solid', label='$y=x^2$')
plt.title('双折线图', fontsize=fontsize)
plt.xlabel('x轴标签', fontsize=fontsize)
plt.ylabel('y轴标签', fontsize=fontsize)
plt.annotate('$y=x$', xy=(2,2), fontsize=fontsize, color='C0',xytext= (+40,-40),textcoords='offset points',arrowprops = dict(arrowstyle='->'))
plt.annotate('$y=x^2$', xy=(2.5,6.25), fontsize=fontsize, color='C1',xytext= (+40,-40),textcoords='offset points',arrowprops = dict(arrowstyle='->'))
plt.legend(loc='upper left')
plt.grid()
#第⼆幅⼦图:绘制双柱状图
plt.subplot(2,2,2) #axes
labels = ['组1', '组2', '组3', '组4', '组5']
car1_sale = [20, 29, 32, 30, 27]
car2_sale = [23, 32, 30, 25, 25]
#创建一个与labels长度相同的数组,表示每个柱子的x坐标位置
x = np.arange(len(labels))
width = 0.35 # 柱状图的宽度
rects1 = plt.bar(x - width / 2, car1_sale, width, label='阿迪达斯', color='C1')
rects2 = plt.bar(x + width / 2, car2_sale, width, label='耐克', color='C2')
plt.ylabel('销量', fontsize=fontsize)
plt.title('两种品牌销量对比', fontsize=fontsize)
plt.xticks(x, labels, fontsize=fontsize)
plt.legend()
# 每个柱⼦上绘制y值
plt.bar_label(rects1, padding=3, fontsize=fontsize)
plt.bar_label(rects2, padding=3, fontsize=fontsize)
# 第三幅⼦图:绘制散点图
plt.subplot(2, 2, 3)
N = 45 # 散点个数
x = np.random.rand(N)
y = np.random.rand(N)
colors = np.random.rand(N)
area = (30 * np.random.rand(N)) ** 2
plt.scatter(x, y, s=area, c=colors, alpha=0.76)
plt.xlabel('x坐标', fontsize=fontsize)
plt.ylabel('y坐标', fontsize=fontsize)
plt.title('45个散点', fontsize=fontsize)
# 第四个⼦图:饼图
plt.subplot(2, 2, 4)
labels = [u'西兰花', u'土豆', u'胡罗卜', u'茄⼦'] # 定义标签
sizes = [120, 255, 300, 80] # 每块值
colors = ['C0', 'C1', 'C2', 'C3'] # 每块颜⾊定义
explode = (0, 0, 0.03, 0) # 某⼀块分割,值越⼤分割间隙越⼤
_, text1, text2 = plt.pie(sizes,
explode=explode,
labels=labels,
colors=colors,
labeldistance=1.2, # 图例距圆⼼半径倍距离
autopct='%3.2f%%', # 数值保留固定⼩数位
shadow=False, # ⽆阴影设置
startangle=90, # 逆时针起始⻆度设置
pctdistance=0.8) # 数值距圆⼼半径倍数距离
# texts1饼图外label,texts2饼图内
for t in text1:
t.set_size(fontsize)
for t in text2:
t.set_size(fontsize)
plt.axis('equal')
plt.legend()
plt.tight_layout()
plt.show()