本文章类似于一篇学习笔记,matplotlib.pyplot是一个很实用的图像绘图模块,下面主要针对plot()绘图函数进行系统性的阐述。
目录
关于figure()
figure() 的基本使用
plt.figure() 常用参数
figsize 和 dpi
facecolor 和 edgecolor
图形的编号和重用
tight_layout 和 constrained_layout
add_subplot()和subplot()
add_subplot()
subplot()
subplot() 和 add_subplot() 的区别
tight_layout
constrained_layout
保存图形
关于plot
plot() 函数基础用法
plot() 中的基本参数
color:设置线的颜色
相关使用
单字母缩写
RGB 十六进制颜色
RGB 和 RGBA 颜色元组
matplotlib 的内置调色盘
linestyle:设置线型
linewidth:设置线宽
marker:标记数据点
相关参数详细介绍
marker 示例
标记的进一步定制
组合使用标记参数
仅绘制标记而无连线
组合使用参数
处理多条曲线
xlable和ylabel
xlabel() 和 ylabel() 的基本用法
xlabel() 和 ylabel() 的常用参数
参数详解及示例
fontsize 参数
fontdict 参数
color 参数
loc 参数
自定义轴标签的高级示例
结合 LaTeX 语法
其他常用参数
label:用于图例
默认图例显示
控制图例的位置
bbox_to_anchor 参数:自定义图例的位置
ncol 参数:控制图例的列数
fontsize 参数:控制图例字体大小
其他图例定制参数
关于图例部份没有显示完全解决方法
alpha:透明度
高级用法
设置坐标轴范围
设置坐标轴标签和图标题
解决问题:显示中文。
1. 使用支持中文的字体
方法 1:全局设置字体
方法 2:为单个图设置字体
2. 确认系统中可用的字体
3. 在不同操作系统上的字体设置
Windows 示例
macOS 示例
Linux 示例
4. 安装字体(如 SimHei)
示例:手动加载字体
5. 使用 matplotlib 的 rc 参数
fontsize 调整字体大小
关于figure()
plt.figure()
来创建一个图形(Figure)对象。也就是我们常说的幕布、画板,而在这之上,我们可以添加一个或多个子图,然后进行绘图操作。figure()
函数可以帮助控制整个图形窗口的大小、分辨率、背景色等。
figure()
的基本使用
plt.figure()
创建一个空白的图形窗口,之后可以通过添加子图来进行绘图。
代码:
import matplotlib.pyplot as plt
# 创建一个空白图形
fig = plt.figure()
# 展示图形
plt.show()
上述代码创建了一个空白的图形窗口,目前没有绘制任何内容,所以没有图像显示,但你已经创建了一个 Figure
对象。
plt.figure()
常用参数
下面时常见的参数:
下面将对这些参数和一些注意事项进行详细的阐述。
figsize
和 dpi
figsize
决定了图形的尺寸,而 dpi
决定了图形的分辨率。figsize
是以英寸为单位的,dpi
则是每英寸多少个像素点(点每英寸)。
# 创建一个宽8英寸、高6英寸的图形,分辨率为120 DPI
fig = plt.figure(figsize=(8, 6), dpi=120)
# 添加一个子图并绘制内容
ax = fig.add_subplot(111)
ax.plot([1, 2, 3], [4, 5, 6])
plt.show()
结果:
我们创建了一个 8 x 6 英寸的图形,分辨率dpi为 120 DPI。
这边dpi建议默认(默认100)的就行,因为太高的话会影响运行速率比如: 1080
facecolor
和 edgecolor
可以用 facecolor
来设置图形的背景颜色,edgecolor
来设置图形的边框颜色。
代码:
# 设置图形背景颜色为 'lightgray',边框颜色为 'blue'
fig = plt.figure(facecolor='lightgray', edgecolor='blue')
ax = fig.add_subplot(111)
ax.plot([1, 2, 3], [4, 5, 6])
plt.show()
结果:
至于详细的,比如更换那些颜色,怎么更换,大家可以手动查一下就可以了。
图形的编号和重用
num
参数可以用来指定图形的编号或名称。- 如果
num
是整数,则指定图形的编号;如果是字符串,则指定图形的名称。 - 如果创建一个已有编号或名称的图形,
matplotlib
会自动切换到该图形。
示例代码:
# 创建图形编号为1的图
fig1 = plt.figure(num=1)
plt.plot([1, 2, 3], [4, 5, 6])
plt.title('Figure 1')
# 切换到图形编号2,并创建新图形
fig2 = plt.figure(num=2)
plt.plot([3, 2, 1], [6, 5, 4])
plt.title('Figure 2')
# 再次切换回图形1
plt.figure(num=1)
plt.plot([1, 3, 2], [4, 6, 5])
plt.title('Updated Figure 1')
plt.show()
结果:
、
在这个例子中,创建了两个图形,并在图形间来回切换。plt.figure()
函数可以用于切换到已有的图形。 这个一般我们用不到,相当于给figure创建的画布或者说幕布,就是后面的白板,咱们就一直叫白板吧,当你给白板加入编号的时候,要知道这些白板都具有属性的。所以当你使用之前白板的编号时相当于直接把对应编号的白板拿过来用了。(ps:我是这么理解的,可能有问题,欢迎指正。)
tight_layout
和 constrained_layout
这两个参数就涉及到多图像显示的问题了。
我们用来作为最后背景的白板上的其他小型白板就是所谓的子图。
tight_layout
用于自动调整子图布局,防止标签或轴标题重叠。constrained_layout
是matplotlib
更高级的布局调整工具,它比tight_layout
更加智能。(constrained_layout=True
自动调整了子图的布局,避免了标题、轴标签和子图之间的重叠。)
其实现在的话一般就是使用constrained_layout=True
。
那么如何使用他们,首先我们要知道的时如何添加子图。add_subplot()和subplot()可以实现这一功能。
这两个功能一样,使用起来略有区别,首先add_subplot属于Figure模块,subplot并不是。:
add_subplot()和subplot()
add_subplot()
先看示例:
fig = plt.figure(figsize=(6, 6))
# 创建 2x2 网格中的第一个子图
ax1 = fig.add_subplot(221)
ax1.plot([1, 2, 3], [4, 5, 6])
ax1.set_title('Subplot 1')
# 创建 2x2 网格中的第二个子图
ax2 = fig.add_subplot(222)
ax2.plot([1, 2, 3], [6, 5, 4])
ax2.set_title('Subplot 2')
# 创建 2x2 网格中的第三个子图
ax3 = fig.add_subplot(223)
ax3.plot([1, 2, 3], [7, 8, 9])
ax3.set_title('Subplot 3')
# 创建 2x2 网格中的第四个子图
ax4 = fig.add_subplot(224)
ax4.plot([1, 2, 3], [9, 8, 7])
ax4.set_title('Subplot 4')
plt.show()
或者:
fig = plt.figure(figsize=(6, 6))
# 创建 2x2 网格中的第一个子图
ax1 = fig.add_subplot(2,2,1)
ax1.plot([1, 2, 3], [4, 5, 6])
ax1.set_title('Subplot 1')
# 创建 2x2 网格中的第二个子图
ax2 = fig.add_subplot(2,2,2)
ax2.plot([1, 2, 3], [6, 5, 4])
ax2.set_title('Subplot 2')
# 创建 2x2 网格中的第三个子图
ax3 = fig.add_subplot(2,2,3)
ax3.plot([1, 2, 3], [7, 8, 9])
ax3.set_title('Subplot 3')
# 创建 2x2 网格中的第四个子图
ax4 = fig.add_subplot(224)
ax4.plot([1, 2, 3], [9, 8, 7])
ax4.set_title('Subplot 4')
结果
add_subplot()
是 figure
对象的方法,用来在 figure
上添加子图,返回一个 Axes
对象。它可以接受三种形式的参数。
fig.add_subplot(nrows, ncols, index, **kwargs)
nrows
:表示子图布局的行数。ncols
:表示子图布局的列数。index
:表示要创建的子图的位置,从左到右,从上到下,子图索引从1
开始。
相关参数详解:
projection
:指定投影类型,可以是'rectilinear'
(默认)、'polar'
(极坐标)等。polar
:设置为True
时,子图为极坐标图。sharex
/sharey
:指定共享 x 或 y 轴。label
:指定子图的标签。box_aspect
:设置子图的宽高比。
import matplotlib.pyplot as plt
fig = plt.figure()
# 添加一个2行2列的子图,子图位置是第1个
ax1 = fig.add_subplot(2, 2, 1)
ax1.plot([1, 2, 3])
# 添加一个2行2列的子图,子图位置是第2个
ax2 = fig.add_subplot(2, 2, 2)
ax2.plot([3, 2, 1])
# 添加一个2行2列的子图,子图位置是第3个
ax3 = fig.add_subplot(2, 2, 3)
ax3.plot([1, 3, 2])
plt.show()
结果:
add_subplot()
也支持 3 位数的简写形式
fig.add_subplot(221) # 相当于 fig.add_subplot(2, 2, 1)
其中 221
表示:2 行、2 列、子图索引为 1。
使用tight_layout和constrained_layout就是可以合理的调整这些子图让他们自动的以一种合适的方式进行排列。
subplot()
subplot()
是 matplotlib.pyplot
中的函数,用来创建子图。它与 add_subplot()
类似,区别在于它可以更简洁地在当前 figure 中创建子图。
plt.subplot(nrows, ncols, index, **kwargs)
和 add_subplot()
的参数相同:
nrows
:子图行数。ncols
:子图列数。index
:子图的位置索引,从1
开始。
示例:
import matplotlib.pyplot as plt
# 创建一个2行2列的子图布局,选择第1个子图
plt.subplot(2, 2, 1)
plt.plot([1, 2, 3])
# 选择第2个子图
plt.subplot(2, 2, 2)
plt.plot([3, 2, 1])
# 选择第3个子图
plt.subplot(2, 2, 3)
plt.plot([1, 3, 2])
plt.show()
结果:
简写形式
与 add_subplot()
一样,subplot()
也支持简写形式:
plt.subplot(221) # 相当于 plt.subplot(2, 2, 1)
subplot()
和 add_subplot()
的区别
- 调用方式不同:
add_subplot()
是figure
对象的方法,而subplot()
是matplotlib.pyplot
的全局方法。subplot()
直接在当前 figure 中创建子图。 - 功能基本一致:它们都可以用来添加子图,支持同样的参数和功能。
其他的就不多说了。
tight_layout
示例:
fig = plt.figure(figsize=(8, 6))
ax1 = fig.add_subplot(211)
ax1.plot([1, 2, 3], [4, 5, 6])
ax1.set_title('Subplot 1')
ax2 = fig.add_subplot(212)
ax2.plot([1, 2, 3], [4, 5, 6])
ax2.set_title('Subplot 2')
# 自动调整布局,防止标题和轴标签重叠
plt.tight_layout()
plt.show()
如果没有使用 tight_layout(),是如下的效果:
这个例子可能看不出来什么,当你选择一下子显示十多张甚至几十张图片的时候,这种处理子图的方法可以明显的让图像更美观。
另外,使用该方法可能会出现以下爆红:
UserWarning: The figure layout has changed to tight...... 这个是警告不是错误,而是一个通知,告诉你Matplotlib已经根据你的图表内容调整了布局。
constrained_layout
这个跟上一个处理方法的功能一样,只是更智能一点,这两个用哪个都可以。
示例代码:
fig = plt.figure(figsize=(8, 6), constrained_layout=True)
ax1 = fig.add_subplot(211)
ax1.plot([1, 2, 3], [4, 5, 6])
ax1.set_title('Subplot 1')
ax2 = fig.add_subplot(212)
ax2.plot([1, 2, 3], [4, 5, 6])
ax2.set_title('Subplot 2')
plt.show()
结果:
保存图形
savefig()
方法将图形保存到文件中。
代码:
fig = plt.figure(figsize=(6, 4))
plt.plot([1, 2, 3], [4, 5, 6])
# 保存图形为 PNG 文件
plt.savefig('figure.png', dpi=300, bbox_inches='tight')
注意,这东西是保存的我们显示的东西,什么意思呢,就是指白板上显示什么它保存什么。可以尝试一下,你会发现,它并不适合单纯的保存图片。
关于plot
plot()
函数是用于绘制2D图形的主要函数,它可以绘制线图、散点图、带有误差条的图等。
plot()
函数基础用法
示例:生成一条从 x=0 到 x=10 的正弦曲线。plot(x, y)
函数的基本形式中,x
是横坐标数据,y
是纵坐标数据。
import matplotlib.pyplot as plt
import numpy as np
# 示例数据
x = np.linspace(0, 10, 100)
y = np.sin(x)
# 绘图
plt.plot(x, y)
plt.show()
plot()
中的基本参数
前两个一个参数一个对应x轴的数,一个对应 y轴的数,这两个参数属于基础用法,不多做赘述。
color
:设置线的颜色
你可以通过 color
参数指定线的颜色。常见的颜色格式有颜色缩写(例如 'r'
代表红色)或颜色名(例如 'red'
)。
plt.plot(x, y, color='red') # 使用名称
plt.plot(x, y, color='g') # 使用缩写
相关使用
单字母缩写
RGB 十六进制颜色
你可以使用 #RRGGBB
格式的十六进制字符串来指定颜色。例如:
'#ff0000'
:红色'#00ff00'
:绿色'#0000ff'
:蓝色
RGB 和 RGBA 颜色元组
可以使用一个元组 (R, G, B)
或者 (R, G, B, A)
来指定颜色,其中 R、G、B 是[0, 1] 范围内的浮点数,代表红色、绿色、蓝色的成分,A 是可选的透明度(alpha)。
例如:
plt.plot(x, y1, color=(0.1, 0.2, 0.5), label='RGB 颜色')
plt.plot(x, y2, color=(0.1, 0.2, 0.5, 0.5), label='RGBA 颜色(带透明度)')
matplotlib
的内置调色盘
matplotlib
还提供了多种预定义的调色盘,例如:
'C0'
到'C9'
:代表内置颜色循环中的10种颜色(默认颜色循环)- 使用 CSS4 的颜色名:
matplotlib
支持超过140种颜色名,你可以直接使用 CSS4 标准中的颜色名,例如'salmon'
、'gold'
等。
plt.plot(x, y1, color='salmon', label='Salmon 颜色')
示例:使用不同的颜色和线型
plt.plot(x, y1, color='r', linestyle='--', label='红色虚线')
plt.plot(x, y2, color='#1f77b4', linestyle='-.', label='自定义颜色和点划线')
plt.legend()
plt.show()
linestyle
:设置线型
可以通过 linestyle
参数控制线条的样式。常见的值包括:
'-'
:实线(默认)'--'
:虚线':'
:点线'-.'
:点划线
plt.plot(x, y, linestyle='--')
示例:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
# 绘制不同线型
plt.plot(x, y1, linestyle='-', label='实线')
plt.plot(x, y2, linestyle='--', label='虚线')
plt.legend()
plt.show()
其中的方块是中文没有显示,这个后面再说。
此外,你还可以定义自定义的线型模式。matplotlib
支持传入一个由破折号长度和空白长度组成的列表,来定义更加复杂的线型:
plt.plot(x, y1, linestyle=(0, (5, 2, 1, 2)), label='自定义线型')
这里的 (5, 2, 1, 2)
表示先绘制5个单位长度的实线,然后2个单位长度的空白,再绘制1个单位长度的实线,然后2个单位长度的空白,形成一个自定义线型。
linewidth
:设置线宽
可以通过 linewidth
参数指定线条的宽度(单位为点数,pt)
plt.plot(x, y, linewidth=2.5)
marker
:标记数据点
marker
参数用于指定数据点的标记样式。标记符号可以让图中的数据点更加突出。标记的大小、颜色等也可以进一步定制。常见的标记符号包括:
'o'
:圆点's'
:方块'^'
:三角形
plt.plot(x, y, marker='o')
相关参数详细介绍
marker
示例
以下是如何使用不同的标记符号的示例:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 10)
y = np.sin(x)
# 使用不同的标记符号
plt.plot(x, y, marker='o', label='圆标记')
plt.plot(x, y+1, marker='s', label='方形标记')
plt.plot(x, y+2, marker='^', label='正三角标记')
plt.legend()
plt.show()
结果:(方块是中文,如何显示中文以后再说)
顺便提一嘴,左下角的这一块就是图例,图例这个之后再说。
在上面的例子中,我们分别使用了圆形、方形和三角形标记来标记不同的曲线。
标记的进一步定制
markersize
参数
markersize
参数用于控制标记的大小(默认大小为6)。可以通过调整 markersize
来放大或缩小标记。其实就是控制标记的大小尺寸的一个参数,并没有什么可说的。
plt.plot(x, y, marker='o', markersize=10, label='大圆标记')
markerfacecolor
和 markeredgecolor
参数
markerfacecolor
:控制标记的内部填充颜色。markeredgecolor
:控制标记的边框颜色。
plt.plot(x, y, marker='o', markersize=10, markerfacecolor='red', markeredgecolor='blue', label='红色填充,蓝色边框')
没什么可说的,自己可以尝试一下。
markeredgewidth
参数
markeredgewidth
参数用于控制标记边框的宽度。通过设置边框宽度,可以突出标记的外部轮廓。
plt.plot(x, y, marker='o', markersize=10, markeredgewidth=2, label='加粗边框')
自行尝试。
组合使用标记参数
可以将不同的标记参数组合起来,实现个性化的图形标记:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 10)
y = np.sin(x)
plt.plot(x, y, marker='s', markersize=12, markerfacecolor='yellow', markeredgecolor='red', markeredgewidth=3, label='方形标记')
plt.legend()
plt.show()
我们绘制了一个黄色填充的方形标记,外部使用了3个单位宽的红色边框。
仅绘制标记而无连线
如果只想绘制标记而不显示连接它们的线条,可以将 linestyle
设置为 ''
或者 None
:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 10)
y = np.sin(x)
plt.plot(x, y, marker='o', linestyle='None', label='仅标记')
plt.legend()
plt.show()
可以看到确实没线了,就剩下标记了。
组合使用参数
可以将多个参数组合使用。例如,绘制一条红色的虚线,带有圆形标记的数据点:
plt.plot(x, y, color='r', linestyle='--', marker='o', linewidth=2)
结果就不放了,上面的代码就只是一个样例代码,大家可以手动尝试,只要记住多个参数可以一起使用就好。
处理多条曲线
这一点很重要。
plot()
函数可以同时绘制多条曲线。只需传递多组 x
和 y
数据:
示例:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 10)
y1 = np.sin(x)
y2 = np.cos(x)
plt.plot(x, y1, label='sin(x)')
plt.plot(x, y2, label='cos(x)')
# 添加图例
plt.legend()
plt.show()
结果:(右上角的一小块是图例)
xlable和ylabel
xlabel()
和 ylabel()
是 matplotlib
中用于设置图形中 x 轴和 y 轴标签的函数。它们能够为绘制的图形的 x 轴和 y 轴添加描述性标签,帮助读者更好地理解图中每个轴表示的含义。
xlabel()
和 ylabel()
的基本用法
plt.xlabel()
用于设置 x 轴标签。plt.ylabel()
用于设置 y 轴标签。
基本格式如下:
plt.xlabel('X轴标签')
plt.ylabel('Y轴标签')
示例
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y)
# 设置x轴和y轴标签
plt.xlabel('X-time')
plt.ylabel('Y-sin')
plt.show()
结果:
xlabel()
和 ylabel()
的常用参数
xlabel()
和 ylabel()
函数不仅可以设置文本标签,还可以定制标签的字体、大小、颜色、对齐方式等。以下是常用的参数:
label
:标签文本内容,即你要显示的文字。fontdict
:字典类型,用来指定字体的属性,如字体类型、大小、粗细等。fontsize
:设置字体大小。loc
:控制标签的对齐方式('left'
,'center'
,'right'
对于xlabel()
;'bottom'
,'center'
,'top'
对于ylabel()
)。color
:设置标签文字的颜色。
参数详解及示例
fontsize
参数
可以通过 fontsize
参数控制标签文本的字体大小。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y)
# 设置x轴和y轴标签,并调整字体大小
plt.xlabel('X ', fontsize=14)
plt.ylabel('Y ', fontsize=14)
plt.show()
结果:
fontdict
参数
fontdict
是一个字典,允许你更灵活地设置字体样式。它支持的属性包括 family
(字体类型)、size
(字体大小)、weight
(字体粗细)、size(大小)等。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
font = {'family': 'serif', 'color': 'darkred', 'weight': 'bold', 'size': 16}
plt.plot(x, y)
# 使用fontdict设置字体的多种属性
plt.xlabel('X ', fontdict=font)
plt.ylabel('Y ', fontdict=font)
plt.show()
结果:
color
参数
color
参数允许设置标签文本的颜色。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y)
# 设置不同颜色的轴标签
plt.xlabel('X 轴', color='blue')
plt.ylabel('Y 轴', color='green')
plt.show()
结果:(方块是汉字)
loc
参数
loc
参数控制标签的对齐方式。对于 xlabel()
,可以设置 'left'
, 'center'
, 'right'
;对于 ylabel()
,可以设置 'bottom'
, 'center'
, 'top'
。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y)
# 设置标签对齐方式
plt.xlabel('X ', loc='right')
plt.ylabel('Y ', loc='top')
plt.show()
结果:
自定义轴标签的高级示例
通过组合不同的参数,可以自定义复杂的轴标签样式。例如:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y)
# 自定义字体属性
font_x = {'family': 'monospace', 'color': 'darkblue', 'weight': 'bold', 'size': 14}
font_y = {'family': 'monospace', 'color': 'darkgreen', 'weight': 'bold', 'size': 14}
# 使用自定义字体属性和颜色,设置标签
plt.xlabel('times(s)', fontdict=font_x, loc='right')
plt.ylabel('zhenfu(fudu)', fontdict=font_y, loc='top')
plt.show()
结果:
在这个示例中,我们对 x 轴和 y 轴分别设置了不同的字体、颜色和对齐方式,使得图形更加个性化。
结合 LaTeX 语法
matplotlib
支持 LaTeX 语法,可以用于在标签中插入数学符号和公式。例如,如果想在 x 轴或 y 轴中加入数学公式,可以使用 LaTeX 格式的字符串。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y)
# 使用 LaTeX 表达式来展示数学符号
plt.xlabel(r'$x \, \mathrm{(seconds)}$', fontsize=14)
plt.ylabel(r'$\sin(x)$', fontsize=14)
plt.show()
结果:
这个不常用其实。
其他常用参数
label
:用于图例
在 matplotlib
中,如果要同时显示多条折线,通常会使用 label
参数为每条曲线添加标签,然后使用 plt.legend()
函数来显示图例。legend()
函数可以控制图例的显示位置。默认情况下,图例会显示在图的右上角。
默认图例显示
当使用 label
参数标注曲线,并调用 plt.legend()
函数时,默认的图例位置是在右上角:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
# 绘制两条曲线并添加标签
plt.plot(x, y1, label='sin(x)')
plt.plot(x, y2, label='cos(x)')
# 显示图例(默认在右上角)
plt.legend()
plt.show()
结果:(看左下角那一小块)
在这个例子中,legend()
默认会将图例放在右上角。
控制图例的位置
可以通过 plt.legend(loc=...)
参数来控制图例的位置。
loc
参数可以接受字符串或数字,代表图例相对于图的放置位置。下面是常见位置的描述:
示例:设置图例位置
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
plt.plot(x, y1, label='sin(x)')
plt.plot(x, y2, label='cos(x)')
# 设置图例位置为左上角
plt.legend(loc='upper left')
plt.show()
结果:
可以通过传递 loc
参数的数字值或字符串来设置图例的位置。比如:
plt.legend(loc=2) # 等价于 loc='upper left'
结果就不展示了,自己试试。
bbox_to_anchor
参数:自定义图例的位置
bbox_to_anchor
是 matplotlib
中用于精确定位图例(legend)的参数。它指定了图例的锚点相对于图形的位置,配合 loc
参数使用来控制图例的最终显示位置。
使用 loc
控制图例的大致方位,使用bbox_to_anchor
精确指定图例的位置。bbox_to_anchor
参数接受一个元组 (x, y)
,表示图例锚点的位置,通常与 loc
一起使用。
(x, y)
中的x
和y
是图例的锚点相对于图的坐标,通常是 [0, 1] 范围内的值。- 例如:
(0, 0)
表示左下角,(1, 1)
表示右上角。
bbox_to_anchor
可以接受一个或多个参数,定义图例的位置和大小。常见的格式如下:
plt.legend(loc='位置参数', bbox_to_anchor=(x, y), **kwargs)
loc
:控制图例的锚点在bbox_to_anchor
坐标上的哪个位置(如'upper right'
,'center'
,'lower left'
等)。bbox_to_anchor
:定义锚点的具体位置(x, y)
,x
和y
是相对图形坐标系的比例,(0, 0)
表示左下角,(1, 1)
表示右上角。
相关参数详解:
x
和y
:表示锚点的位置坐标,相对于图形的左下角为(0, 0)
,右上角为(1, 1)
。你可以使用大于 1 或小于 0 的值将图例放置在图形外面。- 宽度和高度(可选):可以进一步指定图例框的宽度和高度,格式为
(x, y, width, height)
,通常不需要。
示例:自定义位置
将图例放置在图形的外部,通过 bbox_to_anchor
进行细致调整。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
plt.plot(x, y1, label='sin(x)')
plt.plot(x, y2, label='cos(x)')
# 图例放在图的外部,右侧
plt.legend(loc='upper right', bbox_to_anchor=(1.2, 1))
plt.show()
结果:
在这个例子中,图例的位置通过 (1.2, 1)
调整到了图的右外侧。
这个拿来跟(1,1)左上角对比就行,第一个值比1大了,图例基于左上角右移动了,如果比1小的话,就基于左上角左移。第二个值也是如此,大,上移,小,下移。总之是需要一个参照的。
或者说,一整个图,从最左到最有为0-1,从最下到最上0-1 ,如果出现超过0-1这个范围的数,就代表图片出图标了。
ncol
参数:控制图例的列数
legend()
还提供了 ncol
参数,允许你控制图例的列数。默认情况下,图例是单列显示。如果有很多条曲线,可以将它们分成多列。
示例:设置图例为两列
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
plt.plot(x, y1, label='sin(x)')
plt.plot(x, y2, label='cos(x)')
# 设置图例为两列
plt.legend(loc='upper right', ncol=2)
plt.show()
结果:
fontsize
参数:控制图例字体大小
这个就跟着控制字体、图像符号得尺寸的一样,图例的尺寸也是可以调控的。
以通过 fontsize
参数来控制图例中文本的字体大小:
plt.plot(x, y1, label='sin(x)')
plt.plot(x, y2, label='cos(x)')
# 设置图例字体大小为12
plt.legend(loc='upper right', fontsize=12)
plt.show()
自己尝试,这个就给个使用示例样本。
其他图例定制参数
frameon
:控制是否显示图例的边框(True
/False
)。shadow
:是否为图例添加阴影(True
/False
)。title
:为图例添加标题。
示例:设置图例的边框、阴影和标题
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
plt.plot(x, y1, label='sin(x)')
plt.plot(x, y2, label='cos(x)')
plt.legend(loc='upper right', shadow=True, title='函数图例', frameon=True)
plt.show()
结果:(方块是中文)
关于图例部份没有显示完全解决方法
上面的图例例子中出现了图例没有展示完全的情况,这种情况最快速的解决方法其实是调整白板的尺寸,前面讲过如何调整,也可以调整图例的位置和大小来解决。
alpha
:透明度
alpha
参数控制曲线的透明度,取值范围是0到1。
plt.plot(x, y, alpha=0.5)
这个参数挺有意思的,上面是用法模板,大家自行尝试。
高级用法
设置坐标轴范围
可以使用 plt.xlim()
和 plt.ylim()
来设置坐标轴的范围。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
# y2 = np.cos(x)
plt.plot(x, y)
plt.xlim(0, 12) # 设置x轴范围
plt.ylim(-1.5, 1.5) # 设置y轴范围
plt.show()
结果:
设置坐标轴标签和图标题
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
# y2 = np.cos(x)
plt.plot(x, y)
plt.xlabel('x-axis') # 设置x轴标签
plt.ylabel('y-axis') # 设置y轴标签
plt.title('Sine Wave') # 设置图标题
plt.show()
结果:
解决问题:显示中文。
上面的实例中就出现了中文显示不出来以一种方框的形式代替,下面将介绍该问题的解决方法。
在 matplotlib
中显示中文需要进行一些设置,因为默认的字体不支持中文字符。如果直接使用中文,可能会出现乱码或方块显示的问题。为了正确显示中文,可以设置 matplotlib
使用支持中文的字体。
下面是显示中文的几种方法和步骤:
1. 使用支持中文的字体
matplotlib
默认使用的字体可能不支持中文字符,所以我们需要设置一个支持中文的字体,如 SimHei(黑体) 或 Microsoft YaHei(微软雅黑)。
方法 1:全局设置字体
通过 matplotlib
的 rcParams
来设置全局的字体,使其支持中文。
import matplotlib.pyplot as plt
import numpy as np
# 设置全局的字体为 SimHei (黑体) 来显示中文
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用黑体显示中文
plt.rcParams['axes.unicode_minus'] = False # 解决负号'-'显示为方块的问题
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y)
# 设置中文标签
plt.xlabel('时间 (秒)')
plt.ylabel('正弦值')
plt.title('正弦波示例')
plt.show()
结果:
font.sans-serif
:指定字体为SimHei
(黑体),这是一种常见的支持中文的字体。axes.unicode_minus
:解决负号(-
)显示为方块的问题。
注意: 这里的 ['SimHei']
是直接使用字体的名称,而不是字体文件的路径。
具体解释:
plt.rcParams['font.sans-serif'] = ['SimHei']
:这行代码设置全局字体为"SimHei"
(黑体)。SimHei
是一种常见的中文字体。如果你的系统已经安装了这个字体,它会自动应用到图中的所有文本元素(如图例、轴标签、标题等)。你不需要提供字体的路径,只需提供字体的名称。
方法 2:为单个图设置字体
你也可以只为特定的标签或图形设置字体,而不是全局设置。
这是我经常使用的方法,其实没有第一个那么好用感觉
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.cos(x)
plt.plot(x, y)
# 设置中文字体仅用于这个标签
plt.xlabel('时间 (秒)', fontproperties='SimHei')
plt.ylabel('余弦值', fontproperties='SimHei')
plt.title('余弦波示例', fontproperties='SimHei')
plt.show()
结果:
2. 确认系统中可用的字体
如果你不确定系统中有哪些支持中文的字体,可以通过 matplotlib
的 FontManager
查看所有可用的字体。
import matplotlib.font_manager as fm
# 获取系统中所有可用的字体
for font in fm.findSystemFonts(fontpaths=None, fontext='ttf'):
print(fm.FontProperties(fname=font).get_name())
执行这段代码后,你会看到系统中所有的可用字体名称。找到支持中文的字体名称,然后在代码中使用该字体。
比如我的:
3. 在不同操作系统上的字体设置
- Windows: 常见的支持中文的字体有
SimHei
(黑体)和Microsoft YaHei
(微软雅黑)。 - macOS: 可以使用
Heiti SC
(黑体简体)或PingFang SC
(苹方简体)。 - Linux: 可能需要安装中文字体包,如
SimHei
或Noto Sans CJK
。
Windows 示例
plt.rcParams['font.sans-serif'] = ['SimHei'] # SimHei 为 Windows 系统上常见的中文字体
plt.rcParams['axes.unicode_minus'] = False
macOS 示例
plt.rcParams['font.sans-serif'] = ['Heiti SC'] # Heiti SC 为 macOS 上支持中文的字体
plt.rcParams['axes.unicode_minus'] = False
Linux 示例
在 Linux 系统上,首先需要确保安装了支持中文的字体包(如 SimHei
或 Noto Sans CJK
)。安装字体后,可以通过 rcParams
配置字体。
# Ubuntu 安装 SimHei 字体
sudo apt-get install fonts-noto-cjk
然后在 Python 中设置:
plt.rcParams['font.sans-serif'] = ['Noto Sans CJK SC'] # Noto Sans CJK SC 为支持中文的字体
plt.rcParams['axes.unicode_minus'] = False
4. 安装字体(如 SimHei)
如果系统中没有中文字体,可以手动下载并安装字体。(这里可以理解为自动检索不到系统字体)在 Windows、macOS 和 Linux 系统中安装字体后,你可以使用 FontManager
加载字体。
示例:手动加载字体
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
# 手动加载字体文件 (SimHei.ttf)
font = FontProperties(fname='/path/to/SimHei.ttf')
x = [1, 2, 3]
y = [4, 5, 6]
plt.plot(x, y)
# 使用加载的字体设置中文标签
plt.xlabel('时间 (秒)', fontproperties=font)
plt.ylabel('数值', fontproperties=font)
plt.title('折线图', fontproperties=font)
plt.show()
注意: 这一块是填的自己的字体文件路径。
结果:
5. 使用 matplotlib
的 rc
参数
可以通过 rc
配置参数直接设置字体。
import matplotlib as mpl
x = [1, 2, 3]
y = [4, 5, 6]
# 使用 rc 函数设置字体
mpl.rc('font', family='SimHei') # 设置全局字体为 SimHei
plt.plot(x, y)
plt.xlabel('时间 (秒)')
plt.ylabel('值')
plt.title('示例')
plt.show()
结果:
fontsize 调整字体大小
调整文字大小的参数是 fontsize
,它适用于标签、标题、图例等元素,无论是中文字符还是英文字符都可以通过 fontsize
来调整字体大小。
很多方法例如只要是涉及到字的甭管是汉字还是英文啥的,都有这个参数。
提一嘴:图例的默认字体大小是10
很多的基本默认都是10,他们也会根据你的图标的大小之类自行调整,如果没有明确定义参数的大小的话
PS:以上就是关于画图基础用法和plot画图详细介绍和使用的所有内容,我也是从各个方面进行的资源整合,大家可以作为笔记来看,制作不易,如果可以请点了赞,非常感谢。