参考说明:
1.matplotlib官方教程 2.AI算法工程师手册 3.dts手册
先体验一下简单的绘图:
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots()
ax.plot([1, 2, 3, 4], [1, 4, 2, 3])
plt.plot([1, 2, 3, 4], [1, 4, 2, 3])
Figure的组成:
Figure:顶层级,用来容纳所有绘图元素 Axes:matplotlib宇宙的核心,容纳了大量元素用来构造一幅幅子图,一个figure可以由一个或多个子图组成 Axis:axes的下属层级,用于处理所有和坐标轴,网格有关的元素 Tick:axis的下属层级,用来处理所有和刻度有关的元素
两种绘图接口:
显式创建figure和axes,在上面调用绘图方法,也被称为OO模式(object-oriented style)(比如法一) 依赖pyplot自动创建figure和axes,并绘图(比如法二)
matplotlib的三层api:
类比人的画图过程,matplotlib有三个层次的API: matplotlib.backend_bases.FigureCanvas 代表了绘图区,所有的图像都是在绘图区完成的(准备一块画布或画纸) matplotlib.backend_bases.Renderer 代表了渲染器,可以近似理解为画笔,控制如何在 FigureCanvas 上画图(准备好颜料、画笔等制图工具) matplotlib.artist.Artist 代表了具体的图表组件,即调用了Renderer的接口在Canvas上作图。
Artist的类型:
primitive是基本要素,它包含一些我们要在绘图区作图用到的标准图形对象,如曲线Line2D,文字text,矩形Rectangle,图像image等。 container是容器,即用来装基本要素的地方,包括图形figure、坐标系Axes和坐标轴Axis。
primitives:
先区分一下primitives和container primitives是基本要素,它包含一些我们要在绘图区作图用到的标准图形对象,如曲线Line2D,文本text,矩形Rectangle,图像image等。 container是容器,即用来装基本要素的地方,包括图形figure、坐标系Axes和坐标轴Axis。
2DLines:
曲线的绘制,主要是通过类 matplotlib.lines.Line2D 来完成的,它的基类: matplotlib.artist.Artist
其中常用的的参数有:
xdata:需要绘制的line中点的在x轴上的取值,若忽略,则默认为range(1,len(ydata)+1) ydata:需要绘制的line中点的在y轴上的取值 linewidth:线条的宽度 linestyle:线型 color:线条的颜色 marker:点的标记,详细可参考markers API markersize:标记的size
举个列子:
patches
matplotlib.patches.Patch类是二维图形类。它的基类是matplotlib.artist.Artist(这里只说常用的)
Rectangle-矩形
Rectangle矩形类在官网中的定义是: 通过锚点xy及其宽度和高度生成。 Rectangle本身的主要比较简单,即xy控制锚点,width和height分别控制宽和高。
1.hist-直方图(参数+代码)
参数: x: 数据集,最终的直方图将对数据集进行统计 bins: 统计的区间分布 range: tuple, 显示的区间,range在没有给出bins时生效 density: bool,默认为false,显示的是频数统计结果,为True则显示频率统计结果,这里需要注意,频率统计结果=区间数目/(总数*区间宽度),和normed效果一致,官方推荐使用density histtype: 可选{‘bar’, ‘barstacked’, ‘step’, ‘stepfilled’}之一,默认为bar,推荐使用默认配置,step使用的是梯状,stepfilled则会对梯状内部进行填充,效果与bar类似 align: 可选{‘left’, ‘mid’, ‘right’}之一,默认为’mid’,控制柱状图的水平分布,left或者right,会有部分空白区域,推荐使用默认 log: bool,默认False,即y坐标轴是否选择指数刻度 stacked: bool,默认为False,是否为堆积状图 代码:
import matplotlib.pyplot as plt
import numpy as np
x=np.random.randint(0,100,100)
bins=np.arange(0,101,10)
plt.hist(x,bins,color='fuchsia',alpha=0.5)
plt.xlabel('scores')
plt.ylabel('count')
plt.xlim(0,100)
2.bar-柱状图
参数: left:x轴的位置序列,一般采用range函数产生一个序列,但是有时候可以是字符串 height:y轴的数值序列,也就是柱形图的高度,一般就是我们需要展示的数据; alpha:透明度,值越小越透明 width:为柱形图的宽度,一般这是为0.8即可; color或facecolor:柱形图填充的颜色; edgecolor:图形边缘颜色 label:解释每个图像代表的含义,这个参数是为legend()函数做铺垫的,表示该次bar的标签 代码:
import matplotlib as mpl
y = range(1,17)
plt.bar(np.arange(16), y, alpha=0.5, width=0.5, color='yellow', edgecolor='red', label='The First Bar', lw=3)
Wedge-契形
matplotlib.patches.Polygon类是多边形类。其基类是matplotlib.patches.Patch。一个Wedge-契形 是以坐标x,y为中心,半径为r,从θ1扫到θ2(单位是度)。 主要参数: x:契型的形状,一维数组。 explode:如果不是等于None,则是一个len(x)数组,它指定用于偏移每个楔形块的半径的分数。 labels:用于指定每个契型块的标记,取值是列表或为None。 colors:饼图循环使用的颜色序列。如果取值为None,将使用当前活动循环中的颜色。 startangle:饼状图开始的绘制的角度。 饼状图代码:
import matplotlib.pyplot as plt
labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
sizes = [15, 30, 45, 10]
explode = (0, 0.8, 0, 0)
fig1, ax1 = plt.subplots()
ax1.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%', shadow=True, startangle=90)
ax1.axis('equal')
plt.show()
errorbar绘制误差折线图:
pyplot里有个专门绘制误差线的功能,通过errorbar类实现,这个可以很好的和机器学习相结合
其中最主要的参数是前几个:
x:需要绘制的line中点的在x轴上的取值 y:需要绘制的line中点的在y轴上的取值 yerr:指定y轴水平的误差 xerr:指定x轴水平的误差 ecolor:指定error bar的颜色 elinewidth:指定error bar的线条宽度
比如sin函数每次误差加0.02
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
x = np.arange(0.0, 1.0, 0.01)
y = np.sin(2*np.pi*t)
yerr = np.arange(0.0, 2.0, 0.02)
plt.errorbar(x, y , yerr=yerr, label='both limits (default)')
matplotlib标准用法:
1.创建一个Figure实例 2.使用Figure实例创建一个或者多个Axes或Subplot实例 3.使用Axes实例的辅助方法来创建primitive或者container 以sin函数为例子:
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(2, 1, 1)
t = np.arange(0.0, 1.0, 0.01)
s = np.sin(2*np.pi*t)
line, = ax.plot(t, s, color='blue', lw=2)
子图
法一:plt.subplots (均匀)
简介:
plt.subplots 的返回元素分别是画布和子图构成的列表,figsize 参数可以指定整个画布的大小,sharex 和 sharey 分别表示是否共享横轴和纵轴刻度,tight_layout 函数可以调整子图的相对大小使字符不会重叠
简单实现:
fig, axs = plt.subplots(2, 5, figsize=(10, 4), sharex=True, sharey=True)
fig.suptitle('样例1', size=20)
for i in range(2):
for j in range(5):
axs[i][j].scatter(np.random.randn(10), np.random.randn(10))
axs[i][j].set_title('第%d行,第%d列'%(i+1,j+1))
axs[i][j].set_xlim(-5,5)
axs[i][j].set_ylim(-5,5)
if i==1: axs[i][j].set_xlabel('横坐标')
if j==0: axs[i][j].set_ylabel('纵坐标')
fig.tight_layout()
法二:GridSpec(非均匀)
简介:
所谓非均匀包含两层含义,第一是指图的比例大小不同但没有跨行或跨列,第二是指图为跨列或跨行状态。利用 add_gridspec 可以指定相对宽度比例 width_ratios 和相对高度比例参数 height_ratios。
matplotlib的绘图样式(style)
内置风格:
查看方法:
print(plt.style.available)
比如我想使用内置的ggplot风格,代码如下:
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
plt.style.use('ggplot')
plt.plot([1,2,3,4],[2,3,4,5])
自定义风格: 在任意路径下创建一个后缀名为mplstyle的样式清单,编辑文件添加以下样式内容
axes.titlesize : XX
axes.labelsize : XX
lines.linewidth : XX
lines.markersize : XX
xtick.labelsize : XX
ytick.labelsize : XX
XX为我们要定义的数值 plt.style.use(‘l路径名’)即可调用
|