一.导包
import matplotlib.pyplot as plt
二.图形风格
1.表示颜色的字符参数
- 蓝色: b
- 绿色: g
- 红色: r
- 青色: c
- 品红: m
- 黄色: y
- 黑色: k
- 白色: w
2.表示类型的字符参数
- 实线:’-‘
- 虚线: ‘–’
- 虚点线: ‘-.’
- 点虚线: ‘:’
- 点: ‘.’
三.Matplotlib三层结构
1.容器层
- 画板层(canvas):位于最底层,用户接触不到
- 画布层(figure):建立在画板层之上,画布层是指整个图像,通过 plt.figure(figsize=, dpi=)设置画布的大小和分辨率
- 绘图区 / 坐标系 (axes) :建立在画布层之上,figure,axes = plt.subplots(nrows=, ncols=, figsize=, dpi=)
- 辅助显示层和图像层建立在 绘图区/坐标系(axes)之上
一个画布figure可以包含多个(绘图区/坐标系)axes,但是一个axes只能属于一个figure
一个(绘图区/坐标系)axes可以包含多个坐标轴axis,包含2个就是2d坐标系,3个就是3d坐标系
2.辅助显示层
辅助显示层主要包括 绘图区/坐标系(axes)的外观、边框线(spines)、坐标轴(axis)、坐标轴名称(axis label)、坐标轴刻度(tick)、坐标轴刻度标签(tick label)、网格线(grid)、图例(legend)、标题(title)
- 修改x轴的刻度:plt.xticks()
- 修改y轴的刻度:plt.yticks()
- 添加描述信息:plt.title()、plt.xlabel()、plt.ylabel()
- 添加网格:plt.grid()
- 显示图例:plt.legend()
3.图像层
设置图像的颜色、风格
- 折线图:plt.plot()
- 散点图: plt.scatter()
- 柱状图: plt.bar()
- 直方图: plt.hist()
- 饼图:plt.pie()
四.单个子图(面向过程)
1.步骤
(1) 准备数据:x=,y=
(2) 创建画布:plt.figure(figsize=(,), dpi=)
figsize:图的长宽 dpi:图像的分辨率
(3)保存图片到指定路径: plt.savefig(“path”)
(4) 绘制图像:plt.plot(x,y,color=””,linestyle=””,label=””,linewidth=)
- 如果省略x,plot(y): 表示x默认是从0到N-1
- linestyle是线的风格
- label是图例的文字
(5) 显示图像:plt.show( )
2.自定义x、y的刻度
- x轴的刻度:plt.xticks(x, **kwargs)
- y轴的刻度:plt.yticks(y, **kwargs)
- kwargs是刻度对应的文字说明
3.添加网格显示
plt.grid(True,linestyle=’’, alpha=)
4.添加描述信息
(1) x轴描述信息:plt.xlabel(“时间”)
(2) y轴描述信息:plt.ylabel(“温度”)
(3) 标题:plt.title(“中午11点0分到12点之间的温度变化图示”)
5.同一个坐标系下画多个图形
多次plt.plot
6.显示图例
(1) 在plot里面增加label=””
(2) plt.legend(loc=”best”)
import matplotlib. pyplot as plt
import numpy as np
x = range(60) # 1.准备数据x、y
y_shanghai = [np.random.uniform(15,18) for i in x]
y_beijing = [np.random.uniform(1, 3) for i in x]
plt.figure(figsize=(20,8), dpi=80) # 2.创建画布
plt.plot(x, y_shanghai, color="r", linestyle = "--", label = "shangHai") # 3.绘制图像,第一个图像
plt.plot(x, y_beijing, color = "b", label = "beiJing") # 第二个图像
plt.legend(loc="best") # 4.显示图例
x_label = ['one', 'two', 'three', 'four', 'five'] # x的刻度说明
plt.xticks([0, 15, 30, 45, 60], x_label) # 修改x刻度
plt.yticks(range(0, 40, 5)) # 修改y刻度
plt.grid(linestyle = "--", alpha = 0.5) #添加网格显示
plt.xlabel("timeChange") #添加x轴描述信息
plt.ylabel("wenDu") # 添加y轴描述信息
plt.title("test" ) # 添加标题
plt.show( ) # 显示图像
五.单个子图(面向对象的画法)
2.步骤
(1) 准备数据:x=,y=
(2) 创建画布:fig,ax = plt.subplots()
(3)保存图片到指定路径: plt.savefig(“path”)
(4) 绘制图像:ax.plot(x,y,color=””,linestyle=””,label=””)
- 如果省略x,plot(y): 表示x默认是从0到N-1
- linestyle是线的风格
- label是图例的文字
(5) 显示图像:plt.show( )
2.自定义x、y的刻度
- x轴的刻度:ax.set_xticks(x)
- x轴的刻度对应的文字说明:ax.set_xticklabels()
- y轴的刻度:ax.set_yticks(y)
- y轴的刻度对应的文字说明:ax.set_yticklabels()
3.添加网格显示
ax.grid(True,linestyle=’’, alpha=)
4.添加描述信息
(1) x轴描述信息:ax.set_xlabel(“时间”)
(2) y轴描述信息:ax.set_ylabel(“温度”)
(3) 标题:ax.set_title(“中午11点0分到12点之间的温度变化图示”)
5.显示图例
(1) 在plot里面增加label=””
(2) ax.legend(loc=”best”)
plt.函数名()是面向过程的画图方法,axes.set()_方法名是面向对象的画图方法
import matplotlib. pyplot as plt
import numpy as np
x = range(60) # 1.准备数据x、y
y_shanghai = [np.random.uniform(15,18) for i in x]
y_beijing = [np.random.uniform(1, 3) for i in x]
fig,ax = plt.subplots(figsize=(20,8), dpi=80) # 2.创建画布
ax.plot(x, y_shanghai, color="r", linestyle = "--", label = "shangHai") # 3.绘制图像,第一个图像
ax.plot(x, y_beijing, color = "b", label = "beiJing") # 第二个图像
ax.legend(loc="best") # 显示图例
x_label = ['one', 'two', 'three', 'four', 'five'] # x的刻度说明
ax.set_xticks([0, 15, 30, 45, 60]) # 修改x刻度
ax.set_xticklabels(x_label) # 设置x的刻度说明
ax.set_yticks(range(0, 40, 5)) # 修改y刻度
ax.grid(linestyle = "--", alpha = 0.5) #添加网格显示
ax.set_xlabel("timeChange") #添加描述信息
ax.set_ylabel("wenDu")
ax.set_title("test" )
plt.show( ) # 显示图像
六.多个子图(面向对象的画法)
2.步骤
(1) 准备数据:x=,y=
(2) 创建画布:fig,ax = plt.subplots(nrows=, ncols=, *fig_kw)
创建一个带有多个axes(坐标系/绘图区)的图
- nrows: subplot的行数
- ncols: subplot的列数
- *fig_ kw: 创建figure时的其他关键字,例如plt.subplots(2,2,figsize=(8,6))
(3)保存图片到指定路径: plt.savefig(“path”)
(4) 绘制图像:ax[i].plot(x,y,color=””,linestyle=””,label=””),i从0开始
- 如果省略x,plot(y): 表示x默认是从0到N-1
- linestyle是线的风格
- label是图例的文字
(5) 显示图像:plt.show( )
2.自定义x、y的刻度
- x轴的刻度:ax[i].set_xticks(x)
- x轴的刻度对应的文字说明:ax[i].set_xticklabels()
- y轴的刻度:ax[i].set_yticks(y)
- y轴的刻度对应的文字说明:ax[i].set_yticklabels()
3.添加网格显示
ax[i].grid(True,linestyle=’’, alpha=)
4.添加描述信息
(1) x轴描述信息:ax[i].set_xlabel(“时间”)
(2) y轴描述信息:ax[i].set_ylabel(“温度”)
(3) 标题:ax[i].set_title(“中午11点0分到12点之间的温度变化图示”)
5.显示图例
(1) 在plot里面增加label=””
(2) ax[i].legend(loc=”best”)
import matplotlib. pyplot as plt
import numpy as np
x = range(60) # 1.准备数据x、y
y_shanghai = [np.random.uniform(15,18) for i in x]
y_beijing = [np.random.uniform(1, 3) for i in x]
fig,ax = plt.subplots(nrows=1, ncols=2,figsize=(20,8), dpi=80) # 2.创建画布
ax[0].plot(x, y_shanghai, color="r", linestyle = "--", label = "shangHai") # 3.绘制图像,第一个图像
ax[1].plot(x, y_beijing, color = "b", label = "beiJing") # 第二个图像
ax[0].legend(loc="best") # 显示图例
ax[1].legend(loc="best")
x_label = ['one', 'two', 'three', 'four', 'five'] # x的刻度说明
ax[0].set_xticks([0, 15, 30, 45, 60]) # 修改x刻度
ax[0].set_xticklabels(x_label) # 设置x的刻度说明
ax[0].set_yticks(range(0, 40, 5)) # 修改y刻度
ax[1].set_xticks([0, 15, 30, 45, 60]) # 修改x刻度
ax[1].set_xticklabels(x_label) # 设置x的刻度说明
ax[1].set_yticks(range(0, 40, 5)) # 修改y刻度
ax[0].grid(linestyle = "--", alpha = 0.5) #添加网格显示
ax[1].grid(linestyle = "--", alpha = 0.5)
ax[0].set_xlabel("timeChange1") #添加描述信息
ax[0].set_ylabel("wenDu1")
ax[0].set_title("test1" )
ax[1].set_xlabel("timeChange2") #添加描述信息
ax[1].set_ylabel("wenDu2")
ax[1].set_title("test2" )
plt.show( ) # 显示图像
七.常见的图像
1.折线图 plot:反映数据的变化趋势
绘制图像:
(1) 面向过程的单个子图:plt.plot(x,y,color=””,linestyle=””,label=””)
(2) 面向过程的同一个坐标系下画多个图形: 多次plt.plot
(3) 面向对象的单个子图:ax.plot(x,y,color=””,linestyle=””,label=””)
(4) 面向对象的多个子图:ax[i].plot(x,y,color=””,linestyle=””,label=””)
2.散点图 scatter:反映变量之间的关联或者点的分布规律
绘制图像:
(1) 面向过程的单个子图:plt.scatter(x,y,color=””,linestyle=””,label=””)
(2) 面向过程的同一个坐标系下画多个图形: 多次plt.scatter
(3) 面向对象的单个子图:ax.scatter(x,y,color=””,linestyle=””,label=””)
(4) 面向对象的多个子图:ax[i].scatter(x,y,color=””,linestyle=””,label=””)
import matplotlib. pyplot as plt
x = [225.98, 247.07, 253.14, 457.85, 241.58, 301.01, 20.67, 288.64, 163.56, 120.06, 207.83]
y = [196.63, 203.88, 210.75, 372.74, 202.41, 247.61, 24.9, 239.34, 140.32, 104.15, 176.84]
fig,ax = plt.subplots(figsize=(20,8), dpi=80) # 2.创建画布
ax.scatter(x,y)
ax.grid(linestyle = "--", alpha = 0.5) #添加网格显示
ax.set_xlabel("X") #添加x轴的描述信息
ax.set_ylabel("Y")
ax.set_title("test1" )
plt.show( ) # 显示图像
3.柱状图 bar:对比
绘制图像:
(1) 面向过程的单个子图:plt.bar(x,y,color=””,label=””)
(2) 面向过程的同一个坐标系下画多个图形: 多次plt.bar
(3) 面向对象的单个子图:ax.bar(x,y, width=, color=””,label=””)
(4) 面向对象的多个子图:ax[i].bar(x,y, width=, color=””,label=””)
import matplotlib. pyplot as plt
first_day = [10587.6,10062.5,1275.7]
first_weekend = [ 36224.9,34479.6,11830]
fig,ax = plt.subplots(figsize=(20,8), dpi=80) # 2.创建画布
ax.bar(range(3), first_day, width=0.2, label="FirstDay")
ax.bar([0.2, 1.2, 2.2], first_weekend, width=0.2, label="SecondDay")
ax.legend(loc="best")
movie_name = ["one", "two", "three"]
ax.set_xticks(range(3))
ax.set_xticklabels(movie_name)
ax.grid(linestyle = "--", alpha = 0.5) #添加网格显示
plt. show()
4.直方图 histogram:分布状况
绘制图像:
(1) 面向过程的单个子图:plt.hist(x,bins=, normed=, density=True,**kwargs)
(2) 面向对象的单个子图:ax.hist(x,bins=, normed=, density=True,**kwargs)
(3) 面向对象的多个子图:ax[i].hist(x,bins=, normed=, density=True, **kwargs)
density: 是否显示频率
- 直方图描述的是一组数据的频次分布,是以矩形的长度表示每一组的频数或数量,宽度则表示各组的组距,直方图有助于我们知道数据的分布情况
- 直方图首先要对数据进行分组,然后统计每个分组内数据的数量,纵轴表示频数,每个矩形的高代表对应的频数
- 直方图的柱子宽度可以不一样,柱状图的柱子宽度必须一样
- 直方图Y轴上的变量可以是频次(数据出现了多少次)、频率(频次/总次数)、频率/组距
- 在绘制直方图的时候需要多次尝试改变组距
- 组数 bins: 把数据按照不同的范围分组,分成的组的个数称为组数
- 组距: 每一组两个区间端点的差
- 组数 bins= (max(time) - min(time)) / 组距
import matplotlib. pyplot as plt
time = [131,98,125,131,124,139,131,117,128,108,135,138,131,102,107,114]
fig,ax = plt.subplots(figsize=(20,8), dpi=80)
distance = 4
group_num = int((max(time) - min(time)) / distance)
ax.hist(time, bins=group_num)
ax.set_xticks(range(min(time), max(time) + 2, distance)) # 修改x轴的刻度
ax.grid(linestyle = "--", alpha = 0.5) #添加网格显示
plt. show()