6.2 折线图及绘制属性

来源:互联网 发布:mysql创建序列sql语句 编辑:程序博客网 时间:2024/06/06 09:01

对6.1节生成的图形进行优化,首先引入数据集,示例代码:

import numpy as npimport matplotlib.pyplot as pltX = np.linspace(-np.pi, np.pi, 256, endpoint=True)     C, S = np.cos(X), np.sin(X)

6.2.1 Figure对象

通过pyplot模块中的figure()函数创建一个Figure(图表)对象,figsize参数指定Figure对象的宽度和高度,单位是英寸。此外还可以用dpi参数指定Figure对象的分辨率,即每英寸所表示的像素数,默认值为80,即创建的Figure对象的宽度为8*80=640个像素。示例代码:

plt.figure(figsize=(8, 6), dpi=80)

同一个图表多条数据的绘制,示例代码

6.2.2 plot()函数

创建Figure对象之后,接下来调用plot()在当前的Figure对象中绘图。plot()的前两个参数分别表示X、Y轴数据的对象,本示例使用的是NumPy数组。使用关键字参数可以指定所绘制曲线的各种属性:

  • label:给曲线指定一个标签,此标签将在图示中显示。
  • color:指定曲线的颜色,颜色可以用英文单词或以'#'字符开头的6位十六进制数表示,例如'#ff0000'表示红色。或者使用值在0到1范围之内的三个元素的元组来表示,例如(1.0, 0.0, 0.0)页表示红色。
  • linestyle:指定曲线的形状,参数值可以是'-'表示实线,'--'表示虚线。
  • linewidth:指定曲线的宽度,可以不是整数,也可以使用缩写形式的参数名lw。

示例代码:

...plt.plot(X, C, label="cosine", color="#ff0000", linewidth=2.5, linestyle="--")plt.plot(X, S, label="sine", color="green", linewidth=2.5, linestyle="-")plt.show()

综合以上代码,其运行结果图6-1所示:


图6-1


此外,也可以通过第三个参数'b--'指定曲线的颜色和线型,它通过一些易记的符号指定曲线的样式。其中'b'表示蓝色(blue),'--'表示线型为虚线。可以通过plt.plot?命令查看格式化字符串以及各个参数的详细说明。示例代码:

...plt.plot(X, C, 'b--')plt.plot(X, S, 'g-')...

颜色字符缩写及对应颜色如下表所示:

字符颜色bblue 蓝色ggreen 绿色rred 红色ccyan 青色mmagenta 品红色yyellow 黄色kblack 黑色wwhite 白色

6.2.3 Axes对象的各个属性

实际上plot()函数是在Axes(子图)对象上绘图,如果当前的Figure对象没有Axes对象,将会为之创建一个几乎充满整个图表的Axes对象,并且使此Axes对象成为当前的Axes对象。可以通过一系列函数设置当前Axes对象的各个属性:

  • xlabel、ylabel:分别设置X、Y轴的标题文字。
  • title:设置子图的标题。
  • xlim、ylim:分别设置X、Y轴的显示范围。
  • xticks、yticks:分别设置X、轴的显示刻度。
  • legend:显示图例,即图中表示每条曲线的标签(label)和样式的矩形区域。其中,loc参数可以设置为英文方位单词如upper,middle,lower,left,center,right,或者采用best参数自适应图例位置。

示例代码:

...plt.xlabel("independent variable")plt.ylabel("dependent variable")plt.xlim(-4.0, 4.0)plt.ylim(-1.0, 1.0)plt.xticks(np.linspace(-4, 4, 9, endpoint=True))plt.yticks(np.linspace(-1, 1, 5, endpoint=True))plt.legend(loc="upper left")plt.show()

运行结果如图6-2所示:


图6-2


当前图形的边界有点紧凑,我们想要预留一些空间,以便清楚地查看所有数据点。可以利用xlim和ylim的属性进行设置,示例代码:

...plt.xlim(X.min() * 1.1, X.max() * 1.1)plt.ylim(C.min() * 1.1, C.max() * 1.1)...

此外,当前刻度不太理想,因为它们未显示正弦函数和余弦函数有趣的值,我们将更改它们,以便只显示这些值。示例代码:

...plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi])plt.yticks([-1, 0, +1])...

刻度现在被正确放置,但是它们的标签不是很明确。我们可能猜测3.142代表π,它应该更好地使其明确出来。当我们设置刻度值时,我们还可以在第二个参数列表中提供相应的标签。在标签字符串的前后有字符'$',matplotlib会使用内嵌的LaTeX引擎将其显示为数学公式,允许标签更好地呈现出来。而使用LaTeX语法绘制数学公式会极大地降低图表的描绘速度。示例代码:

...plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi], [r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$'])plt.yticks([-1, 0, +1], [r'$-1$', r'$0$', r'$+1$'])...

6.2.4 轴线的设置

轴线是连接轴刻度线并且标记数据区域边界的线。 他们可以被放置在任意位置,直到现在,他们在轴的边界。 我们将改变它,因为我们想把它们放置在中间。 因为它有四个边界(顶部/底部/左侧/右侧),我们将它们的颜色设置为none来丢弃顶部和右侧边界,我们移动底部和左侧的边界将数据空间坐标变为原点。示例代码:

...ax = plt.gca() # gca stands for 'get current axis'ax.spines['right'].set_color('none')ax.spines['top'].set_color('none')ax.xaxis.set_ticks_position('bottom')ax.spines['bottom'].set_position(('data',0))ax.yaxis.set_ticks_position('left')ax.spines['left'].set_position(('data',0))plt.show()

综合以上参数的示例代码:

import numpy as npimport matplotlib.pyplot as pltX = np.linspace(-np.pi, np.pi, 256, endpoint=True)     C, S = np.cos(X), np.sin(X)plt.figure(figsize=(8, 6), dpi=80)plt.plot(X, C, label="cosine", color="#ff0000", linewidth=2.5, linestyle="--")plt.plot(X, S, label="sine", color="green", linewidth=2.5, linestyle="-")plt.xlim(X.min() * 1.1, X.max() * 1.1)plt.ylim(C.min() * 1.1, C.max() * 1.1)plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi],  [r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$'])plt.yticks([-1, 0, +1],  [r'$-1$', r'$0$', r'$+1$'])ax = plt.gca() ax.spines['right'].set_color('none')ax.spines['top'].set_color('none')ax.xaxis.set_ticks_position('bottom')ax.spines['bottom'].set_position(('data',0))ax.yaxis.set_ticks_position('left')ax.spines['left'].set_position(('data',0))plt.legend(loc="upper left")plt.show()

运行结果如图3所示:


图6-3

6.2.5 图表的输出和保存

最后调用plt.show()显示绘图窗口,也可以调用plt.savefig()将当前的Figure对象保存成图像文件,图像格式由图像文件的扩展名决定。下面的程序将当前的图表保存为test.png,并且通过dpi参数指定图像的分辨率为120,因此输出图像的宽度为8*120=960个像素。示例代码:

plt.savefig("test.png", dpi=120)

最后,可以通过help命令,查询相关方法的详细解释,示例代码:

print(help(plt.legend))