简介

在matplotlib中,一切看见元素都是Artist,所有对象都是Artist的子类。Artist对象可分位两类:容器类型和简单类型

容器类型:可以包含其他Artist对象的对象。如Figure, Axes等

简单类型:标准的,最基本的绘图原件,不能再包含其他对象。如Line2D, Text, Rectangle等

关于画图,从操作步骤看,可以简化为以下几步:建立figure

建立ax

画图(可使用ax,或者matplotlib.pyplot)

修饰设计

保存

建立figure

讲解

创建一个Figure就是在画布上定义一块矩形区域,它有两个用处:再划分多个子区域

提供坐标系统,左下角为[0,0]点,右上角为[1,1]点

函数

matplotlib.figure.Figure(figsize=None, dpi=None, facecolor=None, edgecolor=None, linewidth=0.0, frameon=None, subplotpars=None, tight_layout=None, constrained_layout=None)

参数说明:figsize: 画布大小,默认:rcParam['figure.figsize'] (默认:[6.4, 4.8])

dpi: 像素,默认:100

facecolor:默认白色,边框旁白背景颜色

edgecolord:默认白色,边框线条颜色

linewidth:边框线条粗细

frameon: 是否有边框,默认为True

subplotpars:定义子图参数,是figure.SubplotParams的子类。默认figure.SubplotParams(lelf=None, bottom=None, right=None, top=None, wspace=None, hspace=None)

tight_layout:布尔值,axs离figure的旁白部分,如果False,则默认subplotpars参数。如果为True,则旁白宽度是字体的1.08倍

代码

from matplotlib.figure import Figure

fig = Figure()


import matplotlib.pyplot as plt

fig = plt.figure()

方法

添加物理位置子图:add_axes(rect, projection=None, polar=False, **kwargs)rect: [left, bottom, width, height]

rect = l, b, w, h

fig = plt.figure()

ax = fig.add_axes(rect, projection='polar')

fig.delaxes(ax)

添加子图布局:add_gridspec(nrows, ncols, *kwargs)nrows: 子图行数

ncols:子图列数

结合subplots使用

fig = plt.figure()

gs = fig.add_gridspec(2, 2)

ax1 = fig.add_subplot(gs[0, 0])

ax2 = fig.add_subplot(gs[1, 0], sharex = ax1)

# spans two rows:

ax3 = fig.add_subplot(gs[:, 1])

添加相对位置子图:add_subplot(*args, **kwargs)*frameon:坐标轴显示与否,默认True

sharex,sharey:共享某个坐标轴的x轴或者y轴,它的值是axe

对齐坐标轴标签(不是坐标轴是标签):align_xlabels(self, axs=None)

设置画布标题:text(self, x, y, s, fontdict=None, withdash=, **kwargs)x,y:画布中所处位置

s:标题文字

fontdict:字体

建立Axes

matplotlib.axes.Axes(fig, rect, facecolor=None, frameon=True, sharex=None, sharey=None, label='', xscale=None, yscale=None, **kwargs)fig:画布名称

rect:[left, bottom, width, height]位置

sharex/sharey:共享坐标轴的axes

frameon: 是否可视化轴线,默认True

xlabel/ylabel:坐标轴标签

xlim/ylim:坐标轴范围

title:坐标轴名称

xscale/yscale: 坐标轴刻度尺度,{"linear", "log", "symlog", "logit", ...}

xticks:坐标轴刻度

xticklabels: List[str] ,坐标轴标签

*** 以上属性可使用 ax.set_属性名()来设置

*** 以上属性可通过 ax.get_属性名()来获取

方法

画图

Axes.plot(x, y1, y2=0, where=None,)
Axes.fill_between(self, x, y1, y2=0, where=None, interpolate=False, step=None, *, data=None, **kwargs)
fig, ax = plt.subplots()
ax.plot(x, y1, x, y2, color='black')
ax.fill_between(x, y1, y2, where=y2 >y1, facecolor='yellow', alpha=0.5)
ax.fill_between(x, y1, y2, where=y2 <=y1, facecolor='red', alpha=0.5)
ax.set_title('Fill Between')
Axes.fill_betweenx(self, y, x1, x2=0, where=None, step=None, interpolate=False, *, data=None, **kwargs)
Axes.bar
Axes.barh
Axes.stem([x, ], y, linefmt=None, markerfmt=None, basefmt=None)linefmt:线型
markerfmt:标记形状
bottom:y轴基准线

Axes.eventplot(positions,, orientation='horizontal', lineoffsets=1, linelengths=1, linewidths=None, colors=None, linestyles='solid', *, data=None, **kwargs)position:一维或者二维数组,事件位置

orientation:方向

lineoffsets:不同类型事件之间的距离

Axes.pie(self, x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=None, radius=None, counterclock=True, wedgeprops=None, textprops=None, center=(0, 0), frame=False, rotatelabels=False, *, data=None)

Axes.stackplot(x,y,*args, labels=(), colors=None, baseline='zero', data=None, **kwargs)

Axes.broken_barh(self, xranges, yrange, *, data=None, **kwargs) 分块矩阵画图xranges:sequence of tuples (xmin, xwidth)

yrange:(ymin, yheight)

data:数据源,使用数据源,xranges,yrange使用data的键即可

Axes.vlines(self, x, ymin, ymax, colors='k', linestyles='solid', label='', *, data=None, **kwargs)

Axes.axvline(self,x) # 只画一条竖线

Axes.hlines(self, x, ymin, ymax, colors='k', linestyles='solid', label='', *, data=None, **kwargs)

Axes.axhline(self, y) # 只画一条水平线

Axes.fill(x,y,data=None,**kwargs) # x,y确定多边形的顶点,涂描多边形

ax.fill("time", "signal",data={"time": [0, 1, 2], "signal": [0, 1, 0]})

标签

annotate(self, s, xy, *args, **kwargs)text: 内容

xy:(float, float)要注释的点

xytext:(float, float)注释文本的位置,如果没有,则默认为xy

xycoords:坐标系,可选参数'figure points' | 'figure pixels' | 'figure fraction' | 'axes points'... | 'data'

arrowprops: dict,箭头属性,key建议直接考虑'arrowstyle',可选值有 ’-‘ | ’->' | '

text(self, x, y, s, fontdict=None, withdash=, **kwargs)x,y: 文本位置

s:文本内容

horizontalalignment:水平相对位置,如’center' | 'left' ...

verticalalignment:竖直相对位置

arrow(self, x, y, dx, dy, **kwargs) # 添加箭头

inset_axes(self, bounds, *, transform=None, zorder=5, **kwargs) # 添加子图bounds:[x0, y0, width, height], 子图的范围

transform:子图的刻画单位,默认为[0,1], 也可选ax.transData,按照数据来

secondary_xaxis(self, location, *, functions=None, **kwargs)

secondary_yaxis(self, location, *, functions=None, **kwargs)

显示

Axes.set_axis_off / Axes.set_axis_on

Axes.grid(self, b=None, which='major', axis='both', **kwargs)b:bool,是否显示网格,默认为True

which:{‘major', 'minor', 'both'}, 在什么级别坐标tick上显示网格线

axis: {'both', 'x', 'y'}

获取/设置数据

set/get:xlim, xlabel, title, legend

Axes.legend(*args, **kwargs)handels:图句柄

babels:句柄标签

loc:位置,选项有 ’best‘(0) | 'upper right'(1) | 'upper left'(2) | 'lower left'(3) | 'lower right'(4) | 'right'(5) | 'center left'(6) | 'center right'(7) | 'lower center'(8) | 'upper center'(9) | 'center'(10)

bbox_to_anchor:loc绝对位置(x, y, width, height),例如(0.5, 0., 0.5, 0.5), (0.5, 0.5)

ncol:标签的列数,默认为1

frameon:是否有边框

fontsize:字体大小

坐标轴刻度

set/get: xticks, xticklabels

Axes.minorticks_off/ Axes.minorticks_on: 移除/增加小刻度

Axes.tick_params(self, axis='both', **kwargs)axis: {'both', 'x', 'y'}

which: {'major', 'minor', 'both'}

direction:刻度位置, ’in' | 'out' | 'input'

pad:tick和label之间的距离

labelcolor,colors

bottom, top, left, right:bool值,刻度位置

labelbottom, labeltop, labelleft, labelright: bool值,刻度标签位置

labelrotation:倾斜度

增加部件

add_: artist, child_axes, collection, container, image, line, patch, table
Axes.twinx/ Axes.twiny

建立坐标轴和刻度

class `matplotlib.axis.XAxis(axes, pickradius=15)
class `matplotlib.axis.YAxis(axes, pickradius=15)

设置format案例

from matplotlib.ticker import FuncFormatter
import matplotlib.pyplot as plt
def ac(tick: '刻度', pos:'位置'):
return ['a','b','c','d'][tick]

fig = plt.figure()
ax = fig.add_subplot(111)
plt.plot([0,1,2],[7,8,9])
ax.set_xticks([1,2,3])
ax.xaxis.set_major_formatter(FuncFormatter(ac))

保存图片savefig(fname,*, transparent=None, **kwargs)

fname:图片名称

dpi:保存的像素,如果为None,则默认rcParams['savefig.dpi'].如果是’figure‘,则使用图片像素

facecolor:背景颜色

edgecolor:边框颜色

format:图片格式,如’png‘,’pdf‘,’svg'

bbox_inches:如果是‘tight’,则会剪裁图周围的空白

pad_inches:当bbox_inches为‘tight’时候剩余的幅度。只在tight情况下有用

plt.savefig('sdf2.png',bbox_inches='tight',pad_inches=0)

更新:工作中的一段代码案例

fig = plt.figure(figsize=[12.8*2,3.6*3])
ax_311 = fig.add_subplot(311)
ax_311.set_title(f'{kbarPeriod}周期kbar上1天波动率差值行情走势图',fontsize=16)
x_tick = range(data_len)
plt.plot(x_tick, closeM)
ax_312 = fig.add_subplot(312, sharex = ax_311)
plt.plot(x_tick, vol_1day_kbarP)
plt.ylim([0, 5])
ax_313 = fig.add_subplot(313, sharex = ax_311)
plt.plot(x_tick, volDiff_1day_kbarP)
plt.subplots_adjust(wspace =0, hspace =0)
x_shijian = kbarData['timestamp'].dt.strftime('%Y%m%D %H:%M')
step = int(data_len // 10)
x_tick_show = range(0, data_len, step)
x_tick_label = x_shijian.iloc[x_tick_show]
plt.xticks(x_tick_show, x_tick_label, rotation=-30)
path_png_bin_i = path_png_bin.joinpath(f'{kbarPeriod}周期kbar上1天波动率差值行情走势图.png')
plt.savefig(path_png_bin_i, bbox_inches='tight',pad_inches=0)
worksheet.insert_image(row, col, path_png_bin_i)
bin_data = hist_z(volDiff_1day_kbarP, bins)
worksheet.write_column(row+1, col+31, bins)
worksheet.write_column(row+1, col+31+1, bin_data)
worksheet.write_column(row+1, col+31+2, bin_data/np.sum(bin_data))
decribe_data = volDiff_1day_kbarP.describe()
worksheet.write_column(row+1, col+31+4, list(decribe_data.index))
worksheet.write_column(row+1, col+31+5, list(decribe_data))
row += row_add
workbook.close()