申明:本人博客为自己学习记录,本文学习内容主要来源以下两篇博客。
https://www.jianshu.com/p/78ba36dddad8
https://blog.csdn.net/lm_is_dc/article/details/81191207
https://www.jianshu.com/p/56a5c21ff9db
https://blog.csdn.net/qq_33221533/article/details/81431264
1、基础知识
1.1 库
主要用到的两个库:
- numpy
- matplotlib.pyplot
1.2 图形组成标签
图片来源:https://www.jianshu.com/p/78ba36dddad8
几个重要的标签:
- Figure(图像窗口):Figure 是包裹 Axes、tiles、legends 等组件的最外层窗口。它其实是一个 Windows 应用窗口。
- Axes(轴域/子图):Axes 是带有数据的图像区域。一个 Figure 中可以有多个子图。
- Axis(轴):X Axis和Y Axis。
1.3 导入库
import numpy as npimport matplotlib.pyplot as plt
2、绘图
2.1 包含单条曲线的图
- 正比例函数
from matplotlib import pyplot as plt
x=[1,2,3,4,5]
y=[2,4,6,8,10]
plt.figure() # 定义一个图像窗口
plt.plot(x,y) # 绘制曲线
plt.show() #显示图像
结果:
- 指数函数
import numpy as np
from matplotlib import pyplot as plt
x1=np.arange(-np.pi,np.pi,0.01)
# y1=np.power(x1,2) #指数函数
y1=x1**2 #指数函数(同上)
plt.figure() # 定义一个图像窗口
plt.plot(x1,y1) # 绘制曲线
plt.show() #显示图像
结果:
2.2 包含多条曲线的图
-
连续调用多次plot函数
import numpy as np
from matplotlib import pyplot as plt
x=[1,2,3,4,5]
y=[2,4,6,8,10]
x1=np.arange(-np.pi,np.pi,0.01)
# y1=np.power(x1,2) #指数函数
y1=x1**2 #指数函数(同上)
plt.figure() # 定义一个图像窗口
plt.plot(x,y) # 绘制曲线y
plt.plot(x1,y1) # 绘制曲线y1
plt.show() #显示图像
结果:
- 也可以在一个plot函数中传入多对X,Y值,在一个图中绘制多个曲线
import numpy as np
from matplotlib import pyplot as plt
x=[1,2,3,4,5]
y=[2,4,6,8,10]
x1=np.arange(-np.pi,np.pi,0.01)
# y1=np.power(x1,2) #指数函数
y1=x1**2 #指数函数(同上)
plt.figure() # 定义一个图像窗口
plt.plot(x,y,x1,y1) # 绘制曲线y,y1, 注意顺序
#plt.plot(x1,y1) # 绘制曲线y1
plt.show() #显示图像
2.3 将多个曲线图绘制在一个Figure(图像窗口)区域中:对象形式创建表图
a=plt.subplot(row,col,loc) 创建曲线图
a.plot(x,y) 绘制曲线图
实例:
import numpy as np
from matplotlib import pyplot as plt
x=[1,2,3,4,5]
y=[2,4,6,8,10]
x1=np.arange(-np.pi,np.pi,0.01)
# y1=np.power(x1,2) #指数函数
y1=x1**2 #指数函数(同上)
x2=np.linspace(-np.pi,np.pi,5) 、
y2=np.sin(x)
plt.figure() # 定义一个图像窗口
a1=plt.subplot(2,2,1) #创建曲线图
a1.plot(x,y) #绘制曲线图
a2=plt.subplot(2,2,2) #创建曲线图
a2.plot(x1,y1) # 绘制曲线
a3=plt.subplot(223) #创建曲线图 可以省略逗号
a3.plot(x2,y2) # 绘制曲线
plt.show() #显示图像
结果:
2.4 网格线gride
参数:
- axis
- color:支持十六进制颜色
- linestyle: – -. :
- alpha :
设置网格:
- 直接设置:plt.grid()
- 使用对象设置:a=plt.subplot(221) a.grid()
import numpy as np
from matplotlib import pyplot as plt
x=np.linspace(-np.pi,np.pi,100)
y=np.sin(x)
a1=plt.subplot(221)
a1.grid()
a1.plot(x,y)
a2=plt.subplot(222)
a2.grid()
a2.plot(x,y)
a3=plt.subplot(223)
a3.grid()
a3.plot(x,y)
a4=plt.subplot(224)
a4.grid()
a4.plot(x,y)
plt.show() #显示图像
结果:
2.5 坐标轴界限
- 修改x,y轴刻度值
plt.axis([xmin,xmax,ymin,ymax])
例如:plt.axis([-4,4,-2,2])
- 关闭坐标轴
plt.axis('off')
- 设置画布比例
plt.figure(figsize=(a,b))
参数:
- a:x刻度比例;
- b:y刻度比例
- (2:1)表示x刻度显示为y刻度显示的2倍 。
- xlim方法和ylim方法
可以通过plt的xlim(xmin,xmax),ylim方法设置坐标轴范围;
plt.xlim(-6,6)
plt.ylim(-2,2)
- 通过对象的方式设置x,y轴的刻度值范围 ax.set_xlim(a,b)
ax1=plt.subplot(111) ax1.set_xlim(-4,4) ax1.set_ylim(-2,2)
2.6 坐标轴标签
- color 标签颜色
- fontsize 字体大小
- rotation 旋转角度
- plt的xlabel方法和ylabel方法
import numpy as np
from matplotlib import pyplot as plt
x=np.linspace(-np.pi,np.pi,100)
y=np.cos(x)
plt.title('tittle')
plt.ylabel('yyy',fontsize=16,rotation=90,color='r')
plt.xlabel('xxx',fontsize=16)
plt.plot(x,y)
plt.show()
结果:
- 对象方法set_xlabel/ylabel()
2.6.1 显示坐标轴中文标签
设置参数:fontproperties
import numpy as np
from matplotlib import pyplot as plt
x=np.linspace(-np.pi,np.pi,100)
y=np.cos(x)
ax=plt.subplot(111)
ax.set_xlabel('x轴',fontproperties='KaiTi',fontsize=18) #对象方法
ax.set_ylabel('y轴',fontproperties='KaiTi',fontsize=18)
ax.set_title('标题',fontproperties='KaiTi',fontsize=16)
ax.plot(x,y)
plt.show()
2.7、 标题
- plt.title()方法
- ax.set_title()方法
2.8、图例
2.8.1 legend方法
两种传参方法:
- - 分别在plot函数中增加label参数,再调用plt.legend()方法显示
x=np.linspace(0,10,30)
y=x ** 2
plt.plot(x,y,label='aaa') #参数传递方法1,绘制曲线
plt.plot(x+1,y-1,label='bbb')
plt.legend()
- - 直接在legend方法中传入字符串列表
import numpy as np
from matplotlib import pyplot as plt
x=np.linspace(0,10,30)
y=x ** 2
plt.plot(x,y)
plt.plot(x+1,y-1)
plt.legend(['a','b'])
plt.show()
2.8.2 legend的参数
-
loc参数 : 用于设置图例标签的位置,一般在legend函数内
-
matplotlib已经预定义好几种数字表示的位置,见下表:
例如:plt.legend(['aaa','bbb'],loc=5)
loc参数可以是2元素的元组,表示图例左下角的坐标:
- [0,0] 左下
- [0,1] 左上
- [1,0] 右下
-
[1,1] 右上
-
ncol参数 : 控制图例中有几列,在legend中设置ncol。
例如:plt.legend(['aaa','bbb'],loc=[1,1],ncol=2)
(ncol:两行)
2.9、 保存图片
使用figure对象的savefig函数来保存图片:
- 使用plt进行绘图。。。。。。。然后保存图片
- 然后保存图片 plt.savefig(filename='./111.jpg',dpi=500)
参数说明:
- 图像格式由文件扩展名推断得出,例如,.pdf推断出PDF,.png推断出PNG (“png”、“pdf”、“svg”、“ps”、“eps”……)
- dpi : 图像分辨率(每英寸点数),默认为100 ;
- facecolor :图像的背景色,默认为“w”(白色);
读取图片:
img=plt.imread('./111.jpg')
plt.imshow(img)
plt.show()
为什么没有线了!!!
3、设置plot的风格和样式
plot语句中支持除x,y 两个参数,其他参数以字符串形式存在,来控制颜色、线型、点型等要素。
3.1 颜色
- 参数:c或者color;
- plot(x,y,c = " r ") #颜色别名
- plot(x,y,color = "r")
- plot(x,y,color = "red") #合法的HTML颜色名
- plot(x,y,color = "#eeefff") #十六进制字符串
- plot(x,y,color = (0.3, 0.3, 0.4)) #归一化到[0, 1]的RGB元组
3.2 透明度
- alpha
plt.plot(x,y,c='r',alpha=0.4)
3.3 背景色
- 设置坐标系的前景色
plt.set_facecolor('green')
- 设置坐标系的背景色
plt.figure().set_facecolor('yellow')
3.4 线型
- 参数:linestyle或者ls;
3.5 线宽
- 参数:linewidth或者lw;
plt.plot(x,y,ls='steps',lw=5)
3.6 点型
- marker 设置点形
- markersize 设置点形大小
- markerfacecolor
- markeredgecolor
plt.plot(x,y,marker='d',lw=3,markerfacecolor='yellow',markeredgecolor='red',markersize=40) #小菱形,前背景色,大小。
3.7 多参数连用
- 只可以设置颜色、点型、线型,可以把几种参数写在一个字符串内进行设置 ‘r-.o’
3.8 在一条语句中为多个曲线进行设置
3.8.1 多个曲线同一设置
plt.plot(x,y,x+1,y-1,y+3,y-2,c='r')
3.8.1 多个曲线不同设置
- plt.plot(x1, y1, fmt1, x2, y2, fmt2, …)
plt.plot(x,y,'or-.',x+1,y-1,'yd',y+3,y-2,'g--')
3.9 X、Y轴坐标刻度
3.9.1 对x,y轴的刻度做映射
- plt.xticks()和plt.yticks()方法:
-
-
- 需指定刻度值和刻度名称 plt.xticks([刻度列表],[名称列表])
- 支持fontsize、rotation、color等参数设置
- 仅对x和y轴的刻度做映射而并非修改
-
3.9.2 使用面向对象的方法设置刻度方法
- 用来修改x和y轴的刻度值,而不是映射 使用画板的如下方法设置刻度axes = plt.subplot();
-
- set_xticks、set_yticks 设置刻度值
- set_xticklabels、set_yticklabels 设置刻度名称
-
4、 2D图形
4.1 直方图(hist)
- 是一个特殊的柱状图,又叫做密度图;
- 直方图的参数只有一个x;
plt.hist()的参数:
- bins : 可以是一个bin数量的整数值,也可以是表示bin的一个序列。默认值为10;
- normed : 如果值为True,直方图的值将进行归一化处理,形成概率密度,默认值为False;
- color : 指定直方图的颜色。可以是单一颜色值或颜色的序列。如果指定了多个数据集合,例如DataFrame对象,颜色序列将会设置为相同的顺序。如果未指定,将会使用一个默认的线条颜色;
- orientation : 通过设置orientation为horizontal创建水平直方图。默认值为vertical. horizontal 水平的
from matplotlib import pyplot as plt
x=[1,2,2,3,4,4,5]
plt.hist(x,color='g',orientation='horizontal')
plt.show()
4.2 条形图 (bar,barh)
- 垂直条形图:bar()
- 水平条形图:barh()
参数:
- 第一个参数是索引。
- 第二个参数是数据值。
- 第三个参数是条形的宽度.:
-
-
- width 纵向设置条形宽度
- height 横向设置条形高度
-
from matplotlib import pyplot as plt
x=[1,2,3,4,5]
y=[1,2,3,4,5]
plt.barh(x,y,0.3,color="g")
plt.plot(x,y,marker='o',markersize='14')
plt.show()
4.3 饼图(pie)
- 饼图也只有一个参数x.
- 饼图适合展示各部分占总体的比例,条形图适合比较各部分的大小.
4.3.1 普通各部分占满饼图
from matplotlib import pyplot as plt
arr=[11,22,31,15]
plt.pie(arr)
plt.show()
4.3.2 普通未占满饼图:小数/比例
属性设置:
- labels 设置每一块的标签;
- labeldistance 设置标签距离圆心的距离(比例值)
- autopct 设置比例值小数保留位(%.3f%%);
- %m.nf m 占位 n 小数点后保留几位 f 是以float格式输出
- pctdistance 设置比例值文字距离圆心的距离
- explode 设置每一块顶点距圆心的长度(比例值,列表);
- colors 设置每一块的颜色(列表);
- shadow 为布尔值,设置是否绘制阴影
- startangle 设置饼图起始角度
import numpy as np
from matplotlib import pyplot as plt
arr=[11,22,31,15]
plt.pie(arr,labels=['aaa','bbb','ccc','ddd'], #标签,以列表形式列出
labeldistance=1.2, #标签距离圆心的距离(比例值)
autopct='%.6f%%', #m 占位 n 小数点后保留几位 f 是以float格式输出
pctdistance=0.5, #比例值文字距离圆心的距离
explode=[0.2,0.3,0.2,0.4], #每一块顶点距圆心的长度
colors=['blue','yellow','orange','green'], #设置每一块的颜色
shadow=True) #是否绘制阴影
plt.show()
问题:怎么对lables中的字体进行设置????
4.4 散点图:因变量随自变量而变化的大致趋势(scatter)
- 散点图需要两个参数x,y,但此时x不是表示x轴的刻度,而是每个点的横坐标!
import numpy as np
from matplotlib import pyplot as plt
x=np.random.randn(300)
y=np.random.randn(300)
plt.scatter(x,y,marker='d',c=np.random.rand(300,3))
plt.show()
5、 图形内的文字、注释、箭头
控制文字属性的方法:
所有的方法会返回一个matplotlib.text.Text对象。
5.1 图形内的文字
- plt.text()
- plt.figtext()
import numpy as np
from matplotlib import pyplot as plt
x=[1,2,3]
y=[1,2,3]
plt.bar(x,y,width=0.2)
plt.plot(x,y,marker='d',color='r')
plt.text(0.6,1,s='NO.3',fontsize=15)
plt.figtext(0.4,0.8,s='RANGE',fontsize=25)
plt.show()
5.2 注释(annotate)
- annotate() xy参数设置箭头指示的位置,
- xytext参数设置注释文字的位置
- arrowprops参数以字典的形式设置箭头的样式
- width参数设置箭头长方形部分的宽度,
- headlength参数设置箭头尖端的长度,
- headwidth参数设置箭头尖端底部的宽度,
- shrink参数设置箭头顶点、尾部与指示点、注释文字的距离(比例值)
5.3 箭头
样式:
``'-'`` None
``'->'`` head_length=0.4,head_width=0.2
``'-['`` widthB=1.0,lengthB=0.2,angleB=None
``'|-|'`` widthA=1.0,widthB=1.0
``'-|>'`` head_length=0.4,head_width=0.2
``'<-'`` head_length=0.4,head_width=0.2
``'<->'`` head_length=0.4,head_width=0.2
``'<|-'`` head_length=0.4,head_width=0.2
``'<|-|>'`` head_length=0.4,head_width=0.2
``'fancy'`` head_length=0.4,head_width=0.4,tail_width=0.4
``'simple'`` head_length=0.5,head_width=0.5,tail_width=0.2
``'wedge'`` tail_width=0.3,shrink_factor=0.5
import numpy as np
from matplotlib import pyplot as plt
y = [13, 11, 13, 12, 13, 10, 30, 12, 11, 13, 12, 12, 12, 11, 12]
plt.plot(y)
# 为了让注释不会超出图的范围,需要调整y坐标轴的界限
plt.ylim(ymax=35)
plt.annotate('this spot must really\nmean something', xy=(6, 30), # xy参数设置箭头指示的位置,
xytext=(8, 31.5), #xytext参数设置注释文字的位置
arrowprops=dict(width=8, # arrowprops参数以字典的形式设置箭头的样式,width参数设置箭头长方形部分的宽度
headlength=8, # headlength参数设置箭头尖端的长度,
headwidth=15, # headwidth参数设置箭头尖端底部的宽度,
facecolor='black',
shrink=0.1)) # shrink参数设置箭头顶点、尾部与指示点、注释文字的距离(比例值)
plt.show()
问题:
在放置文字及箭头的时候,如何精确获取位置信息?
6、3D图
导入包:from mpl_toolkits.mplot3d.axes3d import Axes3D
6.1 曲面图
6.2 玫瑰图/极坐标条形图
总结:
1. 中文支持不好的问题:
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号