pyplot是Matplotlib的子库,提供了和Matlib类似的接口,能很方便用户绘制2D图表。
Pyplot 包含一系列绘图的相关函数,每个函数根据数据绘画出对应图像,也可以对当前的图像进行一些修改,例如:给图像加上标记,生新的图像,在图像中产生新的绘图区域等等。
首先使用import 导入pyplot库,并给出一个方便引用的别名plt.
import matplotlib.pyplot as plt
常用的绘图函数包括:
plot()
:用于绘制线图和散点图scatter()
:用于绘制散点图bar()
:用于绘制垂直条形图和水平条形图hist()
:用于绘制直方图pie()
:用于绘制饼图
除了这些基本的函数,pyplot 还提供了很多其他的函数,例如用于设置图表属性的函数、用于添加文本和注释的函数、用于保存图表到文件的函数等等。
在画图过程中报错,如AttributeError: module 'backend_interagg' has no attribute 'FigureCanvas'
导入
import matplotlib matplotlib.use('TkAgg') # 必须在导入 matplotlib.pyplot 之前设置 import matplotlib.pyplot as plt
画图可能出现中文乱码
plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus']=False plt.rcParams.update({'font.size': 20})
1.直线,折线,曲线,散点图
import matplotlib.pyplot as plt
import numpy as np
xpoints = np.array([0, 7])
ypoints = np.array([0, 60])
plt.plot(xpoints, ypoints)
plt.show()
如果只想绘制两个坐标点,可以使用 o 参数,表示一个实心圈的标记。
即用plt.plot(xpoints, ypoints, 'o')替换plt.plot(xpoints, ypoints)
如果绘制一条不规则线,坐标为 (1, 6) 、 (2, 3) 、(4, 7) 、(5, 0),对应的两个数组为:[1, 2, 3, 4] 与 [6, 3, 7, 0]。
x = np.array([1, 2, 3, 4]) y = np.array( [6, 3, 7, 0]) plt.plot(x, y,linestyle='--',marker='o')#‘--’表示虚线 绘图标记 marker='o' plt.show()
标记 | 符号 | 描述 |
---|---|---|
"." | | 点 |
"," | | 像素点 |
"o" | | 实心圆 |
"v" | | 下三角 |
"^" | | 上三角 |
"<" | | 左三角 |
">" | | 右三角 |
"1" | | 下三叉 |
"2" | | 上三叉 |
"3" | | 左三叉 |
"4" | | 右三叉 |
"8" | | 八角形 |
"s" | | 正方形 |
"p" | | 五边形 |
"P" | | 加号(填充) |
"*" | | 星号 |
"h" | | 六边形 1 |
"H" | | 六边形 2 |
"+" | | 加号 |
"x" | | 乘号 x |
"X" | | 乘号 x (填充) |
"D" | | 菱形 |
"d" | | 瘦菱形 |
"|" | | 竖线 |
"_" | | 横线 |
0 (TICKLEFT) | | 左横线 |
1 (TICKRIGHT) | | 右横线 |
2 (TICKUP) | | 上竖线 |
3 (TICKDOWN) | | 下竖线 |
4 (CARETLEFT) | | 左箭头 |
5 (CARETRIGHT) | | 右箭头 |
6 (CARETUP) | | 上箭头 |
7 (CARETDOWN) | | 下箭头 |
8 (CARETLEFTBASE) | | 左箭头 (中间点为基准) |
9 (CARETRIGHTBASE) | | 右箭头 (中间点为基准) |
10 (CARETUPBASE) | | 上箭头 (中间点为基准) |
11 (CARETDOWNBASE) | | 下箭头 (中间点为基准) |
"None", " " or "" | 没有任何标记 | |
'$...$' | | 渲染指定的字符。例如 "$f$" 以字母 f 为标记。 |
绘制一个正弦和余弦图,在 plt.plot() 参数中包含两对 x,y 值,第一对是 x,y,这对应于正弦函数,第二对是 x,z,这对应于余弦函数。
x1 = np.linspace(0, 15, 100) y1 = np.sin(x1) y2 = np.cos(x1) plt.plot(x1, y1, color="blue", linewidth=2,linestyle='--') plt.plot(x1, y2, color="red", linewidth=2,linestyle='-.')
linestyle的类型: '-', '--', '-.', ':', 'None', ' ', '', 'solid', 'dashed', 'dashdot', 'dotted'
网格线
x = np.array([1, 2, 3, 4]) y = np.array( [6, 3, 7, 0]) plt.title("X-Y")#标题 plt.xlabel('x轴') plt.ylabel('y轴') plt.plot(x, y,linestyle='--',marker='o',color='green')#‘--’表示虚线 plt.grid(color = 'r', linestyle = '-.', linewidth = 0.5) plt.show()
Matplotlib 绘制多图 subplot(nrows, ncols, index, **kwargs) 图的个数=nrows* ncols 当前为index图。
import matplotlib matplotlib.use('TkAgg') # 必须在导入 matplotlib.pyplot 之前设置 import matplotlib.pyplot as plt import numpy as np plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus']=False plt.rcParams.update({'font.size': 10}) #plot 1: x = np.array([1, 2, 3, 4]) y = np.array( [6, 3, 7, 0]) plt.subplot(1, 2, 1) plt.title("X-Y") plt.xlabel('x轴') plt.ylabel('y轴') plt.plot(x, y,linestyle='--',marker='o',color='green')#‘--’表示虚线 plt.grid(color = 'r', linestyle = '-.', linewidth = 0.5) plt.title("plot 1") #plot 2: x1 = np.linspace(0, 15, 100) y1 = np.sin(x1) y2 = np.cos(x1) plt.subplot(1, 2, 2) plt.xlabel('x轴') plt.ylabel('y轴') plt.plot(x1, y1, color="blue", linewidth=2,linestyle='--') plt.plot(x1, y2, color="red", linewidth=2,linestyle='dashdot') plt.title("plot 2") plt.suptitle("RUNOOB subplot Test") plt.show()
散点图
plt.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为散点的大小,
c颜色,
marker同上讲解,
norm数据颜色亮度(0,1)
, vmin=None, vmax=None数据亮度设置,norm存在时,忽略
alpha::透明度设置,0-1 之间,默认 None,即不透明。
linewidths:标记点的长度。
edgecolors::颜色或颜色序列,默认为 'face',可选值有 'face', 'none', None。
plotnonfinite::布尔值,设置是否使用非限定的 c ( inf, -inf 或 nan) 绘制点。
import matplotlib matplotlib.use('TkAgg') # 必须在导入 matplotlib.pyplot 之前设置 import matplotlib.pyplot as plt import numpy as np plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus']=False plt.rcParams.update({'font.size': 10}) x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]) y = np.array([1, 4, 9, 16, 7, 11, 23, 18,12,23,14,15,1, 23, 21,11,6, 13,3]) sizes = np.array([20,50,100,200,500,1000,60,90,20,50,100,200,500,1000,60,90,100,200,500]) colors = np.array(["red","green","black","orange","purple","beige","cyan","magenta","red","green","black","orange" ,"purple","beige","cyan","magenta","purple","beige","cyan"]) plt.title("RUNOOB Scatter Test") plt.scatter(x, y,s=sizes,c=colors,alpha=0.4) plt.show() 除了手动设置颜色,还可以通过颜色带设置,设置颜色条需要使用 cmap 参数,默认值为 'viridis',之后颜色值设置为 0 到 100 的数组。
import matplotlib matplotlib.use('TkAgg') # 必须在导入 matplotlib.pyplot 之前设置 import matplotlib.pyplot as plt import numpy as np plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus']=False plt.rcParams.update({'font.size': 10}) import matplotlib.pyplot as plt import numpy as np x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]) y = np.array([1, 4, 9, 16, 7, 11, 23, 18,12,23,14,15,1, 23, 21,11,6, 13,3]) sizes = np.array([20,50,100,200,500,1000,60,90,20,50,100,200,500,1000,60,90,100,200,500]) colors = np.array([0,5,10,15,20,25,30,35,40,45,50,55,60,60,70,75,80,90,100]) plt.scatter(x, y, c=colors, cmap='afmhot_r',s=sizes,alpha=0.6) plt.colorbar()#显示颜色条 plt.show()
其他的颜色带自查,举个栗子:
Blues | Blues_r |
Greens | Greens_r |
Reds | Reds_r |
2.柱状图
plt.bar(x, height, width=0.8, bottom=None, *, align='center', data=None, **kwargs)
x:浮点型数组,柱形图的 x 轴数据。
height:浮点型数组,柱形图的高度。
width:浮点型数组,柱形图的宽度。
bottom:浮点型数组,底座的 y 坐标,默认 0。
align:柱形图与 x 坐标的对齐方式,'center' 以 x 位置为中心,默认值。 'edge':将柱形图的左边缘与 x 位置对齐。要对齐右边缘的条形,可以传递负数的宽度值及 align='edge'。
**kwargs::其他参数。
import matplotlib matplotlib.use('TkAgg') # 必须在导入 matplotlib.pyplot 之前设置 import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus']=False plt.rcParams.update({'font.size': 10}) import matplotlib.pyplot as plt import numpy as np x = np.array(["bar-1", "bar-2", "bar-3", "bar-4"]) y = np.array([12, 22, 6, 18]) plt.bar(x, y, width=0.5,color = ["#4C5050","red","pink","#688B2F"],align='edge') plt.show()
只要将plt.bar()改成plt.barh(),width改成height即可。
3.饼图
plt.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=0, radius=1, counterclock=True, wedgeprops=None, textprops=None, center=0, 0, frame=False, rotatelabels=False, *, normalize=None, data=None)[source]
-
x:浮点型数组或列表,用来绘制饼图的数据,表示每个扇形的面积。
-
explode:数组,表示各个扇形之间的间隔,默认值为0。
-
labels:列表,各个扇形的标签,默认值为 None。
-
colors:数组,表示各个扇形的颜色,默认值为 None。
-
autopct:设置饼图内各个扇形百分比显示格式,%d%% 整数百分比,%0.1f 一位小数, %0.1f%% 一位小数百分比, %0.2f%% 两位小数百分比。
-
labeldistance:标签标记的绘制位置,相对于半径的比例,默认值为 1.1,如 <1则绘制在饼图内侧。
-
pctdistance::类似于 labeldistance,指定 autopct 的位置刻度,默认值为 0.6。
-
shadow::布尔值 True 或 False,设置饼图的阴影,默认为 False,不设置阴影。
-
radius::设置饼图的半径,默认为 1。
-
startangle::用于指定饼图的起始角度,默认为从 x 轴正方向逆时针画起,如设定 =90 则从 y 轴正方向画起。
-
counterclock:布尔值,用于指定是否逆时针绘制扇形
-
默认为 True,即逆时针绘制,False 为顺时针。
- wedgeprops :字典类型,默认值 None。用于指定扇形的属性,比如边框线颜色、边框线宽度等。例如:wedgeprops={'linewidth':5} 设置 wedge 线宽为5。
- textprops :字典类型,用于指定文本标签的属性,比如字体大小、字体颜色等,默认值为 None。
- center :浮点类型的列表,用于指定饼图的中心位置,默认值:(0,0)。
- frame :布尔类型,用于指定是否绘制饼图的边框,默认值:False。如果是 True,绘制带有表的轴框架。
- rotatelabels :布尔类型,用于指定是否旋转文本标签,默认为 False。如果为 True,旋转每个 label 到指定的角度。
-
data:用于指定数据。如果设置了 data 参数,则可以直接使用数据框中的列作为 x、labels 等参数的值,无需再次传递。
-
import matplotlib matplotlib.use('TkAgg') # 必须在导入 matplotlib.pyplot 之前设置 import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus']=False plt.rcParams.update({'font.size': 10}) y = np.array([35, 25, 25, 15]) plt.pie(y, labels=['A','B','C','D'], # 设置饼图标签 colors=["#d5695d", "#5d8ca8", "#65a479", "#a564c9"], # 设置饼图颜色 explode=(0, 0.2, 0, 0), # 第二部分突出显示,值越大,距离中心越远 autopct='%.2f%%', # 格式化输出百分比 shadow=True, #阴影 startangle=90 ) plt.title("Pie Test") plt.show()
4.直方图
plt.hist(x, bins=None, range=None, density=False, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False, **kwargs)
x
:绘制直方图的数据,一个一维数组或列表。bins
:可选参数,表示直方图的箱数。默认为10。range
:表示直方图的值域范围,可以是一个二元组或列表。默认为None,即使用数据中的最小值和最大值。density
:表示是否将直方图归一化。默认为False,即直方图的高度为每个箱子内的样本数,而不是频率或概率密度。weights
:表示每个数据点的权重。默认为None。cumulative
:表示是否绘制累积分布图。默认为False。bottom
:表示直方图的起始高度。默认为None。histtype
:表示直方图的类型,可以是'bar'、'barstacked'、'step'、'stepfilled'等。默认为'bar'。align
:表示直方图箱子的对齐方式,可以是'left'、'mid'、'right'。默认为'mid'。orientation
:表示直方图的方向,可以是'vertical'、'horizontal'。默认为'vertical'。rwidth
:表示每个箱子的宽度。默认为None。log
:表示是否在y轴上使用对数刻度。默认为False。color
:表示直方图的颜色。label
:表示直方图的标签。stacked
:表示是否堆叠不同的直方图。默认为False。**kwargs
:可选参数,表示其他绘图参数import matplotlib matplotlib.use('TkAgg') # 必须在导入 matplotlib.pyplot 之前设置 import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus']=False plt.rcParams.update({'font.size': 10}) import matplotlib.pyplot as plt import numpy as np # 生成一组随机数据 data = np.random.randn(100) # 绘制直方图 plt.hist(data, bins=10, width=0.5,color='blue', alpha=0.8) # 设置图表属性 plt.title('hist() Test') plt.xlabel('Value') plt.ylabel('Frequency') # 显示图表 plt.show()