Matplotlib基础知识

Matplotlib是数据可视化的基础,可以用来绘制线图、散点图、等高线图、条形图、柱状图、3D 图形、甚至是图形动画等 matplotlib.pyplot是绘制各类可视化图形的命令子库,相当于快捷方式。
  导入方式

import matplotlib.pyplot as plt

  英文释义

英文汉语
plotn情节;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)

  1. x和y是两个变量,
  2. s是size的缩写,用来表示散点的大小,可以是整数。也可以是和xy相同长度的整数数组
  3. c是color的缩写,是散点的颜色
  4. marker是散点的形状
  5. 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)

  1. x, y就是柱子的种类(自变量)和柱子的高度(因变量)
  2. color,柱子的颜色
  3. width,柱子的宽度
  4. 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)

  1. x是各种类别占据的比例,也可以不是百分比,它会自动计算比例。
  2. label是每种比例的标签名
  3. colors是每种类别的配色,可以自行设置,需要是灰度形式的
  4. explode是每一块饼的偏移(爆炸开的)距离
  5. autopct是显示在饼上,对应类别所占的比例
  6. labeldistance是label标签距离中心的位置
  7. radius是饼的半径

在这里插入图片描述

在这里插入图片描述

3、显示图例
使用ax.legend(),只有在ax画图时设置了label属性才能显示。
  3.1设置图例

ax1.plot(x, y, label="图例一")

  3.2显示图例

ax1.lengend()

  3.3参数设置

属性作用
title设置图例的标题
frameonFalse是去掉图例的边框,默认是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)

  1. s是注释的文本内容。
  2. xy是箭头所指的点,默认是按照自变量和因变量的值对的元组,还可以是比例等。
  3. xytext是文本的所在位置,也是一个元组。
  4. 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、

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值