Matplotlib是一个著名的库,用于在Python中绘制图表。
pyplot是Matplotlib的子集,用于绘制2D图表。其中,plot()画图函数,用它可以绘制点和线。
示例代码:
# 导入matplotlib包
import matplotlib.pyplot as plt
import numpy as np
#plot()画图方法
def testPlot():
"""
plot()画图函数,是绘制二维图形的最基本函数,用它可以绘制点和线。
语法格式如下:
# 画单条线
plot([x], y, [fmt], *, data=None, **kwargs)
# 画多条线
plot([x], y, [fmt], [x2], y2, [fmt2], ..., **kwargs)
参数说明:
x, y:点或线的节点,x 为 x 轴数据,y 为 y 轴数据,数据可以列表或数组,只能是秩为1的数组。
fmt:可选,定义基本格式(如颜色、标记和线条样式)。多条曲线不指定颜色时,会自动选择不同颜色。
颜色字符:'b' 蓝色,'m' 洋红色,'g' 绿色,'y' 黄色,'r' 红色,'k' 黑色,'w' 白色,'c' 青绿色,'#008000' RGB 颜色符串。
线型参数:'‐' 实线,'‐‐' 破折线,'‐.' 点划线,':' 虚线。
标记字符:'.' 点标记,',' 像素标记(极小点),'o' 实心圈标记,'v' 倒三角标记,'^' 上三角标记,'>' 右三角标记,'<' 左三角标记...等等。
**kwargs:可选,用在二维平面图上,设置指定属性,如标签,线的宽度等。
"""
# Matplotlib默认情况不支持中文,添加仿宋字体
plt.rcParams['font.family'] = ['STFangsong']
# 构建4个坐标点
Xpoints = np.array([0,4])
Ypoints = np.array([0,8])
XXpoints = np.array([0, 4])
YYpoints = np.array([0, 4])
# 绘制图形:通过两个坐标 (0,0) 到 (4,8) 来绘制一条线,颜色红色.
plt.plot(Xpoints,Ypoints,"r",label = "(1)班成绩") # 参数label=''传入字符串类型的值,也就是图例的名称
# 绘制图形:通过两个坐标 (0,4) 到 (0,4) 来绘制一条线,颜色蓝色.
plt.plot(XXpoints, YYpoints, "b", label="(2)班成绩") # 参数label,设置图例的名称
# 设置横轴和纵轴标签
plt.xlabel("x轴")
plt.ylabel("y轴")
# 设置标题
plt.title("学生期中考试成绩")
# 添加图例
legend = plt.legend(loc='upper left',shadow = True) # shadow设置图例背景为灰色
frame = legend.get_frame() # 获得图例背景
frame.set_facecolor("0.9") # 设置图例背景透明度
# 通过4个坐标,绘制2条线
plt.plot(Xpoints,Ypoints,XXpoints,YYpoints)
# 通过2个坐标 (0,0) 到 (4,8) 来绘制2个点,颜色绿色.
plt.plot(Xpoints,Ypoints,"g.")
# 可以绘制任意数量的点,只需确保两个轴上的点数相同即可。
XXXpoints = np.array([1, 2, 6, 8])
YYYpoints = np.array([3, 8, 1, 10])
plt.plot(XXXpoints, YYYpoints)
# 如果不指定 x 轴上的点,则x会根据y的值来设置为 0, 1, 2, 3..N-1。
plt.plot(YYYpoints)
# 绘制正弦和余弦图
x = np.arange(0, 4 * np.pi, 0.1) # start,stop,step
y = np.sin(x)
z = np.cos(x)
plt.plot(x, y, x, z)
# 展示图形
plt.show()
设置图例
第一步:给plt.plot( )中参数label=’'传入字符串类型的值,也就是图例的名称
第二步:使用plt.legend( )使上述代码产生效果
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
n = np.linspace(-5, 4, 30)
m1 = 3 * n + 2
m2 = n ** 2
plt.xlabel('时间')
plt.ylabel('心情')
plt.plot(n, m1, color='r', linewidth=1.5, linestyle='-', label='女生购物欲望')
plt.plot(n, m2, 'b', label='男生购物欲望')
plt.legend()
plt.show()
图片读取与展示
import matplotlib.image as mpimg
# python中图片读取与展示
def testImshow():
"""
plt.waitforbuttonpress()
等待用户输入,
如果键被按下则返回True,关闭图片
如果鼠标按钮被按下则返回False,最小化图片
如果在超时秒内没有输入则返回None。 负值使超时失效。
"""
# 读取图片:将图片转换为数组
img = mpimg.imread("孩童.jpg") # 读出来的值为0-1
# 获取img数组的维度
print(img.shape) # (436, 600, 3) 图片的像素是436*600
# 展示图片:将数组转换为图片
plt.imshow(img)
# 用于阻止与图形交互的调用
plt.waitforbuttonpress()
使用scatter()函数绘制散点图
# 绘制散点图
def testScatter():
"""
我们可以使用 pyplot 中的 scatter() 方法来绘制散点图。
scatter() 方法语法格式如下:
pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None,vmin=None,vmax=None,
alpha=None, linewidths=None, *, edgecolors=None, plotnonfinite=False, data=None, **kwargs)
参数说明:
x,y:长度相同的数组,也就是我们即将绘制散点图的数据点,输入数据。
s:点的大小,默认 20,也可以是个数组,数组每个参数为对应点的大小。
c:点的颜色,默认蓝色 'b',也可以是个 RGB 或 RGBA 二维行数组。
marker:点的样式,默认小圆圈 'o'。
cmap:Colormap,默认 None,标量或者是一个 colormap 的名字,只有 c 是一个浮点数数组的时才使用。如果没有申明就是 image.cmap。
norm:Normalize,默认 None,数据亮度在 0-1 之间,只有 c 是一个浮点数的数组的时才使用。
vmin,vmax::亮度设置,在 norm 参数存在时会忽略。
alpha::透明度设置,0-1 之间,默认 None,即不透明。
linewidths::标记点的长度。
edgecolors::颜色或颜色序列,默认为 'face',可选值有 'face', 'none', None。
plotnonfinite::布尔值,设置是否使用非限定的 c ( inf, -inf 或 nan) 绘制点。
**kwargs::其他参数。
"""
# Matplotlib默认情况不支持中文,添加仿宋字体
plt.rcParams['font.family'] = ['STFangsong']
# 构建数组
a = np.arange(1,11)
b = np.arange(12,22)
# 调用scatter()方法绘制散点图
plt.scatter(a,b,s=40,c="y",cmap=plt.cm.Spectral,alpha=0.5)
# 添加标题
plt.title("散点图")
# 显示颜色条
plt.colorbar()
# 显示图形
plt.show()
运行效果:
使用grid()设置图表中的网格线
# meshgrid()生成网格点的坐标矩阵
def testMeshgrid():
"""
使用grid()方法设置图表中的网格线,生成网格点坐标矩阵
语法格式:
matplotlib.pyplot.grid(b=None, which='major', axis='both', )
参数说明:
b:可选,默认为 None,可以设置布尔值,true 为显示网格线,false 为不显示,如果设置 **kwargs 参数,则值为 true。
which:可选,可选值有 'major'、'minor' 和 'both',默认为 'major',表示应用更改的网格线。
axis:可选,设置显示哪个方向的网格线,可以是取 'both'(默认),'x' 或 'y',分别表示两个方向,x 轴方向或 y 轴方向。
**kwargs:可选,设置网格样式,可以是 color='r', linestyle='-' 和 linewidth=2,分别表示网格线的颜色,样式和宽度。
"""
# 创建坐标点数据
Xpoints = np.array([1, 2, 3, 4, 5])
Ypoints = np.array([1, 2, 3, 4, 5])
# 调用画图方法
plt.plot(Xpoints, Ypoints, "r.", linestyle='')
# 设置图表中的网格线
plt.grid(True)
# 显示图片
plt.show()
"""
使用meshgrid()方法生成网格点的坐标矩阵,
即从坐标向量中返回坐标矩阵
语法格式:
X,Y = numpy.meshgrid(x, y)
输入的x,y,就是网格点的横纵坐标列向量(非矩阵)
输出的X,Y,就是坐标矩阵
"""
YYpoints = np.array([1, 2, 3])
# 从坐标向量中返回坐标矩阵
X, Y = np.meshgrid(Xpoints, YYpoints )
# 调用画图方法
plt.plot(X, Y, "r.", linestyle='') # 线型为空,也即点与点之间不用线连接
# 设置图表中的网格线
plt.grid(True)
# 显示图片
plt.show() # 5 * 3 = 15个
使用 subplot()方法来绘制多个子图
# subplot()方法来绘制多个子图
def testSubplotS():
"""
描述:
使用 subplot()方法来绘制多个子图。
subplot() 方法在绘图时需要指定位置,subplots() 方法可以一次生成多个,在调用时只需要调用生成对象的 ax 即可。
语法:
subplot(nrows, ncols, index, **kwargs)
subplot(pos, **kwargs)
subplot(**kwargs)
subplot(ax)
以上函数将整个绘图区域分成 nrows 行和 ncols 列,
然后从左到右,从上到下的顺序对每个子区域进行编号 1...N ,
左上的子区域的编号为 1、右下的区域编号为 N,编号可以通过参数 index 来设置。
设置 numRows = 1,numCols = 2,就是将图表绘制成 1x2 的图片区域,
对应的坐标为:(1, 1), (1, 2)
plotNum = 1, 表示的坐标为(1, 1), 即第一行第一列的子图。
plotNum = 2, 表示的坐标为(1, 2), 即第一行第二列的子图。
"""
# plot 1:
xpoints = np.array([0, 6])
ypoints = np.array([0, 100])
# subplot() 方法在绘图时需要指定位置
plt.subplot(1, 2, 1)
plt.plot(xpoints, ypoints)
plt.title("plot 1")
# plot 2:
x = np.array([1, 2, 3, 4])
y = np.array([1, 4, 9, 16])
# subplot() 方法在绘图时需要指定位置
plt.subplot(1, 2, 2)
plt.plot(x, y)
plt.title("plot 2")
# 总标题
plt.suptitle("RUNOOB subplot Test")
plt.show() # 设置多个子图,只显示一次
运行结果: