Matplotlib
2 Matplotlib
2.1 Matplotlib
2.1.1 Matplotlib介绍
Matplotlib是一个Python的基础绘图库,它可与 NumPy 一起使用,代替Matlab使用。
为什么要学习Matplotlib
- 将数据进行可视化,使数据更直观.
- 使数据更加更具有说服力.
2.1.2 Matplotlib安装
由于Matplotlib是第三方库,所以我们需要安装它才可以使用。注意,Matplotlib3.0要求python3版本才可安装使用。
安装命令:pip install matplotlib
安装可参考官网:https://matplotlib.org/users/installing.html
2.2 Matplotlib绘图
2.2.1 图片与子图
Matplotlib所绘制的图位于图片(Figure)对象中。我们可以通过plt.figure生成一个新的图片:
from matplotlib import pyplot as plt #plt是公用的别名,最好不要随便更改
fig = plt.figure() #运行结果没有显示,但是已经生成了一块画布
# plt.subplot(221) #创建一个或多个子图 前面的22 是创建2*2个子图,第一个2是行数,第二个2是列数,1是调用第一块,下面的相当于调用所有子图
ax1=plt.subplot(221)
ax2=plt.subplot(222)
ax3=plt.subplot(223)
ax4=plt.subplot(224)
除此之外,Matplotlib包含一个便捷方法plt.subplots创建一个新的图片。
plt.subplots(nrows, ncols, sharex, sharey)
- nrows子图的行数
- ncols子图的列数
- sharex 所有子图使用相同的x轴刻度
- sharey 所有子图使用相同的y轴刻度
from matplotlib import pyplot as plt
#fig 画布对象 axs子图对象 [0,1]索引
fig,axs=plt.subplots(2,2,figsize=(12,12),sharex=True,sharey=True)
axs[0,0].scatter(range(5),range(5)) #[0,0] 选中第一张图
axs[0,1].scatter(range(5),range(5)[::-1]) #[0,1]选中第二张图,并且按照散点y值取反
#调整图与图之间的间距
plt.subplots_adjust(wspace=0,hspace=0)
plt.show() #展示图片
2.2.2 Matplotlib绘制图形
matplotlib能够绘制折线图,散点图,条形图,直方图,饼图等等。
具体可参考:
https://matplotlib.org/gallery/index.html
2.2.3 折线图
折线图介绍
折线图以折线的上升或下降来表示统计数量的增减变化的统计图。
特点:能够显示数据的变化趋势,反映事物的变化情况
折线图绘制。
折线图可以通过plot()函数来绘制
• plt.plot(x, y) # 使用默认的线样式及颜色绘制x,y构建的图形
举例:绘制折线图形
x=[1,2,3,4] #列表
y=[5,3,4,1]
plt.plot(x,y) #绘制折线图
plt.show() #展示图片,释放内存
并且,plt.plot()函数除了传入制图数据,还可以设置线的颜色等。
• color 设置线的颜色
• linestyle 设置线的样式
• marker 标记样式
import matplotlib.pyplot as plt
x = [1,2,3,4]
y = [5,3,4,1]
plt.plot(x,y,color="y",linestyle="--",marker="*")
plt.show()
假设一天中每隔两个小时的气温分别是[15,13,14.5,17,20,25,26,26,27,22,18,15],绘制图形。并且时间刻度为0,0.5…
from matplotlib import pyplot as plt
#设置画布大小
plt.figure(figsize=(14,8))
x=range(0,24,2)
y=[15,13,14.5,17,20,25,26,26,27,22,18,15]
#绘制图形
plt.plot(x,y)
#设置刻度
x_t=[i/2 for i in range(0,48)]
#设置标签
x_l=["{}h".format (i/2) for i in range(0,48)]
plt.xticks(x_t,x_l,rotation=45) #rotation=45 旋转45
#设置y刻度
y_t=range(min(y),max(y)+1)
plt.yticks(y_t)
#添加X轴标签
plt.xlabel("time")
#添加y轴标签
plt.ylabel("temperature")
#添加标题
plt.title("temperature change")
#添加网格
plt.grid()
#保存图片 注意:要在show之前,否则空白图
plt.savefig("mat.png")
plt.show()
方法 | 描述 |
---|---|
plt.figure(figsize=None,dpi=None) | 生成新的图片,figsize:图片大小,dpi:透明度 |
plt.savefig(fname) | 保存图片 |
plt.xticks(ticks=None) | 设置x轴刻度的值 |
plt.yticks(ticks=None) | 设置y轴刻度的值 |
plt.xlabel(xlabel) | 设置x轴标签 |
plt.ylabel(ylabel) | 设置y轴标签 |
plt.title() | 设置图标题 |
plt.grid() | 根据x轴和y轴的数值展示轴网格 |
练习1.
获取十点到十二点每一分钟的气温,观察气温变化情况
from matplotlib import pyplot as plt
import random
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False # 步骤二(解决坐标轴负数的负号显示问题)
x=range(120)
y = [random.randint(30,38) for i in range(120)]
plt.plot(x,y)
#刻度:0,10,20......
x_t=range(0,120,10)
#刻度标签 为十点0分,十点10分.... 十一点50分
x_l=["十点{}分".format(i) for i in range(0,60,10)]
x_l+=["十一点{}分".format(i) for i in range(0,60,10)]
plt.xticks(x_t,x_l,rotation=45)
plt.show()
注意:中文显示问题
当我们需要设置轴标签,标题等,通常会使用到中文。但是,matplotlib默认不显示中文。
因此下面有三种解决方法,其中方法一二是matplotlib自带的字体格式为.ttf,是全局变量,不支持.ttc字体。方法三相当于从电脑中注册字体到matplotlib的字体库中(可以导入.ttc或者.ttf的字体,windos会有.ttc字体),是局部变量。
方法一
import matplotlib
font = {
'family':'SimHei',
'weight':'bold',
'size':12
}
matplotlib.rc("font", **font)
方法二
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False # 步骤二(解决坐标轴负数的负号显示问题)
方法三
from matplotlib import pyplot as plt
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=14)
x = [1,2,3,4]
y = [3,2,1,3]
plt.plot(x,y)
plt.xlabel("x轴标签",fontproperties=font) # fontproperties=font 需要传参,有点麻烦,优点是可以设置某个图形的局部字体大小
plt.show()
练习2
假设大家在30岁的时候,根据自己的实际情况,统计出来了你和同桌从11岁到30岁每年交的男女朋友的数量如列表a和b,请绘制出该数据的折线图,以便分析自己和同桌每年交男女朋友的数量走势
a = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
b = [1,0,3,1,2,2,2,3,1,1,1,1,1,2,1,1,2,3,2,2]
from matplotlib import pyplot as plt
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x=range(11,31)
ya=[1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
yb=[1,0,3,1,2,2,2,3,1,1,1,1,1,2,1,1,2,3,2,2]
plt.plot(x,ya,label="自己")
plt.plot(x,yb,label="同桌")
#添加图例
plt.legend()
#设置刻度
x_t=["{}岁".format(x) for x in range(11,31,1)]
plt.xticks(x,x_t,rotation=45)
# y_max=max(ya) if max(ya) > max(yb) else max(yb)
# y_t=["{}个".format(y_max)]
# plt.yticks(y_max,y_t)
#添加注释文本
#实现:每个点都使用上数据标签
#思路:什么在变?对应的参数(坐标)在变
#((11,1) (12,0)
#plt.annotate("1",xy=(11,1),xytext=(11,1)
for m,n in zip(x,ya):
plt.annotate(f"{n}",xy=(m,n),xytext=(m,n))
for p,q in zip(x,yb):
plt.annotate(f"{q}",xy=(p,q),xytext=(p,q-0.3))
#也可以定义一个函数,然后调用函数实现功能,比起上面要省略代码。
#def auto(xl,yl):
# for m,n in zip(xl,yl):
# plt.annotate(f"{n}",xy=(m,n),xytext=(m,n))
#auto(x,ya)
#auto(x,yb)
plt.xlabel("年龄")
plt.ylabel("个数")
plt.title("朋友变化")
plt.show()
添加注释文本
plt.annotate() 基本使用
- text 是注释的文本
- xy 是需要注释的点的坐标
- xytext 是注释文本的坐标
- arrowprops 是箭头的样式属性 (默认格式是字典,比如arrowprops={“width”:2})