6.2 折线图及绘制属性

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

import numpy as np
import matplotlib.pyplot as plt
X = 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 np
import matplotlib.pyplot as plt
X = 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))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值