matplotlib的原理或者说基础逻辑是,用Artist对象在画布(canvas)上绘制(Render)图形。
而Artist对象又分为两类:primitives
和containers
。
primitive
是基本要素,它包含一些我们要在绘图区作图用到的标准图形对象,如曲线Line2D,文字text,矩形Rectangle,图像image等。
container
是容器,即用来装基本要素的地方,包括图形figure、坐标系Axes和坐标轴Axis。
所以说matplotlib的使用流程先要创建一个figure对象,可以理解为画布,然后在画布上画上axes(坐标系),坐标系是一种容器在容器中,可以添加primitive(要素)。
值得一提的是,Axes是一种容器,它可能是matplotlib API中最重要的类,并且我们大多数时间都花在和它打交道上。
由于matplotlib绘画的逻辑是在figure,axes等容器上添加primitives。
atplotlib.figure.Figure
是Artist
最顶层的container
-对象容器,它包含了图表中的所有元素。一张图表的背景就是在Figure.patch
的一个矩形Rectangle
。
当我们向图表添加Figure.add_subplot()
或者Figure.add_axes()
元素时,这些都会被添加到Figure.axes
列表中。
fig=plt.figure() #创建一个figure容器
sub=fig.add_subplot(2,1,1)#创建了一个两行一列(即可以有两个subplot)的绘图区,并同时在第一个位置创建了一个subplot
x=np.arange(0.0, 1.0, 0.01)
s = np.sin(2*np.pi*x)#创建数据
line = sub.plot(x, s, color='blue', lw=2)
基本元素 - primitives
像曲线-Line2D,矩形-Rectangle,图像-image 都是比较常见的基本元素
在matplotlib中曲线的绘制,主要是通过类 matplotlib.lines.Line2D
来完成的。
它的构造函数为:
class matplotlib.lines.Line2D(xdata, ydata, linewidth=None, linestyle=None, color=None, marker=None, markersize=None, markeredgewidth=None, markeredgecolor=None, markerfacecolor=None, markerfacecoloralt='none', fillstyle=None, antialiased=None, dash_capstyle=None, solid_capstyle=None, dash_joinstyle=None, solid_joinstyle=None, pickradius=5, drawstyle=None, markevery=None, **kwargs)
常用的有
xdata:需要绘制的line中点的在x轴上的取值,若忽略,则默认为range(1,len(ydata)+1)
ydata:需要绘制的line中点的在y轴上的取值
linewidth:线条的宽度
linestyle:线型
color:线条的颜色
marker:点的标记,详细可参考markers API
markersize:标记的size
可以通过以下三种方式创建线的属性
1.直接在plot()函数中设置
import matplotlib.pyplot as plt
x = np.arange(0.0, 1.0, 0.01)
y = np.sin(2*np.pi*t)
plt.plot(x,y, lw=2,color='red'); # 设置线的粗细参数为10,颜色为red
2.通过获得线对象,对线对象进行设置
x = np.arange(0.0, 1.0, 0.01)
y = np.sin(2*np.pi*t)
line ,= plt.plot(x, y, '--')# 虚线
line.set_antialiased(False) # 关闭抗锯齿功能
这里 line后面加逗号是为了把plot返回的元组拆包,获取第一个元素
3.获得线属性,使用setp()函数设置
x = np.arange(0.0, 1.0, 0.01)
y = np.sin(2*np.pi*t)
lines = plt.plot(x, y)
plt.setp(lines, color='r', linewidth=10);
以上是运用plot的方法绘制直线,还有另外一种方法,lin2D对象绘制。
import matplotlib.pyplot as plt
from matplotlib.lines import Line2D
fig = plt.figure() #创建figure
ax = fig.add_subplot(111)#创建一行一列的绘图区,并在第一个位置创建了一个subplot
line = Line2D(x, y)
ax.add_line(line)
ax.set_xlim(min(x), max(x)) #x坐标轴从min(x),到max(x)
ax.set_ylim(min(y), max(y))
plt.show()
其中 fig.add_subplot(111) 是创建一行一列的绘图区,并在第一个位置创建了一个subplot。
pyplot里有个专门绘制误差线的功能,通过errorbar
类实现,它的构造函数:
matplotlib.pyplot.errorbar(x, y, yerr=None, xerr=None, fmt='', ecolor=None, elinewidth=None, capsize=None, barsabove=False, lolims=False, uplims=False, xlolims=False, xuplims=False, errorevery=1, capthick=None, *, data=None, **kwargs)
其中最主要的参数是前几个:
x:需要绘制的line中点的在x轴上的取值
y:需要绘制的line中点的在y轴上的取值
yerr:指定y轴水平的误差
xerr:指定x轴水平的误差
fmt:指定折线图中某个点的颜色,形状,线条风格,例如‘co--’
ecolor:指定error bar的颜色
elinewidth:指定error bar的线条宽度
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
x = np.arange(10)
y = 2.5 * np.sin(x / 20 * np.pi)
yerr = np.linspace(0.05, 0.2, 10)
plt.errorbar(x, y + 3, yerr=yerr, label='both limits (default)');
y轴水平误差为yerr。
matplotlib.patches.Patch类是二维图形类。它的基类是matplotlib.artist.Artist,它的构造函数:
详细清单见 matplotlib.patches API
Patch(edgecolor=None, facecolor=None, color=None, linewidth=None, linestyle=None, antialiased=None, hatch=None, fill=True, capstyle=None, joinstyle=None, **kwargs)
Rectangle
矩形类在官网中的定义是: 通过锚点xy及其宽度和高度生成。 Rectangle本身的主要比较简单,即xy控制锚点,width和height分别控制宽和高。它的构造函数:
class matplotlib.patches.Rectangle(xy, width, height, angle=0.0, **kwargs)
在实际中最常见的矩形图是hist直方图
和bar条形图
(1).hist直方图
matplotlib.pyplot.hist(x,bins=None,range=None, density=None, bottom=None, histtype='bar', align='mid', log=False, color=None, label=None, stacked=False, normed=None)
下面是一些常用的参数:
import matplotlib.pyplot as plt
import numpy as np
x=np.random.randint(0,100,10) #生成[0-100)之间的100个数据,即 数据集
bins=np.arange(0,101,10) #设置连续的边界值,即直方图的分布区间[0,10),[10,20)...
plt.hist(x,bins,color='pink',alpha=0.5)#alpha设置透明度,0为完全透明
plt.xlabel('scores')
plt.ylabel('count')
plt.xlim(0,100)#设置x轴分布范围 plt.show()
print(bins)
直方图的纵坐标为落入到数据集落入到区间(bins)的数量
(2)bar 柱状图
matplotlib.pyplot.bar(left, height, alpha=1, width=0.8, color=, edgecolor=, label=, lw=3)
下面是一些常用的参数:
import matplotlib.pyplot as plt
y = range(1,17)
plt.bar(np.arange(16), y, alpha=0.8, width=1, color='blue', edgecolor='white', label='The second Bar', lw=4)
构造函数为 class matplotlib.patches.Polygon(xy, closed=True, **kwargs)
其中 xy是一个N×2的numpy array,为多边形的顶点。
closed为True则指定多边形将起点和终点重合从而显式关闭多边形。
matplotlib.patches.Polygon类中常用的是fill类,它是基于xy绘制一个填充的多边形,它的定义:
matplotlib.pyplot.fill(*args, data=None, **kwargs)
参数说明 : 关于x、y和color的序列,其中color是可选的参数,每个多边形都是由其节点的x和y位置列表定义的,后面可以选择一个颜色说明符。您可以通过提供多个x、y、[颜色]组来绘制多个多边形。
# 用fill来绘制图形
import matplotlib.pyplot as plt
x = np.linspace(0, 5 * np.pi, 1000)
y1 = np.sin(x)
y2 = np.sin(2 * x)
plt.fill(x, y2, color = "b", alpha = 0.8);
class matplotlib.patches.Wedge(center, r, theta1, theta2, width=None, **kwargs)
一个Wedge-契形 是以坐标x,y为中心,半径为r,从θ1扫到θ2(单位是度)。
如果宽度给定,则从内半径r -宽度到外半径r画出部分楔形。wedge中比较常见的是绘制饼状图。
matplotlib.pyplot.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=0, radius=1, counterclock=True, wedgeprops=None, textprops=None, center=0, 0, frame=False, rotatelabels=False, *, normalize=None, data=None)
x:契型的形状,一维数组。
explode:如果不是等于None,则是一个len(x)数组,它指定用于偏移每个楔形块的半径的分数。
labels:用于指定每个契型块的标记,取值是列表或为None。
colors:饼图循环使用的颜色序列。如果取值为None,将使用当前活动循环中的颜色。
startangle:饼状图开始的绘制的角度。
如下所示,数据为size,数据偏移量为explode,有阴影,开始绘制角度为0;
import matplotlib.pyplot as plt
labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
sizes = [15, 30, 45, 10]
explode = (0, 0.2,0, 0)
fig1=plt.figure()
ax1=fig1.add_subplot(111)
ax1.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%', shadow=True, startangle=0) #
ax1.axis('equal') # Equal aspect ratio ensures that pie is drawn as a circle.
Axes.scatter(self, x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=, edgecolors=None, *, plotnonfinite=False, data=None, **kwargs)
重要的参数主要有