Matplotlib是数据可视化的基础,可以用来绘制线图、散点图、等高线图、条形图、柱状图、3D 图形、甚至是图形动画等 matplotlib.pyplot是绘制各类可视化图形的命令子库,相当于快捷方式。
导入方式
import matplotlib.pyplot as plt
英文释义
英文 | 汉语 |
---|---|
plot | n情节;v绘制表格,密谋 |
grid | 网格 |
tick | 标记,刻度 |
axis | 轴 |
axes | 轴的复数形式,坐标系,区域 |
几个对象的关系
figure相当于画板,axis就是一幅图的两个轴,axes就是两个轴围成的区域,这个有时也会翻译成坐标系。一个画板可以有多个区域(每个区域上都有对的画),每个区域都对应着两个轴。
一般网上的教程都是直接使用plt.XXX来直接画图,实际上这是一种简便的方式,也容易让人迷糊,plt操作的figure和axes默认是针对当前的figure和axis。这并不容易理解,所以我们就按照fig.XXX和ax.XXX去操作。
基础设置
1、中文显示
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
设置了中文显示之后,负号就不能正常显示了,所以需要加第二行代码。
2、恢复rc设置
plt.rcdefaults()
3、图像显示在窗口中
打开一个窗口显示图片,并且可以缩放图片,还可以保存高清png图片
%matplotlib qt5
4、图像显示在代码区域中
在jupyter notebook中显示在代码区域
%matplotlib inline
一、figure画板
一般来说,我们一次只会生成一个figure,因为这样不容易乱,但也可以同时存在多个figure,需要操作哪个figure就操作哪个,前提是我们在生成figure时,接受了他的返回值,这样就可以随心操作。
但是有一点,生成了figure之后,直接plt.show()是显示不出什么的,因为上面还没有axes,而且plt.show()不是说figure.show(),而是axes或者是其他东西的show()(具体我也不知道),但是现在只生成了一个figure。
生成figure
f1 = plt.figure(num=1)
#返回画布,因为后面要直接对其操作,所以接收这个返回值
f2 = plt.figure(num=2)
还可以在生成figure画板时,设置其大小、分辨率
f3 = plt.figure(num=3, figsize=[3,3], dpi=200, linewidth=3, edgecolor="r", facecolor="y")
figure画板的属性
属性名 | 含义 |
---|---|
num | 画板编号 |
figsize | 画板大小(列表),宽、高 |
dpi | 分辨率,(图形每英寸的点数),默认是100 |
facecolor | 画板的颜色,默认白色 |
linewidth | 画板的边的宽度,默认是0 |
edgecolor | 画板的边的颜色,边的宽度不能为0,默认白色 |
疑问:facecolor是背景颜色吗,创建figure时会默认建立一个axes区域吗?
一旦使用了plt.show(),将图片打印之后,这个figure连同上面的图片都会消失。
小验证。
所以,当我们在一个figure上的图像还没有画完的时候不要plt.show()
二、axes区域
(1)两个轴围成的区域称为axes(当然,三维图就是三条轴了)。
(2)区域之间可以重叠,并列。
1、axes生成方式
方法一
ax1 = fig.add_subplot(2,2,1)
方法二
axes = fig.subplots(2,2)
ax1 = axes[0,1]
#axes是一个二维数组,元素是AxesSubplot,一次只能取出一个
ax1 = axes[0:2,1]#这种是不对的,此时ax1还是一个数组,数组里包括两个元素。
fig.subplots()只能划分平均的区域,fig.add_subplot()可以不均匀的划分。
对于axes用来生成subplot的方法只有这两种,但是plt.subplot()也可以,功能和fig.add_subplot()很相似。所以就不用管了。
在生成子图时,需要注意,不要新图把之前的图给覆盖了。例如
2、在axes上画图
代码 | 图像类别 |
---|---|
scatter | 散点图 |
bar | 柱状图 |
barh | 横向柱状图 |
plot | 可以根据fmt的不同,生成散点图、连线图 |
pie | 饼图 |
下面讲解每种图的代码使用。
(1)plot(x, y, fmt, label …)参数中可以跟很多对数据,可以一次画很多线。
一对变量的情况
x,y
如果有两个参数,那么这两个分别是自变量和因变量。
如果只有一个参数,那么就是认为他是因变量,自变量默认使用0开始的整数。
fmt
这是用来设置线条和标记的颜色、线条形状、标记形状。
一对就可以这样写
ax1.plot(x, y, "b--*")
或者
ax1.plot(x, "b--*")#这里x做因变量
多对的写法,但是如果写了label,就只能写一组了
ax1.plot(x1, y1, x2, y2, "r-v", y3, "g:o")
这里一共有三对第一对是x1和y1,她们的格式采用默认的
第二对x2和y2,格式采用"r-v"
第三对的自变量是默认的,因变量是y3,格式为"g:o"
只有ax1.plot()可以将多组线条放在一起画,其他的散点图、柱状图、饼图不行。
对于ax1.plot()的省略自变量的形式,注意ax1.plot(x,y1,y2)可以,会把前两个看成一对,但是如果你的本意是这三个都是因变量的话,要么就分开写,要么每个之间加上fmt格式设置。
(2)scatter散点图
ax1.scatter(x, y, s, c, marker, label)
- x和y是两个变量,
- s是size的缩写,用来表示散点的大小,可以是整数。也可以是和xy相同长度的整数数组
- c是color的缩写,是散点的颜色
- marker是散点的形状
- label,设置这一组的图例名
但是不可以一次放入多组数据,想要一张图上画多组散点图,需要多次scatter()
ax.scatter(A1,B,s=9,c="r",marker="v")
ax.scatter(A1,C,s=9,c="b",marker="*")
(3)bar柱状图
ax1.bar(x, y, color, width, label)
- x, y就是柱子的种类(自变量)和柱子的高度(因变量)
- color,柱子的颜色
- width,柱子的宽度
- label,设置这一组的图例名
和散点图一样,如果想要画多组柱状图,需要多次调用,但是要注意柱子之间会互相掩盖,所以当想要绘制簇拥柱状图时,需要考虑到自变量的平移。
"""
move=width 紧挨着
move > width 有空隙
move < width 重叠
"""
x = [1,2,3,4]
y = [10,30,20,60]
z = [u+1 for u in y]
move = 0.4
fig = plt.figure(dpi=100)
ax = fig.add_subplot(2,2,1)
ax.bar(x, y,width=0.3)
ax.bar([u+move for u in x], z, width=0.3)
ax.set_xticks([i+move/2 for i in month],month_fmt)
plt.show()
另外,想要在柱状图的每根柱子上显示数字,没有现成的函数,但是可以根据每根柱子的位置,添加text来实现,这就需要在生成柱子时,接收他的返回值,再使用get_x(),get_height(),get_width()。
(4)pie饼图
ax1.pie(x, label, colors, explode, autopct, labeldistance, radius)
- x是各种类别占据的比例,也可以不是百分比,它会自动计算比例。
- label是每种比例的标签名
- colors是每种类别的配色,可以自行设置,需要是灰度形式的
- explode是每一块饼的偏移(爆炸开的)距离
- autopct是显示在饼上,对应类别所占的比例
- labeldistance是label标签距离中心的位置
- radius是饼的半径
3、显示图例
使用ax.legend(),只有在ax画图时设置了label属性才能显示。
3.1设置图例
ax1.plot(x, y, label="图例一")
3.2显示图例
ax1.lengend()
3.3参数设置
属性 | 作用 |
---|---|
title | 设置图例的标题 |
frameon | False是去掉图例的边框,默认是True |
edgecolor | 设置图例边框颜色,要求有边框 |
facecolor | 设置图例背景颜色,要求有边框 |
loc | 设置图例在图片中的位置 |
loc的设置,上中下(upper center lower),左中右(left center right),或者不设置,就是按照best设置。
ax1.legend(loc="upper left")
3.4移除图例
ax1.legend_remove()
3.5设置多组图例
在画图的时候,接收返回值z,在legend中对几个z组合成一组图例。
4、在图片中放入带箭头的注释
ax1.annotate(s, xy, xytext, arrowprops)
- s是注释的文本内容。
- xy是箭头所指的点,默认是按照自变量和因变量的值对的元组,还可以是比例等。
- xytext是文本的所在位置,也是一个元组。
- arrowprops用来设置箭头的属性,是一个字典,下面详细讲解
参数arrowprops字典的常用的键有arrowstyle和connectionstyle前者设置箭头样式,后者设置箭尾的弧度和旋转半径。
- arrowstyle设置箭头样式,一般就是下面截图中的几个
connectionstyle=‘arc3,rad=0.2’
fi1 = plt.figure("图像一")
ax1 = fi1.add_subplot(1,1,1)
ax1.scatter(A1,C,label="点点")
ax1.legend(loc="upper center",edgecolor='y',facecolor='r')
ax1.set_xlim(0,10)
ax1.plot(A1,B)
ax1.annotate("文字",
xy=(5,10),
xytext=(7,15),
arrowprops=dict(arrowstyle = "<-",
connectionstyle='arc3,rad=0.2'))
ax3.bar(A2,D,width=0.5)
plt.show()
5、坐标轴的取点,以及每个点上显示什么label
ax1.set_xticks()和ax1.et_xticklabels()以及ax1.set_xlim()
代码 | 含义 |
---|---|
ax1.set() | 可以设置标题、坐标轴 |
ax1.set_xlabel( xlabel ) | 设置横坐标轴 |
ax1.xlim(a,b) | 设置横坐标的数值范围 |
ax1.set_xticks() | 设置自变量轴的刻度 |
ax1.set_xticklabels() | 设置自变量每个显示的点上,要显示什么 |
ax1.set_title( title ) | 设置图像上方标题 |
ax1.legend() | 显示图例 |
ax1.text ( text ) | 在图片的任意位置添加文字 |
ax1.annotate() | 添加带有文字的箭头标记 |
ax1.grid(True) | 显示网格 |
三、matplotlib在pandas中画图
目前有很多的开源框架所实现的绘图功能是基于matplotlib的,pandas便是其中之一。
pandas的两类基本数据结构series和dataframe都提供了一个统一的接口plot()
在pandas绘图过程中同样会出现中文无法正常显示的问题,还是需要导入matplotlib.pyplot包,进行设置,因为pandas是基于matplotlib.pyplot的所以很快就能执行完成,然后再设置就行了。
四、 matplotlib在numpy中画图
五、保存图片
plt.savefig(filepath)
可以保存为jpg、png、pdf
但是必须要在plt.show()之前,不然保存的就是空白图片
plt.savefig(r"C:\Users\lenovo\Desktop\哈哈.jpg")
plt.savefig(r"C:\Users\lenovo\Desktop\哈哈.png")
plt.savefig(r"C:\Users\lenovo\Desktop\哈哈.pdf")
六、一些奇特的技巧
1、漫画风格的图像
必须使用plt.xkcd()而不是ax1.xkcd(),并且设置之后,所有的图像都是漫画风格的,即使是在plt.show()之后。
并且这种漫画风格默认不支持中文,而且在这里中文的设置很麻烦,所以使用这个就不要用中文坐标轴、图例、表名了。
必须使用plt.rcdefaults()清除rc设置才行,清除设置之后,前面中文的rc设置也没了,需要重新设置。
清除设置,并重设汉字
plt.rcdefaults()
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
2、