matplotlib
实例代码
# 导入 matplotlib 的所有内容(nympy 可以用 np 这个名字来使用)
from pylab import *
# 创建一个 8 * 6 点(point)的图,并设置分辨率为 80
figure(figsize=(8,6), dpi=80)
# 创建一个新的 1 * 1 的子图,接下来的图样绘制在其中的第 1 块(也是唯一的一块)
subplot(1,1,1)
X = np.linspace(-np.pi, np.pi, 256,endpoint=True)
C,S = np.cos(X), np.sin(X)
# 绘制余弦曲线,使用蓝色的、连续的、宽度为 1 (像素)的线条
plot(X, C, color="blue", linewidth=1.0, linestyle="-")
# 绘制正弦曲线,使用绿色的、连续的、宽度为 1 (像素)的线条
plot(X, S, color="green", linewidth=1.0, linestyle="-")
# 设置横轴的上下限
xlim(-4.0,4.0)
# 设置横轴记号
xticks(np.linspace(-4,4,9,endpoint=True))
# 设置纵轴的上下限
ylim(-1.0,1.0)
# 设置纵轴记号
yticks(np.linspace(-1,1,5,endpoint=True))
# 以分辨率 72 来保存图片
# savefig("exercice_2.png",dpi=72)
# 在屏幕上显示
show()
设置底层图片的大小
- figsize()函数设置散点图是几×几大小的
- dpi设置分辨率(像素)
像素的定义:
- 在由一个数字序列表示的图像中的一个最小单位
- 当像素点的大小一定时,像素点约多,照片越大
改变线条的颜色和粗细
- plot()函数
- color参数设置颜色
- linewidth参数设置线条粗细
- linestyle参数设置线条风格
plot函数详解:
- plt.plot(x,y,linestyle=’-‘,linewidth=’x’,label=’xxx’,color=’xxx’)
- x:x轴上的值
- y:y轴上的值
- linestyle:线条风格
- linewidth:线条粗细
- label:标签文本
plot函数常见问题:
x and y must have same first dimensition,but have shapes (4,) and (6,)
linestyle参数
'-', '--', '-.', ':', 'None', ' ', '', 'solid', 'dashed', 'dashdot', 'dotted'
设置图片边界
设置记号
- r表示不需要转义,raw(生的),LATEX用法,python中使用latex,需要在文本的后面加上$,\pi会转义为pi
xticks(lis,[r'$-\pi$',r'$-\pi/2$',r'$0$',r'$-\pi$',r'$-\pi$'])
- 后面数组中的每一个元素都与前面元素一一对应
设置轴:
- matplotlib的图中,默认有四个轴,两个横轴和两个竖轴,通过ax.plt.gca()方法获取,gca是get current axes的缩写(axes是轴的意思)
- 总共有四个轴:top,bottom,left,right
由于axes会获取到四个轴,而我们只需要两个轴,所以我们需要把另外两个轴隐藏,把顶部和右边轴的颜色设置为none,将不会显示
ax.spines['right'].set_color('none') ax.spines['top'].set_color('none')
- 将会看见top和right边被隐藏
移动下面和左边的轴到指定的位置
具体函数:ax.spines[‘四个轴的位置’].set_position(‘值的类型’,具体值)
一定一定要注意,spines后面是[]而非(),set_position後面是() 我對此的理解為:[]表示选择,ax在gca()时已经初始化了,[]是在top,bottom,left和right中的选择;()表示需补充参数,参数未经过初始化 区分选择和补充的含义
以下是set_position中各种值的类型
- data:移动轴的位置到交叉轴的指定坐标
- outward:不太懂
- axes:0.0~1.0之间的值,整个轴上的比例
- center:(‘axes’,0.5)
- zero:(‘data’,0.0)
ax.spines['bottom'].set_position(('data',0)) ax.spines['left'].set_position(('data',0))
- 由上图可看出,这个轴其实不是坐标轴,而是图形的边界
- 我认为:top和right的轴是图形的边界,不能够改变坐标轴
- 而left和bottom可以改变坐标轴的位置,参数如上图所示
添加图例:
- 在plot函数中以[键-值] 的形式增加一个参数
plot(X,S,color="blue",linewidth=2.5,linestyle="-",lable="图例名称") legend(loc="位置")
- legend位置参数:upper,bottom,left,right
常用legend函数参数:
- loc:图例位置
- fontsize:字体大小
- edgecolor: frame edgecolor
- facecolor: frame facecolor
特殊点添加注释:函数scatter(意为分散的点)
- 前提:x,y轴包括数值以及大小和颜色
- https://www.jb51.net/article/127806.htm
scatter([t,],[np.cos(t),],50,color='blue')
- scatter(x,y,[size],[color],[marker])
scatter参数详解:
- x,y:形如shape[n,]不全的数组,即添加注释点的位置
- size:直接给出点的大小,标量或者形如shape[n,]的数组
- color:色彩或颜色序列
- marker:markstyle,可选,默认’o’
annotate参数详解
annotate(s,xy,xytext=None,xycoords='data',textcoords=None)
- s:被注释内容
- xy:被注释的坐标点,二维元组形如[x,y]
- xytext:注释文本的坐标点,也是二维元组,默认与xy相同
- xycoords:被注释点的坐标系属性
- textcoords设置注释文本的坐标系属性
annotate(r'$sin(\frac{2\pi}{3})'=\frac{\sqrt{3}}{2}$',xy=(t,np.sin(t)),xycoords='data',xytext=(+10,+30),textcoords='offset points')
看过李师哥的备课后的补充
构建画框的骨架的两种方法:
和fig = plt.figure() ax = fig.add_axes([0.1,0.1,0.8,0.8])
fig = plt.figure() ax = gca()//初始化四个轴 left = bottom = 0.1 right = top = 0.8 ls = [left,bottom,right,top] for i in ls: ax.spines[top].set_position(i)
子图的划分
- 如果两个图片的x轴的范围不同的情况下,放在同一张画布下是不易显示的
格式一
figure = plt.figure() plt.subplot(nrows,ncols,plot_number)
- 其中nrows表示要划分的行数
- ncols表示要划分的列数
- plot_number表示当前的子图区
from pylab import * x = [] y = [] figure = figure((m,n),dpi)//创建一个m*n点的图像 axes1 = figure.add_subplot(2,1,1)//划分为两行,将第一行作为当前需要描绘的子图区 plot(x,y) x = [] y = [] axes2 = figure.add_subplot(2,1,2)//选取第二块子图区 plot(x,y) show()
plt.rcParams属性总结
- plt使用rc配置文件;来自定义图形的各种观点默认属性,称之为rc配置或rc参数,通过rc参数可以修改默认的属性,包括窗体大小,每英寸的点数,线条宽度,颜色,样式,坐标轴坐标,网络属性,文本,字体
- plt.rcParams[‘font.sans-serif’] = ‘SimHei’设置字体
- plt.rcParams[‘axes.unicode_minus’] = False字符显示:减号使用unicode编码而不是连字符号
设置中文字体:
- plt.rcParams[‘font.san-serif’]=[‘SimHei’]:SimHei是设置字体为黑体
- plt.rcParams[‘axes.unicode_minus’] = False设置字符显示
- 这个地方的unicode_minus我的理解为减去unicode即为不使用Unicode编码
- 如果设置为false,则负负得正,使用Unicode编码
获取用户配置路径
import matplotlib matplotlib.get_gonfigdir()
获取用户当前使用配置文件的路径
import matplotlib
matplotlib.matplotlib_fname()
查看rc参数的方法与rc参数的使用
查看:
import matplotlib as mpl print(mpl.rcParams)
修改:(用中括号去取下标)
import matplotlib matplotlib.rcParams['具体参数名称'] = xxx
通过matplotlib.rc一次设置多个参数
import matplotlib matplotlib.rc('lines',linewidth=2,color='red')
rc参数说明:
lines.linewidth:线宽 lines.linestyle:线的风格 lines.color:线的颜色 lines.marker:None 默认标记 lines.markersize:标记大小 lines.antialiased:True 使用抗锯齿渲染:没有缺口
rc参数字体属性:
font.family
font.style:normal(roman),italic,oblique
font.variant:normal,small-caps
font.weight:normal,bold,bolder,lighter,100,200,300…900
font.stretch
font.size:默认字体大小,以磅为单位
网格:
grid.color:网格颜色 grid.linestyle:点 grid.linewidth:pt
具体参数详见博客地址
https://www.cnblogs.com/shuaishuaidefeizhu/p/14035247.html
思路
- 引入matpoltlib库
- 创建一个图作为背景figure
- x轴坐标,y轴坐标
- plot绘制曲线
- 设置横轴上下限xlim
- 设置横轴记号和纵轴记号
- 保存图片savefig
- 在屏幕上显示show
正弦函数图像
from pylab import *
figure(figsize=(8,6),dpi=80)
x = np.linspace(-np.pi,np.pi,256,endpoint=True)
y = np.sin(x)
plot(x,y,color='blue',linewidth='10',linestyle='-')
xlim(-4.0,4.0)
ylim(-1.0,1.0)
xticks(np.linspace(-4,4,9,endpoint=True))
yticks(np.linspace(-1.0,1.0,3,endpoint=True))
ax = gca()
ax.spines['right'].set_color('None')
ax.spines['top'].set_color('None')
ax.spines['bottom'].set_position(('axes',0.5))
ax.spines['left'].set_position(('axes',0.5))
show()
二次曲线图像
from pylab import *
from numpy import *
x = np.linspace(-1,1,66,endpoint=True)
y = x**2
plot(x,y,linestyle='-',lw='10',color='blue')
show()
正余弦函数图像
from pylab import *
fig = figure(figsize=(8,6),dpi=80)#dpi参数是分辨率
fig.add_axes([0.1,0.1,0.8,0.8])
subplot(1,1,1)#创建一个1*1子图,接下来图样的绘制在第一块
x = np.linspace(-np.pi,np.pi,256,endpoint=True)
c,s = np.cos(x),np.sin(x)
plot(x,c,color="blue",linewidth=1.0,linestyle="solid",label="cosine")
plot(x,s,color="green",linewidth=1.0,linestyle="dotted",label="sine")
legend(loc='upper left',fontsize="18")
xlim(-4.0,4.0)
lis = ([-np.pi,-np.pi/2.0,0,np.pi/2.0,np.pi])
#xticks(np.linspace(-4,4,9,endpoint=True))
ylim(-1.0,1.0)
#yticks(np.linspace(-4,4,9,endpoint=True))
#xticks(lis)
xticks(lis,[r'$-\pi$',r'$-\pi/2$',r'$0$',r'$-\pi$',r'$-\pi$'])#r表示不需要转义,raw(生的),LATEX用法,python中使用latex,需要在文本的后面加上$,\pi会转义为pi
yticks(lis)
ax = gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.spines['bottom'].set_position(('axes',0.5))
ax.spines['left'].set_position(('axes',0.5))
t = 2*np.pi/3
plot([t,t],[0,np.cos(t)],color='blue',linewidth=2.5,linestyle='--')
scatter([t,],[np.cos(t),],50,color='blue')
t = 2*np.pi/3
plot([t,t],[0,np.cos(t)], color ='blue', linewidth=2.5, linestyle="--")
scatter([t,],[np.cos(t),], 50, color ='blue')
annotate(r'$\sin(\frac{2\pi}{3})=\frac{\sqrt{3}}{2}$',
xy=(t, np.sin(t)), xycoords='data',
xytext=(+10, +30), textcoords='offset points', fontsize=16,
arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))
plot([t,t],[0,np.sin(t)], color ='red', linewidth=2.5, linestyle="--")
scatter([t,],[np.sin(t),], 50, color ='red')
annotate(r'$\cos(\frac{2\pi}{3})=-\frac{1}{2}$',
xy=(t, np.cos(t)), xycoords='data',
xytext=(-90, -50), textcoords='offset points', fontsize=16,
arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))
show()
将一个figure对象划分为6个子图,分别绘制不同的曲线,不同的颜色和标记的线条
from pylab import *
x = [1,2,3,4,5,6]
y = [3,5,7,1,9,12]
figure = figure(figsize=(8,6),dpi = 80)
axes1 = figure.add_subplot(2,3,1)
axes2 = figure.add_subplot(2,3,2)
axes3 = figure.add_subplot(2,3,3)
axes4 = figure.add_subplot(2,3,4)
axes5 = figure.add_subplot(2,3,5)
axes6 = figure.add_subplot(2,3,6)
axes1.plot(x,y,'ro')
axes2.plot(x,y,'r-*')
axes3.plot(x,y,'bs')
axes4.plot(x,y,'^g-.')
axes5.plot(x,y,'m8')
axes6.plot(x,y,'yd:')
show()
- plot中的线条的线性,标记的符号和线条的颜色参数的前后位置没有要求
条形图
特点:
- 在条形图中可以非常直观地通过位置比较比较数值大小,因为在条形图中条的高度就是数值,所以一眼就可以看出数值的高度
函数
bar(x,height,width,bottom)
参数:
(x,height)定义在什么位置上,多高的bar(这个地方的高度其实是条形图的宽度,因为是躺着的,所以叫高度)
width定义bar的宽度(这个地方的宽度是条形图的高度,因为是躺着的,座椅叫做宽度)
bottom定义bar的实际高度(我的理解是bar的实际底在哪里)
默认参数:
height:柱子的高度,y轴上的坐标
width:柱子的宽度,默认值是0.8
bottom:柱子的基准高度,浮点数或者类数组结构,默认值为0
bar orientation:给定的是一个向量,该向量指定单元局部坐标系的纵轴方向
条形图实例
from pylab import * x = [1,2,3,4,5,6] y = [2,3,54,6,7,4] figure = figure(figsize=(8,6),dpi = 80) bar(x,y) show()
横向条形图实例
from pylab import * x = [1,2,3,4,5,6] y = [3,5,1,7,9,12] #x指定其实位置从0开始,bottom指定水平条其实位置为左侧,height指定绘图的水平条的宽度,width指定绘制的水平条的长度,orientation指定要绘制的是水平条,color指定颜色 bar(x=0,bottom=y,height=0.3,width=x,orientation='horizontal',color='red') show()
注意重叠问题:
在绘制多组条形图进行对比时需要注意一点,bar_width的范围是(0,1)没错,但是多组图表需要保证几组图表的范围之和不超过1(范围之和!和!!和!!!)
``` ## 2022/11再复习 1. 导入包 2. ```python import matplotlib.pyplot as plt import numpy as np
划分数据,从哪到哪平均分为几份,使用numpy库中的linespace函数
```python
x = np.linespace(-1,1,50)5. 新建图表 6. ```python plt.figure(num=1,figsize=(8,5),dpi=10) # figsize用来设置图像大小 # num用来设置图像是第几个,编号为几
设置坐标轴的范围,matplotlib库中的xlim和ylim函数,x-limit和y-limit
```python
plt.xlim((-1,2))
plt.ylim((-2,3))9. 设置坐标轴上单位的小标 10. ```python # 设置单位的小标 new_ticks = np.linspace(-1,2,5) plt.xticks(new_ticks) plt.yticks([-2,-1.8,-1,1.22,3], [r'$really\ bad$',r'$bad$',r'$normal$',r'$good$',r'$really\ good$'])
设置x轴和y轴的名字,matplotlib库中的xlabel和ylabel
```python
plt.xlabel(‘i am x’)
plt.ylabel(‘i am y’)13. 设置单位的小标,使用xticks和yticks来设置横坐标和纵坐标 14. ```python new_ticks = np.linspace(-1,2,5) plt.xticks(new_ticks)
gca = ‘get current axis’
```python
ax = plt.gca()将右边和上边的坐标轴颜色设置为空,不显示
ax.spines[‘right’].set_color(‘none’)
ax.spines[‘top’].set_color(‘none’)将x轴设置为底部bottom,将y轴设置为顶部top
ax.xaxis.set_ticks_position(‘bottom’)
ax.xaxis.set_ticks_position(‘left’)将x轴和y轴(底轴和左轴的位置设置为坐标原点)
ax.spines[‘bottom’].set_position((‘data’,0))
ax.spines[‘left’].set_position((‘data’,0))17. 添加legend图例 18. ``` l1 = plt.plot(x,y2,label='注记名称') # x,y2用来选择某条线 l2 = plt.plot(x,y1,label='注记名称') # 前两个参数可以确定某条线 #legend函数用来画出图例 plt.legend() # 其中loc=''参数默认是best,会自动选择不会挡住图像的最佳位置 # labels=['1','2'] 图像标注会覆盖掉plt.plot函数中的label # handles=[]参数会选择要画的线,其中画的线由plt.plot函数赋值
添加Annotation标注,特别标注某个点并给出文字
```python
x0 = 1
y0 = 2 * x0 + 1
plt.Scatter(x0,y0,s=50,color=’blue’) # Scatter用来画出点,s用来设置Scatter.size,color用来设置颜色
plt.plot([x0,x0],[y0,0],’k–’,lw=2.5) # [从.x,到.x][从.y,到.y]22. ```python import matplotlib.pyplot as plt import numpy as np x = np.linspace(-1,1,50) y1 = 2*x + 1 y2 = x**2 plt.figure() # 设置坐标轴的范围 plt.xlim((-1,2)) plt.ylim((-2,3)) # 设置x轴和y轴的名字 plt.xlabel('i am x') plt.ylabel('i am y') # 设置单位的小标 new_ticks = np.linspace(-1,2,5) plt.xticks(new_ticks) plt.yticks([-2,-1.8,-1,1.22,3], [r'$really\ bad$',r'$bad$',r'$normal$',r'$good$',r'$really\ good$']) plt.plot(x,y1) plt.plot(x,y2) ax = plt.gca() ax.spines['right'].set_color('none') ax.spines['top'].set_color('none') ax.xaxis.set_ticks_position('bottom') ax.yaxis.set_ticks_position('left') ax.spines['bottom'].set_position(('data',0)) ax.spines['top'].set_position(('data',0)) # 添加legend图例 plt.plot(x,y1,label='2*x+1') plt.plot(x,y2,label='x**2') plt.legend() plt.show()
numpy数组
- numpy用于处理数组,对象称为ndarray
- 可以用array()函数创建一个numpy ndarray对象
arr = np array([1,2,3,4,5])
print(arr)
print(type(arr))
numpy和list的区别:
- 内存大小–numpy数据结构占用的内存空间更小
- 性能–numpy底层是用c写的,比列表更快
- 运算方法–内置优化了代数运算等方法
np.linspace函数
from pylab import *
x = np.linspace(-np.pi,np.pi,256,endpoint = True)
c,s = np.cos(x),np.sin(x)
- linspace函数:指定的间隔内返回均匀间隔的数字
- endpoint:bool类型,如果为true则包含stop,否则不包含stop(结尾点)
参数:
- start:序列的起始点
- end:序列的终止点,如果endpoint设置为true,则包含最后一个点(全闭区间)
- num:生成的样本数,默认是50,必须为非负
网上的大部分解释
- pyplot:方便快速绘图,matplotlib通过pyplot模块提供了与一套和MATLAB类似的绘图API,将众多绘图对象构成的复杂结构隐藏在这套API内部
2, pylab:matplotlib还提供了一个名为pylab的模块,其中包含许多Numpy和pyplot模块中常用的函数
作用:
- pylab = pyplot+大部分numpy
- 也就是说pylab只是提供了一个方便的导入常用包的接口
和matlab的区别:
- 在matlab中,画了一条线以后,如果想接着画另一条线,则需要hold on函数
- python中直接画即可