艺术画笔matplotlib.artist.Artist类
matplotlib的原理或者说基础逻辑是,用Artist对象在画布(canvas)上绘制(Render)图形,所以matplotlib有三个层次的API:matplotlib.backend_bases.FigureCanvas 代表了绘图区,所有的图像都是在绘图区完成的
matplotlib.backend_bases.Renderer 代表了渲染器,可以近似理解为画笔,控制如何在 FigureCanvas 上画图。
matplotlib.artist.Artist 代表了具体的图表组件,即调用了Renderer的接口在Canvas上作图。
前两者处理程序和计算机的底层交互的事项,第三项Artist就是具体的调用接口来做出我们想要的图,比如图形、文本、线条的设定。
Artist有两种类型:primitives 和containers。
primitive是基本要素,它包含一些我们要在绘图区作图用到的标准图形对象,如曲线Line2D,文字text,矩形Rectangle,图像image等。
container是容器,即用来装基本要素的地方,包括图形figure、坐标系Axes和坐标轴Axis。
常见图形绘制
1. 折线图主要用plot()函数绘制
常用的参数有:
xdata:需要绘制的line中点的在x轴上的取值,若忽略,则默认为range(1,len(ydata)+1)
ydata:需要绘制的line中点的在y轴上的取值
linewidth:线条的宽度
linestyle:线型
color:线条的颜色
# 1. 折线图
# plt.plot(x)
# plt.show()
fig, ax = plt.subplots()
x = [1, 2, 3]
ax.plot(x, c='red', lw=2, linestyle='dashed')
plt.show()
2. 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,是否为堆积状图
# 2. hist()函数绘制直方图
# 生成数据集x
x = np.random.randint(0, 100, 100) # 生成100个整数在[0,100)内,如果是random.randint(0,100)则生成的数在[0,100]内,不过不能指定次数
# 生成统计区间
bins = np.arange(0, 101, 5)
# 开始画图
plt.hist(x, bins, color='red', alpha=0.8) # alpha是透明度
plt.xlabel('数值')
plt.ylabel('数值出现的次数')
plt.title('直方图')
plt.show()
3. bar-柱状图
left:x轴的位置序列,一般采用range函数产生一个序列,但是有时候可以是字符串
height:y轴的数值序列,也就是柱形图的高度,一般就是我们需要展示的数据;
alpha:透明度,值越小越透明
width:为柱形图的宽度,一般这是为0.8即可;
color或facecolor:柱形图填充的颜色;
edgecolor:图形边缘颜色
label:解释每个图像代表的含义,这个参数是为legend()函数做铺垫的,表示该次bar的标签
y = range(1, 17)
plt.bar(np.arange(16), y, alpha=0.5, color='red', edgecolor='blue', lw=2, width=0.5, label='bar')
plt.show()
4. fill-填充线图(多边形图)
# 4. 多边形图
fig, ax = plt.subplots(1, 2)
x = np.linspace(0, 5*np.pi, 100)
y = np.sin(x)
ax1 = ax[0]
ax2 = ax[1]
ax1.fill(x, y, c='g', alpha=0.5)
ax2.fill([0, 1, 3, 2])
plt.show()
5. pie-饼状图
x:契型的形状大小,一维数组列表也可以。
explode:如果不是等于None,则是一个len(x)数组,它指定用于偏移每个楔形块的半径的分数。
labels:用于指定每个契型块的标记,取值是列表或为None。
colors:饼图循环使用的颜色序列。如果取值为None,将使用当前活动循环中的颜色。
startangle:饼状图开始的绘制的角度。
# 5. pie-饼状图
labels = ['bicycle', 'car', 'airplane', 'ship', 'walk']
size = [15, 50, 5, 5, 20]
explode = [0, 0.1, 0, 0, 0]
plt.pie(size, labels=labels, autopct='%1.1f%%', explode=explode)
plt.show()
6. scatter绘制散点图
x:数据点x轴的位置
y:数据点y轴的位置
s:尺寸大小
c:可以是单个颜色格式的字符串,也可以是一系列颜色
marker: 标记的类型
# 6. 散点图
x = [0, 2, 4, 6, 8, 10]
y = [10]*len(x)
s = [20*2**n for n in range(len(x))]
plt.scatter(x,y,s=s)
plt.show()
7. inshow()来根据数组绘制图片
grid = np.random.rand(4, 4)
# plt.imshow(grid)
# plt.show()
methods = [None, 'none', 'nearest', 'bilinear', 'bicubic', 'spline16',
'spline36', 'hanning', 'hamming', 'hermite', 'kaiser', 'quadric',
'catrom', 'gaussian', 'bessel', 'mitchell', 'sinc', 'lanczos']
fig, axs = plt.subplots(nrows=3, ncols=6, figsize=(9, 6), subplot_kw={'xticks': [], 'yticks': []}) # subplot_kw来设置刻度
for ax, method in zip(axs.flat, methods):
ax.imshow(grid, interpolation=method)
ax.set_title(str(method)) # 加str是为了是第一个None显示出来
plt.show()
对象容器
主要有Figure,Axes,Axis,Tick四种容器
1. Figure容器
Figure包含了图表中的所有元素,一张图表的背景就是在Figure.patch中的一个矩形Rectangle,当我们向图表添加Figure.add_subplot()或者Figure.add_axes()元素时,这些都会被添加到Figure.axes列表中。
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax1 = fig.add_subplot(211) # 作一幅2*1的图,选择第1个子图,这里只显示你选择的那个子图
ax2 = fig.add_axes([0.3, 0.2, 0.7, 0.3]) # 位置参数,四个数分别代表了(left,bottom,width,height)
# fig, ax = plt.subplots() # 里面没有参数,则只有一个子图,如果有参数,则返回多个子图
# fg, axes = plt.subplots(2, 2)
# axes[0, 0].plot([1, 2, 3])
ax1.grid(True) # 设置网格
print(fig.axes)
plt.show()
2. Axes容器
和Figure容器类似,Axes包含了一个patch属性,对于笛卡尔坐标系而言,它是一个Rectangle;对于极坐标而言,它是一个Circle。这个patch属性决定了绘图区域的形状、背景和边框。Axes有许多方法用于绘图,如.plot()、.text()、.hist()、.imshow()等方法用于创建大多数常见的primitive(如上面说的那几种)。Subplot就是一个特殊的Axes。
fig, ax = plt.subplots(1, 2)
ax[0].patch.set_facecolor('green')
ax[1].patch.set_facecolor('red')
plt.show()
3. Axis容器
matplotlib.axis.Axis实例处理tick line、grid line、tick label以及axis label的绘制,它包括坐标轴上的刻度线、刻度label、坐标网格、坐标轴标题。通常你可以独立的配置y轴的左边刻度以及右边的刻度,也可以独立地配置x轴的上边刻度以及下边的刻度。
# 3. Axis容器
# axis = ax.xaxis # axis为X轴对象
# axis.get_ticklocs() # 获取刻度线位置
# axis.get_ticklabels() # 获取刻度label列表(一个Text实例的列表)。 可以通过minor=True|False关键字参数控制输出minor还是major的tick label。
# axis.get_ticklines() # 获取刻度线列表(一个Line2D实例的列表)。 可以通过minor=True|False关键字参数控制输出minor还是major的tick line。
# axis.get_data_interval()# 获取轴刻度间隔
# axis.get_view_interval()# 获取轴视角(位置)的间隔
fig = plt.figure() # 创建一个新图表
rect = fig.patch # 矩形实例并将其设为黄色
rect.set_facecolor('lightgoldenrodyellow')
ax1 = fig.add_axes([0.1, 0.3, 0.4, 0.4]) # 创一个axes对象,从(0.1,0.3)的位置开始,宽和高都为0.4,
rect = ax1.patch # ax1的矩形设为灰色
rect.set_facecolor('lightslategray')
for label in ax1.xaxis.get_ticklabels():
# 调用x轴刻度标签实例,是一个text实例
label.set_color('red') # 颜色
label.set_rotation(45) # 旋转角度
label.set_fontsize(16) # 字体大小
for line in ax1.yaxis.get_ticklines():
# 调用y轴刻度线条实例, 是一个Line2D实例
line.set_color('red') # 颜色
line.set_markersize(18) # marker大小
line.set_markeredgewidth(3) # marker粗细
plt.show()
4. Tick容器
# 4. Tick容器
fig, ax = plt.subplots()
ax.plot(100*np.random.rand(20))
# 设置ticker的显示格式
formatter = matplotlib.ticker.FormatStrFormatter('$%1.2f')
ax.yaxis.set_major_formatter(formatter)
# 设置ticker的参数,右侧为主轴,颜色为绿色
ax.yaxis.set_tick_params(which='major', labelcolor='green',
labelleft=False, labelright=True) # which是选择对主或者副坐标轴进行操作
plt.show()