在Jupyter Notebook
中显示SVG格式的图形的函数
def use_svg_display(): #@save
"""使用svg格式在Jupyter中显示绘图"""
backend_inline.set_matplotlib_formats('svg')
"""调用Matplotlib库的函数,用于设置图形的显示格式。"""
设置图表大小
def set_figsize(figsize=(3.5, 2.5)): #@save
"""设置matplotlib的图表大小"""
use_svg_display()
d2l.plt.rcParams['figure.figsize'] = figsize
设置由matplotlib生成图表的轴的属性。
#@save
def set_axes(axes, xlabel, ylabel, xlim, ylim, xscale, yscale, legend):
"""设置matplotlib的轴"""
axes.set_xlabel(xlabel)
axes.set_ylabel(ylabel)
axes.set_xscale(xscale)
axes.set_yscale(yscale)
axes.set_xlim(xlim)
axes.set_ylim(ylim)
if legend:
axes.legend(legend)
axes.grid()
axes: Matplotlib图形对象的轴对象。
xlabel: x轴的标签。
ylabel: y轴的标签。
xlim: x轴的范围。
ylim: y轴的范围。
xscale: x轴的刻度缩放类型。
yscale: y轴的刻度缩放类型。
legend: 图例的内容。
axes.grid(): 在图形中添加网格线
通过这三个用于图形配置的函数,定义一个plot函数来简洁地绘制多条曲线
#@save
def plot(X,Y=None,xlabel=None,ylabel=None,legend=None,xlim=None,ylim=None,xscale='linear',yscale='linear',
fmts=('-','m--','g-','r:'),figsize=(3.5,2.5),axes=None):
if legend is None:
legend=[]
set_figsize(figsize)
axes=axes if axes else d2l.plt.gca()
def has_one_axis(X):
return (hasattr(X,"ndim") and X.ndim==1 or isinstance(X,list)
and not hasattr(X[0],"__len__"))
if has_one_axis(X):
X=[X]
if Y is None:
X,Y=[[]]*len(X),X
elif has_one_axis(Y):
Y=[Y]
if len(X)!=len(Y):
X=X*len(Y)
axes.cla()
for x,y,fmt in zip(X,Y,fmts):
if len(x):
axes.plot(x,y,fmt)
else :
axes.plot(y,fmt)
set_axes(axes,xlabel,ylabel,xlim,ylim,xscale,yscale,legend)
X: x轴的数据。可以是单个数组或列表,也可以是多个数组或列表的集合。
Y: y轴的数据。可以是单个数组或列表,也可以是多个数组或列表的集合。如果未提供Y,则默认将X作为Y数据。
fmts: 绘图的格式列表。默认为(‘-’,‘m–’,‘g-’,‘r:’),表示使用不同的线型和颜色进行绘制。
‘-’: 实线
‘–’: 虚线
‘-.’: 点划线
‘:’: 点线
‘m’: 品红色(magenta)
‘g’: 绿色(green)
‘r’: 红色(red)
axes=axes if axes else d2l.plt.gca(): 如果未提供axes参数,则将其设置为当前活动轴。
def has_one_axis(X): …: 这是一个内部函数,用于判断X是否是单轴数据。它返回一个布尔值,表示X是否是一维数组或列表。
1.hasattr(X, “ndim”) and X.ndim == 1: 这个条件判断X是否具有ndim属性,并且ndim属性的值是否为1。这里假设X是一个NumPy数组或类似的数据结构,ndim表示数组的维度数。如果X是一维数组,那么ndim的值应该为1。
2.isinstance(X, list) and not hasattr(X[0], “len”): 这个条件判断X是否为一个列表,并且列表的第一个元素是否没有__len__属性。__len__属性用于获取对象的长度或元素个数。这个判断意味着如果X是一个列表,并且列表的第一个元素没有__len__属性,那么X可以被视为单轴数据。
if has_one_axis(X): X=[X]: 如果X是单轴数据,则将其转换为一个包含单个元素的列表。
if Y is None: X,Y=[[]]*len(X),X: 如果未提供Y参数,则将X作为Y数据,并将X设置为空列表。
elif has_one_axis(Y): Y=[Y]: 如果Y是单轴数据,则将其转换为一个包含单个元素的列表。
if len(X)!=len(Y): X=X*len(Y): 如果X和Y的长度不一致,则将X复制为与Y相同长度的列表。
axes.cla(): 清除轴上的当前图形。
for x,y,fmt in zip(X,Y,fmts): …: 遍历X和Y的元素以及fmts列表,并使用plot函数绘制图形。
if len(x): axes.plot(x,y,fmt) else: axes.plot(y,fmt): 如果x不为空,则使用x和y数据绘制图形;否则,仅使用y数据绘制图形。
set_axes(axes,xlabel,ylabel,xlim,ylim,xscale,yscale,legend): 调用set_axes函数设置轴的属性,包括标签、范围、刻度类型、图例和网格线。
x = np.arange(0, 3, 0.1)
plot(x, [f(x), 2 * x - 3], 'x', 'f(x)', legend=['f(x)', 'Tangent line (x=1)'])