【python 的各种模块】(5) 在python使用matplotlib库来画图

目录

0 关于matplotlib查询官方文档最直接/权威

0.1 官方文档

0.2 特别备注:避免中文乱码负号等问题

0.2.1 注意乱码问题解决

0.2.2 注意python的代码大小写

1 matplotlib的基本用法 (画图流程)

1.0 画图流程

1.1 需要用到的模块,需要实现安装,且导入

1.1.1 导入 import matplotlib.pyplot

1.1.2 matplotlib 词源

1.2 figure  画图容器/ 画布

1.2.1 figure的官方解释

1.2.2 必须先获取至少1个figure:

1.2.3 多个figure存在时,figure的生效范围

1.2.4 因为可以一段代码里存在多个plt.figure(),因此可以设置多个画布

1.2.5  画布语法

1.3  设置函数图形

1.3.1 常规的函数设定方式

1.3.2 用x,y 分别是离散的散点数组,plt.plot() 也可以根据散点画图

1.4 绘图  plt.plot()

1.4.1 plt.plot()的语法

1.5 显示图像 plt.show() 和 plt.imshow()

1.5.1 关于 plt.show() 到底是否需要,用jupyter来写py实测并不需要plt.show()

1.6 用plt.plot 画出一个函数图形,测试代码

1.7 一个典型的报错  plt.plot(x,y1,x,y2)  可以同时画2个曲线

1.7.1 报错 TypeError: unsupported operand type(s) for ** or pow(): 'list' and 'int'

1.7.2  只要将 np.array([1,2,3,4,5]) 转化成 ndarray 就可以

1.7.3  用 np.linspace([1,2,3,4,5]) 等 ndarray类型也可以

1.7.4 用python 的list也可以,但是f(x) 也要修改为 list 也可以

1.7.5 用ndarrat配合,但是f(x) 也要修改为 list 也可以

1.8 plt.plot(x,y1,x,y2)  可以同时画2个曲线

2 画布和图形的本质

2.1 图片在plt里本质是 ndarray 矩阵

2.1.1 plt.imread(fname, format=None)

2.1.2 保存图片的数据本质是 ndarray

2.2 可用plt.imread(path) 和 plt.imshow(pic)直接读入图片和显示图片

2.2.1 接前面的plt.imread(path),还可以把保存的图片再用  plt.imshow(图片) 再显示出来

2.2.2 以上的测试代码

2.3  画布/子区域/坐标轴+图片的三层层级

2.3.1 层级关系

2.4 ax相关的语法

推测:ax(子图区域) 类似于 plt (全图区域)

但是axis相关的则是专门设置坐标轴的

2.4.1 设置子区域和子区域作图

2.4.2 设置坐标轴的label,比如ax.set_xticklabels()

2.4.3  设置坐标轴ax = plt.gca()  和 ax.spines["top"]

2.4.4 上述代码测试:plt.plot() 和 ax1.plot(2,3) 确实很像,分别针对全图/子图

A> figure范围内

B> fig,axes=plt.subplots(2,3)子图范围内

C> 尽量不要在ax1 等子图区域,生效范围内写plt.plot()等

2.5 用rect位置参数 来设置子区域

2.5.1 fig.add_axes([left, bottom, width, height])

2.6 设置坐标轴

2.6.1 matplotlib.pyplot.axis(*v, **kwargs)

3 画布的各种设定

3.1 关于颜色的设定

3.1.1 颜色的写法

3.1.2 修改颜色代码例子

3.2 设置画布的图形标题

3.3 图片的图例

3.3.1 用plt.legend() 可设置多个曲线的图例,且默认展示在一起。

3.3.2 plt.plot(lable="")也可以设置单个plot 曲线的label,和图例效果差不多

3.3.3 如何设置图例 plt.legend()

3.3.4 可用的 plt.legend(loc="") 属性

3.3.5 测试图例 plt.legend()代码 

3.4 是否显示网格

 4  关于坐标轴的各种设置

4.1 坐标轴的描述

4.2 坐标轴范围设置

4.3 坐标轴的刻度设置

4.3.1 设置坐标轴刻度:用数组,或者其他类linspace()都可以

4.3.2 清除刻度

4.3.3 把数字刻度--标记为文本标签 label的显示形式

4.3.4 如果在label="" 包含中文时出现乱码,在block开头加如下代码即可

4.4 显示文本注释: plt.text()

4.4.1 语法

4.4.2 测试代码

4.5 显示箭头+文本注释: plt.annotate()

4.5.1 语法

4.5.2 测试代码

4.6 图形间填充

4.6.1 语法

4.6.2 测试代码

5 边界spines 和 移动坐标轴

5.1 先获取坐标轴

5.2 图片的4边,都是spine

5.3 比如隐藏右边、上边的spine

5.4 移动两个spine到0,0 点,达到把坐标轴移动的目的

5.5 移动坐标轴的代码(可看出坐标pos(0,0)处有了我们熟悉的数学坐标轴!)

5.5.1 移动效果看下面的图

5.5.2 移动坐标轴前后对比的测试代码

5.6 一个警告,不是报错

5.6.1 警告出现的可能原因1

5.6.2 警告出现的可能原因2

6 保存图片 plt.savefig()

6.1 详细语法

6.2 测试保存代码



0 关于matplotlib查询官方文档最直接/权威

0.1 官方文档

MatplotlibMatplotlib中文网、Matplotlib官方中文文档。icon-default.png?t=N7T8https://www.matplotlib.org.cn/

教程 | MatplotlibMatplotlib中文网、Matplotlib官方中文文档。icon-default.png?t=N7T8https://www.matplotlib.org.cn/tutorials/#%E5%BA%8F%E8%A8%80

matplotlib.pyplot.axes — Matplotlib 3.8.2 documentationicon-default.png?t=N7T8https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.axes.html

0.2 特别备注:避免中文乱码负号等问题

0.2.1 注意乱码问题解决

  • 如果无法正常显示中文及负号,加上对应的的处理代码
  • 如何还是中文乱码,可能没有'SimHei',而需要用其他字体,比如我的电脑环境里就需要用 "LiSu"
  • 一般加在一段代码block的最前面
  • plt.rcParams['font.family']='LiSu'# 正常显示中文
  • plt.rcParams['axes.unicode_minus']=False# 正常显示负号

0.2.2 注意python的代码大小写

  • python是严格区分大小写的
  • "LiSu" 不要写"lisu"

1 matplotlib的基本用法 (画图流程)

1.0 画图流程

  • 导入新包,import matplotlib.pyplot
  • 创建:figure 画布
  • 画图:plt.plot()
  • 显示:plt.show()
  • 保存:plt.savefig()

1.1 需要用到的模块,需要实现安装,且导入

1.1.1 导入 import matplotlib.pyplot

import numpy as np
import matplotlib.pyplot as plt 

  • 注意,虽然常用的画图模块是 matplotlib
  • 但是实际上大家常用的 plt 是指 matplotlib.pyplot 这个子模块
  • 错误写法 import matplotlib as plt 会造成报错 TypeError: 'module' object is not callable

1.1.2 matplotlib 词源

matplotlib 推测词源

  • mat:matrix  矩阵,向量组,2维数组等,甚至于 张量tensor
  • plot:绘制
  • lib: library 库

1.2 figure  画图容器/ 画布

1.2.1 figure的官方解释

figure是一顶级的容器,包含了绘图所有的元素。我把这个理解为画布

  • 1.the Figure, which contains all the plot elements.
  • 2.The top level container for all the plot elements.

1.2.2 必须先获取至少1个figure:

  • 需要画图形和现实图形,首先必须需要获取figure才可以
  • fig=plt.figure()
  • 获取figure的方式是:fig = plt.figure()。

1.2.3 多个figure存在时,figure的生效范围

  • 同一段代码可能会存在多个 figure
  • 一个figure到下一个figure语句前之间的区域,属于该figure的作图管辖范围;
  • 而如果没有下一个figure时,则到plt.show()之间的区域,属于该figure的作图管辖范围。
  • 在一个figure的作图管辖范围的图像都会展示在同一个figure绘画弹框中。

1.2.4 因为可以一段代码里存在多个plt.figure(),因此可以设置多个画布

  • 如果需要图像在多个不同的figure弹框中展示,则需要获取多个figure才可以
  • 获取figure的方式是:fig = plt.figure()
  • 设置多个画布的时候以创建 plt.figure() 为分界

1.2.5  画布语法

画布语法:figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)

  • num:图像编号或名称,数字为编号 ,字符串为名称,编号,实测可省略 ,
  1. 但是图上看不到num,如果是plt.subplot() 可以看到figure的编号
  • figsize: ndarray数组形式
  1. figsize= [3,5]指定figure的宽和高,单位为英寸;画布大小,实测可省略,有默认值
  2. figsize=(5,6) 也可以
  • dpi参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80。1英寸等于2.5cm,A4纸是 21*30cm的纸张 

  • frameon:是否显示边框
  • facecolor:背景颜色(如果不显示边框,则  facecolor的颜色也没有效果)
  • 设置facecolor后,只有画布是 facecolor颜色,而图片并不显示颜色,可以认为 plot区域是浮在figure 上的,所以层次更高,遮住了figure的facecolor
  • 还可以用fig.add_axes(acecolor="blue")设置子区域的颜色
  • axes2=fig.add_axes([0.4,0.4,0.3,0.3],facecolor="blue")

  • linewidth=3,设置
  • edgecolor:边框颜色 (看不出来,是因为默认linewidth=0,要显示edgecolor就必须先让linewidth≠0)

import numpy as np
import matplotlib.pyplot as plt

fig1=plt.figure("名字",figsize=[5,5],dpi=None,facecolor="gray", edgecolor="white", frameon=True)

x=np.linspace(-5,5, 10)
y=x*2+1
y2=x**2

# 绘图
plt.plot(x, y)
plt.plot(x, y2)

# 显示图像
plt.show()


  • fig1=plt.figure("名字",figsize=None,dpi=None,facecolor="gray", edgecolor="white", frameon=Fales)
  • 如果设置 frameon=False,则facecolor的颜色也没有效果

1.3  设置函数图形

1.3.1 常规的函数设定方式

设置函数的关键:

函数就是形如 y=f(x)的样式,但是函数的作图需要具体的数据。

  • 1 自变量:需要一组自变量的数,方便作图。
  • 2 因变量:y=f(x)  函数的表达式即可,因为因变量可计算出来
  • 如果只是纯粹的函数形式当然抽象的X就够了。但是要作图,需要有具体的数据点,因此需要有如下的设置
  1. 自变量:x=np.linspace(-5,5, 10)   # 从-5,5范围取10个数
  2. 因变量:y=x*2+1

1.3.2 用x,y 分别是离散的散点数组,plt.plot() 也可以根据散点画图

  • 用x,y 分别是离散的散点数组,也可以生成函数图形
  • plt.plot() 也可以根据散点画图

比如 这样也可以生成函数,和函数图形

  • x=[1,2,3,4,5]
  • y=[2,4,6,8,10]
  • plt.plot(x,y)

下面是测试的代码 

import numpy as np
import matplotlib.pyplot as plt

x=[1,2,3,4,5]
y=[2,4,6,8,10]

plt.figure
plt.plot(x,y,c="#000000")

plt.show

1.4 绘图  plt.plot()

1.4.1 plt.plot()的语法

  • plt.plot(x, y)
  • plt.plot(x对应自变量:一般对应X轴, y对应因变量:一般对应y轴。如果只有1个数组,默认为Y)
  • plt.plot(x, y, linestyle, linewidth,color,marker, markersize, markeredgecolor, markerfactcolor, label, alpha)
  • 这些关键词参数,可以省略
  1. x:指定折线图的x轴数据;
  2. y:指定折线图的y轴数据;
  3. linestyle:指定折线的类型,可以是实线、虚线、点虚线、点点线等,默认实线;
  4. linewidth:指定折线的宽度
  5. marker:可以为折线图添加点,该参数是设置点的形状;
  6. markersize:设置点的大小;
  7. markeredgecolor:设置点的边框色:颜色 "b" , "blue" ,或RGB方式"#ff0000"
  8. markerfacecolor:设置点的填充色:颜色 "b" , "blue" ,或RGB方式"#ff0000",有时候填的颜色不对会报错
  9. label:"字符串" ,为折线图添加标签,类似于图例的作用;
  10. scalex=true,bool 型, (可选),默认 True,指定 X 视图是否适用于数据限制,一般需要填为True,否则图形会变得极度扁或者窄。
  11. scaley=true,bool 型, (可选),默认 True,指定 Y 视图是否适用于数据限制。
  12. scalexscaley参数是指假设数据画图大于当前窗口的时候是否自动扩大窗口以适应数据大小。

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.family']='LiSu'# 正常显示中文
plt.rcParams['axes.unicode_minus']=False# 正常显示负号


fig=plt.figure("画布1",figsize=[5,5],dpi=None,facecolor="gray", edgecolor="red", frameon=True)

x=np.linspace(-10,10,100)
plt.plot(x,x**2,
         linestyle="-", 
         linewidth=3,
         color="red",
         scalex=True,  #默认是true,画布和axis 受到数据的约束
         scaley=True,
         marker="*", 
         markersize=1, 
         markeredgecolor="black", 
         markerfacecolor='brown',
         label="y=x^2", 
         alpha=0.5)
#有些属性可以合并为  比如 'ro'  red的o点形态
plt.legend()
plt.show

1.5 显示图像 plt.show() 和 plt.imshow()

  • # 显示图像
  • plt.show()
  • plt.imshow()    #还可以显示其格式

1.5.1 关于 plt.show() 到底是否需要,用jupyter来写py实测并不需要plt.show()

  • 据说,matplotlib作图,要显示图像,必须调用plt.show(), 否则不显示
  • 还有种说法是,加入如下代码后,不需要plt.show()也能正常显示,测试并不成功

%matplotlib notebook
%matplotlib inline

  • 但如果是用的jupyternotebook,那么实测没有 plt.show() 也能正常显示图形图像
  • 这个因为jupyternotebook这个特殊IDE决定的

1.6 用plt.plot 画出一个函数图形,测试代码

  • 下面是上面内容的综合使用
import numpy as np
import matplotlib.pyplot as plt

plt.plot(x,
         np.cos(x),
         color = 'r',            # 线条颜色
         linewidth = 2,          # 线条宽度 
         linestyle='-.',          # 线的类型:虚线:'--',点线:'-.',短虚线':',实线:'-'
         marker='*',             # 线上点的形状
         markersize = 5,        # 点的大小
         markeredgecolor = 'b',  # 点的边框颜色
         markerfacecolor ='green',   # 点的背景颜色,可能因为点太小没显示出来?
         label = 'cos',          # 图例
         alpha = 1 )             # 透明度:0-1之间 ,默认1
 
plt.legend(fontsize = 15)        # 显示图例
plt.show()

1.7 一个典型的报错  
plt.plot(x,y1,x,y2)  可以同时画2个曲线

TypeError: unsupported operand type(s) for ** or pow(): 'list' and 'int'

1.7.1 报错 TypeError: unsupported operand type(s) for ** or pow(): 'list' and 'int'

  • 问题是,x是python默认的list数据类型时会报错
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
 
x=[1,2,3,4,5]
print(type(x))
y1=2*x   #不能写成y1=2x
y2=x**2 

plt.plot(x,y1,x,y2) 
plt.show()

1.7.2  只要将 np.array([1,2,3,4,5]) 转化成 ndarray 就可以

  • x=np.array([1,2,3,4,5])
  • 问题是,x是python默认的list数据类型时会报错,但是用 np.array() 转化即可
  • 也就是说,只要x的数据类型是  ndarray就可以
  • 比如 
  • x=np.array([1,2,3,4,5])  #这样来处理list
  • x=np.array((1,2,3,4,5))  #这样来处理tuple

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
 
x=np.array([1,2,3,4,5])
print(type(x))
y1=2*x   #不能写成y1=2x
y2=x**2 

plt.plot(x,y1,x,y2) 
plt.show()

1.7.3  用 np.linspace([1,2,3,4,5]) 等 ndarray类型也可以

  • x=np.linspace(-5,5,10)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
 
x=np.linspace(-5,5,10)
print(type(x))
y1=2*x   #不能写成y1=2x
y2=x**2

plt.plot(x,y1,x,y2) 
plt.show()

1.7.4 用python 的list也可以,但是f(x) 也要修改为 list 也可以

  • x,f(x) 都是list才行

X=[1,2,3]
print(type(x))
y1=[2*x for x in X]
y2=[x**2 for x in X]

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
 
X=[1,2,3]
print(type(x))
y1=[2*x for x in X]
y2=[x**2 for x in X]
 
plt.plot(X,y1,X,y2)     #此时X不可省略,x是错的,必须用X才是ndarray
plt.show()

1.7.5 用ndarrat配合,但是f(x) 也要修改为 list 也可以

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
 
X=np.array([1,2,3])
print(type(x))
y1=[2*x for x in X]
y2=[x**2 for x in X]
 
plt.plot(X,y1,X,y2)     #此时X不可省略,x是错的,必须用X才是ndarray
plt.show()

1.8 plt.plot(x,y1,x,y2)  可以同时画2个曲线

  • 从上面的例子可以看出
  • plt.plot(x,y1,x,y2)  可以同时画2个曲线

2 画布和图形的本质

2.1 图片在plt里本质是 ndarray 矩阵

2.1.1 plt.imread(fname, format=None)

  • 其中,fname 的作用是设定要读取的图像文件的路径和名称。例如 fname = 'D:\local\test_img.png' 意味着我们将读取路径 D:\local\ 下格式为 png 的图像文件 test_img。
  • format 的作用是设定读取数据的图像文件格式。如果为 None,则将从文件名中获取。如上例中,test_img.png 意味着图片是以 png 格式储存的。
  • 需要注意的是,如果想要在后续的流程中使用读取的图像,imread() 读取出来的数据需要被储存在某个变量中。imread() 读取出来的图像数据将被储存为 numpy.array 格式。
     

2.1.2 保存图片的数据本质是 ndarray

  • 从下面代码可以看到,保存图片的数据本质是 ndarray

path1=r"C:\Users\Administrator\Desktop\tp2.jpg"
pic1=plt.imread(path1, format=None)
print(type(pic1))
print(pic1)

2.2 可用plt.imread(path) 和 plt.imshow(pic)直接读入图片和显示图片

2.2.1 接前面的plt.imread(path),还可以把保存的图片再用  plt.imshow(图片) 再显示出来

  • 用plt.imshow(pic) 即可

plt.imshow(pic1)

2.2.2 以上的测试代码

以上内容的测试过程和结果如下

import numpy as np
import matplotlib.pyplot as plt

path1=r"C:\Users\Administrator\Desktop\tp2.jpg"
pic1=plt.imread(path1, format=None)
print(type(pic1))
print(pic1)

fig=plt.figure
plt.imshow(pic1)

2.3  画布/子区域/坐标轴+图片的三层层级

2.3.1 层级关系

  • 第1层: figure  画布
  • 第2层: axes 子图,axes包含定义单元集的Axis对象。
  • plt创建 figure() 时,会自动创建一个默认的子区域 ,可以认为就是 ax=plt.subplots(1,1) ,至少我觉得可以这么认为^ ^
  • 第3层: axis 坐标轴+图片,axis是指定图表中所有baiAxes对象的组成部分。

2.4 ax相关的语法

除了格子特定的语法,还可以通过设置子区域ax的属性来设置那些属性

推测:ax(子图区域) 类似于 plt (全图区域)

  • 而用fig,axes=plt.subplots(2,2) 创建真正的子区域后,
  • 可以这样指定其中一个子区域ax1=axes[0,0]

  • 比如子区域ax1.scatter()和  全区域 plt.scatter()
  • 比如子区域ax.set_yticks(range(0,8,2))  和 plt.xticks(,labels=[])
  • ax = plt.gca()  和 ax.spines["top"]

但是axis相关的则是专门设置坐标轴的

  • 比如pyplot.axis(*v, **kwargs)

2.4.1 设置子区域和子区域作图

fig,axes=plt.subplots(2,2)
ax1=axes[0,0]
# 子图1,散点图
ax1.scatter(np.linspace(-2, 2, 5), np.random.randn(5))

2.4.2 设置坐标轴的label,比如ax.set_xticklabels()

比如 ax.set_xticklabels() 和 ax.set_yticklabels() 设置每个刻度对应的标签

fig, ax = plt.subplots(1)
ax.plot(x_label, x_label*2)
 
# 设置 y 轴刻度名称
ax.set_yticks(range(0,8,2))
ax.set_yticklabels(['Forth', 'Third', 'Second', 'First'])
 
plt.show()

2.4.3  设置坐标轴ax = plt.gca()  和 ax.spines["top"]

  • # 获取坐标轴,gca就是get current axes的意思
  • ax = plt.gca()
  • 图片的4边,都是spine
  • 可以通过plt.gca().spines 分别操作这4个spine
  1. ax.spines["top"]
  2. ax.spines["bottom"]
  3. ax.spines["right"] 
  4. ax.spines["left"]

2.4.4 上述代码测试:plt.plot() 和 ax1.plot(2,3) 确实很像,分别针对全图/子图

  • 事实证明,plt.  ax1. 很像
  • plt.表示全图区域内,ax1.表示子图区域内
  • plt.plot() 
  • ax1.plot()

A> figure范围内
  • #定义全图区域
  • fig= plt.figure()
  • #设置全图
  • plt.plot(x, x**2)
  • #设置全图的轴
  • plt.gca().spines[]
  • #设置全图的轴的内容
  • plt.xticks()

B> fig,axes=plt.subplots(2,3)子图范围内
  • #定义子图区域
  • fig,axes=plt.subplots(2,3)
  • ax1=axes[0,0]
  • #设置子图
  • ax1.plot(x, x**2)
  • #设置子图的轴
  • ax1.spines[]
  • #设置子图的轴的内容
  • ax1.set_yticks(range(0,20,4))

C> 尽量不要在ax1 等子图区域,生效范围内写plt.plot()等
  • 尽量不要在ax1 等子图区域,生效范围内写plt.plot()等
  • 否则会让plt.plot() 的内容显示在子图区域的最后一个子图区域

下面是详细代码

import numpy as np
import matplotlib.pyplot as plt

#---------------第1部分内容---------------
#第1部分内容,第1个figure生效范围
x=np.linspace(-5, 5, 10)
plt.plot(x, x**1)
plt.xticks([-5,-2,0,2,5],labels=["A","B","C","D","E"])

ax = plt.gca()
ax.spines["right"].set_color("none")
plt.gca().spines["top"].set_color("none")
ax.spines["bottom"].set_position(("data", 0))
plt.gca().spines["left"].set_position(("data", 0))

#因为ax = plt.gca()  所以ax.plot()画的图形还是会显示在第一个figure内
ax.plot(x, x**2)


#---------------第2部分内容---------------
#第2部分内容,第2个figure且倍分割为子图区域

fig,axes=plt.subplots(2,3)
ax1=axes[0,0]
# 子图1,散点图
ax1.plot(x, x**2)
ax1.set_yticks(range(0,20,4))
ax1.set_yticklabels(['First','Second','Third', 'Forth', 'Fifth'])
ax1.spines["right"].set_color("none")
ax1.spines["top"].set_color("none")
ax1.spines["bottom"].set_position(("data", 0))
ax1.spines["left"].set_position(("data", 0))

ax2=axes[0,1]
# 子图1,散点图

#plt.开头的如果在fig,axes=plt.subplots(2,3) 后,会默认作图在最后一个子图里,而不是完整的大图
#因此不适合在ax2 等子区域内做 plt.plot() 等整图设置
plt.plot(x, x**2)
plt.yticks(range(0,20,4),['First','Second','Third', 'Forth', 'Fifth'])

ax = plt.gca()
ax.spines["right"].set_color("none")
ax.spines["top"].set_color("none")
ax.spines["bottom"].set_position(("data", 0))
ax.spines["left"].set_position(("data", 0))
ax.plot(x, x**2)


#---------------第3部分内容---------------
#第3部分内容,第3个figure
fig3=plt.figure()
plt.plot(x, x**2)
plt.yticks(range(0,20,4),['First','Second','Third', 'Forth', 'Fifth'])

ax = plt.gca()
ax.spines["right"].set_color("none")
ax.spines["top"].set_color("none")
ax.spines["bottom"].set_position(("data", 0))
ax.spines["left"].set_position(("data", 0))
ax.plot(x, x**2)

2.5 用rect位置参数 来设置子区域

  • 如rect = [left, bottom, width, height]
  • axes1=fig.add_axes([0,0,0.5,0.5],facecolor="green")
  • axes2=fig.add_axes([0.4,0.4,0.3,0.3],facecolor="blue",sharex=axes1)

2.5.1 fig.add_axes([left, bottom, width, height])

  • left       
  •  #左下角的角点的位置,但是和 axes区域的左下角点不是一个点,应该时figure的左下角点。
  • bottom  #左下角的角点的位置
  • width     #相对figure的比例
  • height    #相对figure的比例

import numpy as np
import matplotlib.pyplot as plt

fig=plt.figure(num=1,
               figsize=[5,5],
               dpi=None,
               facecolor="gray", 
               linewidth=5,
               edgecolor="red", 
               frameon=True)

plt.title("测试图")
#fig.add_axes([left, bottom, width, height])
axes1=fig.add_axes([0,0,0.5,0.5],facecolor="green")
axes2=fig.add_axes([0.4,0.4,0.3,0.3],facecolor="blue",sharex=axes1)
plt.show()

2.6 设置坐标轴

2.6.1 matplotlib.pyplot.axis(*v, **kwargs)

**kwargs

  • plt.axis(option="on")
  • plt.axis("on")
  • plt.axis("off")
  • plt.axis("equal")
  • plt.axis("auto")
  • plt.axis("sacle")

import numpy as np
import matplotlib.pyplot as plt

fig=plt.figure(num=1,
               figsize=[5,5],
               dpi=None,
               facecolor="gray", 
               linewidth=5,
               edgecolor="red", 
               frameon=True)

plt.title("测试图")
#fig.add_axes([left, bottom, width, height])
axes1=fig.add_axes([0,0,0.5,0.5],facecolor="green")
axes2=fig.add_axes([0.4,0.4,0.3,0.3],facecolor="blue",sharex=axes1)

plt.plot([0,1,2,3,4,5],[0,1,4,9,16,25])
plt.axis("on")
plt.axis("equal")


plt.show()

修改

plt.axis("on")
plt.axis("scaled")

3 画布的各种设定

3.1 关于颜色的设定

3.1.1 颜色的写法

  • 可以使用 "b" 等颜色字符串缩写,比如"b" 代表 "blue"
  • 也可以是复合写法:比如颜色线,点的复合控制字符串

  1. 比如下面的参数  'gd-.' 

  2. 比如用 "ro" 表示red的o型

plt.plot(x_label, x_label*1., 'gd-.')
plt.show()

  • 也可以直接使用 RGB颜色代码 如  "#000000"

3.1.2 修改颜色代码例子

import numpy as np
import matplotlib.pyplot as plt

x=np.linspace(-10,10,100)

plt.figure
plt.plot(x,np.sin(x),c="b")

plt.show

  • 下面改用rgb颜色代码
import numpy as np
import matplotlib.pyplot as plt

x=np.linspace(-10,10,100)

plt.figure
plt.plot(x,np.sin(x),c="#000000")

plt.show

3.2 设置画布的图形标题

  • plt.title("here is title")
  • 一般在 figure的 正中间的正上方

3.3 图片的图例

3.3.1 用plt.legend() 可设置多个曲线的图例,且默认展示在一起。

  • # 显示图例
  • plt.legend()
  • plt.legend(labels=[xx_label, x_label])

3.3.2 plt.plot(lable="")也可以设置单个plot 曲线的label,和图例效果差不多

  • plt.plot(x, y, linestyle, linewidth,color,marker, markersize, markeredgecolor, markerfactcolor, label, alpha)
  • 见下图
  • 但是,必须配合 plt.legend() 图例名字才会显示,否则不显示。

3.3.3 如何设置图例 plt.legend()

显示要求

  • 图例无论是plt.plot(label="")设置,还是直接用 plt.legend() 设置
  • 都必须配合 plt.legend() 图例名字才会显示,否则不显示。

可以通过设置 loc=""属性,设置图例显示的位置,默认在左上角 upper left

3.3.4 可用的 plt.legend(loc="") 属性

 可设置legend的位置

    best
    upper right
    upper left
    lower left
    lower right
    right
    center left
    center right
    lower center
    upper center
    center

3.3.5 测试图例 plt.legend()代码 

import numpy as np
import matplotlib.pyplot as plt

x=[1,2,3,4,5]
y=[2,4,6,8,10]
y2=[z**2 for z in x]

plt.figure
plt.plot(x,y,c="#000000",label="2x")
plt.plot(x,y2,label="x^2")

plt.legend()  # 如果不加这句 plt.legend() ,plot(label="")不会显示,默认在左上角
plt.legend(loc="lower right")

plt.show

3.4 是否显示网格

  • plt.grid(True)     # 显示网格
  • plt.grid(False)    # 隐藏网格


 

 4  关于坐标轴的各种设置

  • 坐标轴描述
  • 坐标轴范围设置
  • 坐标轴刻度
  • 挪动坐标轴

4.1 坐标轴的描述

  • plt.xlabel("X axis")
  • plt.ylabel("Y axis")

4.2 坐标轴范围设置

  • plt.xlim((-10,10))
  • plt.ylim((-10,10))

4.3 坐标轴的刻度设置

4.3.1 设置坐标轴刻度:用数组,或者其他类linspace()都可以

  • # 设置坐标轴刻度
  • plt.xticks([-4, -2, 0, 2, 4])
  • plt.yticks(np.linspace(-10, 10, 10))
  • 这里我们需要注意三点:

  1. 设置的刻度不一定可以铺满整个坐标轴,如果无法铺满则剩下的部分不会显示刻度;
  2.  range() 函数无法生成浮点数,np.linspace() 可以, np.arange() 也可以
  3.  设置刻度时无法显示最后一个刻度,因此如果需要显示最后一个刻度最好多生成一个刻度。

4.3.2 清除刻度

  • # 这样可以清除刻度
  • plt.xticks()
  • plt.yticks()
import numpy as np
import matplotlib.pyplot as plt

fig1=plt.figure(num=1)

x=np.linspace(-5,5, 10)
y=x*2+1
y2=x**2

# 设置坐标轴描述
plt.xlabel("X axis")
plt.ylabel("Y axis")

# 设置坐标轴范围
plt.xlim((-10,10))
plt.ylim((-10,10))

# 设置坐标轴刻度
plt.xticks([-4, -2, 0, 2, 4])
plt.yticks(np.linspace(-10, 10, 10))
# 这样可以清除刻度 plt.xticks()
# 这样可以清除刻度 plt.yticks()

# 绘图
plt.plot(x, y)
plt.plot(x, y2)

# 显示图像
plt.show()

4.3.3 把数字刻度--标记为文本标签 label的显示形式

plt.yticks([-1,-0.5,0,0.5,1],labels="ABCDE") 

  • labels="" 可以用来设置对应的中文标签
  • 记住,需要和刻度值一一对应,最好设置为数组
  • labels()需要配合固定且刻度数量刻度标签数量相同的刻度。如果两者数量不符则会报错
  • 可以不加label="" 关键字
  1. plt.xticks([-10,-5,0,5,10],['巴黎','北京','纽约','伦敦','悉尼'])
  2. plt.xticks([-10,-5,0,5,10],labels=['巴黎','北京','纽约','伦敦','悉尼'])
  • 对应方法
  • 按字符串一个一个对应
  • plt.yticks([-1,-0.5,0,0.5,1],labels="ABCDE")
  • 按数组内的元素个数一一对应,更灵活
  • plt.xticks([-10,-5,0,5,10],labels=['巴黎','北京','纽约','伦敦','悉尼'])
  • 关键字参数,的labels= 可以省略

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.family']='LiSu'# 正常显示中文
plt.rcParams['axes.unicode_minus']=False# 正常显示负号

x=np.linspace(-10,10,100)

plt.figure
plt.plot(x,np.sin(x),c="#000000")

plt.xticks([-10,-5,0,5,10],['巴黎','北京','纽约','伦敦','悉尼'])
# 这样也可以 plt.xticks([-10,-5,0,5,10],labels=['巴黎','北京','纽约','伦敦','悉尼'])
plt.yticks([-1,-0.5,0,0.5,1],labels="ABCDE")

plt.show

4.3.4 如果在label="" 包含中文时出现乱码,在block开头加如下代码即可

plt.rcParams['font.family']='LiSu'# 正常显示中文
plt.rcParams['axes.unicode_minus']=False# 正常显示负号

4.4 显示文本注释: plt.text()

4.4.1 语法

plt.text(x =pos,y = pos, s = '这是标注', fontsize = 15,c = 'b',rotation = 20)

  • x表示x轴坐标值
  • y表示y轴坐标值 
  • fontsize = 15
  • c = 'b'
  • rotation控制文本字体角度

4.4.2 测试代码

import numpy as np
import matplotlib.pyplot as plt

x=[1,2,3,4,5]
y=[2,4,6,8,10]
y2=[z**2 for z in x]

plt.figure
plt.plot(x,y,c="#000000",label="2x")
plt.plot(x,y2,label="x^2")

plt.legend()  # 如果不加这句 plt.legend() ,plot(label="")不会显示,默认在左上角
plt.legend(loc="lower right")

plt.text(x=3,y=6,s="这是2y",fontsize = 20,c = 'b',rotation = 15)
plt.text(x=3,y=10,s="这是y^2",fontsize = 20,c = 'r',rotation = 50)


#plt.savefig(r"C:\Users\Administrator\Desktop\测试函数图片101.jpg")

plt.show

4.5 显示箭头+文本注释: plt.annotate()

4.5.1 语法

plt.annotate(text,xy,xytext,arrowprops)

  • text表示注释文本
  • xy表示箭头端点位置,也是箭头的指向终点
  • xytext表示文本注释的位置,也是箭头的指向起点
  • arrowprops控制箭头,形式为字典

4.5.2 测试代码

import numpy as np
import matplotlib.pyplot as plt

x=[1,2,3,4,5]
y=[2,4,6,8,10]
y2=[z**2 for z in x]

plt.figure
plt.plot(x,y,c="#000000",label="2x")
plt.plot(x,y2,label="x^2")

plt.legend()  # 如果不加这句 plt.legend() ,plot(label="")不会显示,默认在左上角
plt.legend(loc="lower right")

plt.text(x=3,y=6,s="这是2y",fontsize = 20,c = 'b',rotation = 15)
plt.text(x=3,y=10,s="这是y^2",fontsize = 20,c = 'r',rotation = 50)

plt.annotate(text = '相交点',xy = (2,4),xytext = (2,10),
             arrowprops = {'headwidth':10,'facecolor':'r'},fontsize = 15)


#plt.savefig(r"C:\Users\Administrator\Desktop\测试函数图片101.jpg")

plt.show

4.6 图形间填充

4.6.1 语法

  • plt.fill_between(x,y,y2,facecolor = 'k',alpha = 0.2)
  • 第一个参数表示要覆盖的左右范围
  • 第二个参数表示覆盖的下限
  • 第三个参数表示覆盖的上限,
  • 在这里则表示填充y曲线和y2曲线中间的区域

4.6.2 测试代码

import numpy as np
import matplotlib.pyplot as plt

x=[1,2,3,4,5]
y=[2,4,6,8,10]
y2=[z**2 for z in x]

plt.figure
plt.plot(x,y,c="#000000",label="2x")
plt.plot(x,y2,label="x^2")

plt.legend()  # 如果不加这句 plt.legend() ,plot(label="")不会显示,默认在左上角
plt.legend(loc="lower right")

plt.text(x=3,y=6,s="这是2y",fontsize = 20,c = 'b',rotation = 15)
plt.text(x=3,y=10,s="这是y^2",fontsize = 20,c = 'r',rotation = 50)

plt.annotate(text = '相交点',xy = (2,4),xytext = (2,10),
             arrowprops = {'headwidth':10,'facecolor':'r'},fontsize = 15)
plt.fill_between(x,y,y2,facecolor = 'k',alpha = 0.2)


#plt.savefig(r"C:\Users\Administrator\Desktop\测试函数图片101.jpg")

plt.show

5 边界spines 和 移动坐标轴

5.1 先获取坐标轴

  • # 获取坐标轴,gca就是get current axes的意思
  • ax = plt.gca()

5.2 图片的4边,都是spine

  • 图片的4边,都是spine
  • 可以通过plt.gca().spines 分别操作这4个spine
  1. ax.spines["top"]
  2. ax.spines["bottom"]
  3. ax.spines["right"] 
  4. ax.spines["left"]

5.3 比如隐藏右边、上边的spine

  • # 隐藏右边、上边的spine
  • ax.spines["right"].set_color("none")
  • ax.spines["top"].set_color("none")

5.4 移动两个spine到0,0 点,达到把坐标轴移动的目的

  • # 移动两个spine到0,0,达到把坐标轴移动的目的
  • ax.spines["bottom"].set_position(("data", 0))
  • ax.spines["left"].set_position(("data", 0))

5.5 移动坐标轴的代码(可看出坐标pos(0,0)处有了我们熟悉的数学坐标轴!

  • spine 不是坐标轴,所以看起来像在第一象限!但实际上往往不是!!
  • 所以要建立我们熟悉的 数学坐标轴!在postion(0,0)处

5.5.1 移动效果看下面的图

  • 一般默认显示在 “ 看起来的(假的)第一象限 ”(看起来总是好像在第一象限,但是是假的,因为你可以发现左边和下面的轴并不是从远点出发的,而只是为了美观设置的轴)
  • 实际坐标轴可能是其他象限,但是因为 spine 不是坐标轴,所以看起来像在第一象限! 
  • 图形移动到坐标轴的中间了

5.5.2 移动坐标轴前后对比的测试代码

import numpy as np
import matplotlib.pyplot as plt


#原始的
figure = plt.figure(num=99)
# x,y
x = np.linspace(-4, 4, 50)
y = x ** 2 - 4
xx_label = r"y = x ^ 2 - 4"
x_label = r"y = x"
plt.title("here is title")

# 绘图
plt.plot(x, y, color="#ff0000",label="xxx")
# 显示图例
plt.legend()
plt.plot(x, x)
# 显示网格
plt.grid(True)
# 显示图例
plt.legend(labels=[xx_label, x_label])





# 移动坐标轴的第2个图
figure = plt.figure(num=100)

# x,y
x = np.linspace(-4, 4, 50)
y = x ** 2 - 4

# 获取到坐标轴
ax = plt.gca()

# 隐藏右边、上边的spine
ax.spines["right"].set_color("none")
ax.spines["top"].set_color("none")

# 移动两个spine到0,0,达到把坐标轴移动的目的
ax.spines["bottom"].set_position(("data", 0))
ax.spines["left"].set_position(("data", 0))

xx_label = r"y = x ^ 2 - 4"
x_label = r"y = x"
plt.title("here is title")

# 绘图
plt.plot(x, y, color="#ff0000",label="xxx")

# 显示图例
plt.legend()

plt.plot(x, x)

# 显示网格
plt.grid(True)

# 显示图例
plt.legend(labels=[xx_label, x_label])

plt.show()

  • 图片上有容易让人误导的地方
  • 比如y=x 并不是45°直线,是因为格子grid不是正方形,是长方形压扁的缘故,请注意

5.6 一个警告,不是报错

 运行代码时可能会出现如下警告:No artists with labels found to put in legend. Note that artists whose label

5.6.1 警告出现的可能原因1

#plt.plot() 相关代码中缺乏label名称的说明

  • plt.plot(x, y, color="#ff0000")
  • plt.plot(x, y, color="#ff0000",label="xxx")   #没有这个就会警告 label="xxx"

5.6.2 警告出现的可能原因2

#legend相关代码中缺乏label名称的说明,需要给予图例对应的名字

  • # 显示图例
  • plt.legend()
  • plt.legend(labels=[xx_label, x_label]) # 调整后不报错并显示图例

6 保存图片 plt.savefig()

6.1 详细语法

plt.savefig(fname, dpi=None, facecolor='w', edgecolor='w')

  • fname  #文件名 或者保存位置
  • dpi
  • facecolor
  • edgecolor

6.2 测试保存代码

import numpy as np
import matplotlib.pyplot as plt

x=[1,2,3,4,5]
y=[2,4,6,8,10]
y2=[z**2 for z in x]

plt.figure
plt.plot(x,y,c="#000000",label="2x")
plt.plot(x,y2,label="x^2")

plt.legend()  # 如果不加这句 plt.legend() ,plot(label="")不会显示,默认在左上角
plt.legend(loc="lower right")


plt.savefig(r"C:\Users\Administrator\Desktop\测试函数图片101.jpg")

plt.show

  • 17
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值