一.导包

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()

5.饼图:占比


坚持