7.4创建火柴杆图
一个二维的火柴杆图(stem plot)把数据显示为沿x轴的基线延伸的线条。圆圈(默认值)或者其他标记表示每个杆的结束,其y
轴表示了数据值。
本节将讨论如何创建火柴杆图。
不要把火柴杆图和茎叶图(stem and leaf plot)混淆,茎叶图是把最不重要的数值表示为叶,把较高位的值表示为茎的一种数据表现方法,如图7-4所示。
7.4.1 准备工作
我们将使用一个离散值序列来绘制火柴杆图,这种离散的数据用普通的线性图表是无法展示的。
绘制离散序列的火柴杆图,数据值表示为每个杆末端的标记。从基线(通常在y= 0处)延伸到数据值点的线称为杆。
7.4.2 操作步骤
我们将使用matplotlib的stem()函数绘制火柴杆图。这个函数可以只使用一系列的y值,x值为生成的一个从0到len(y)-1的简单序列。如果把x和y序列都提供给stem()函数,该函数会把它们用于两个坐标轴。
我们要为火柴杆图配置下面的一些格式器。
¡linefmt:杆线的线条格式器。
¡markerfmt:火柴杆线条末端的标记用该参数格式化。
¡basefmt:规定基线的外观。
¡label:设置火柴杆图图例的标签。
¡hold:把所有当前图形放在当前坐标轴上。
¡bottom:在y轴方向设置基线位置,默认值为0。
参数hold是图表的一个常见的特性。如果它是打开状态(True),接下来的所有图表都会被添加到当前坐标轴上。否则,每一个图形会创建新的图表和坐标轴。
执行下面的步骤来创建一个火柴杆图。
(1)生成随机噪声数据。
(2)设置火柴杆参数。
(3)绘制火柴杆。
下面是相应的代码。
import matplotlib.pyplot as plt
import numpy as np
# time domain in which we sample
x = np.linspace(0, 20, 50)
# random function to simulate sampled signal
y = np.sin(x + 1) + np.cos(x ** 2)
# here we can setup baseline position
bottom = -0.1
# True -- hold current axes for further plotting
# False -- opposite. clear and use new figure/plot
hold = False
# set label for legend.
label = "delta"
markerline, stemlines, baseline = plt.stem(x, y, bottom=bottom,
label=label, hold=hold)
# we use setp() here to setup
# multiple properties of lines generated by stem()
plt.setp(markerline, color='red', marker='o')
plt.setp(stemlines, color='blue', line)
plt.setp(baseline, color='grey', linewidth=2, line)
# draw a legend
plt.legend()
plt.show()
以上代码生成的图形如图7-5所示。
7.4.3 工作原理
首先我们需要准备一些数据。对于本节来说,生成的伪采样信号已经够用了。在真实世界里,任何离散序列数据都适合用火柴杆图来呈现。我们用Numpy的numpy.linspace、numpy.cos和numpy.sin函数生成该信号。然后,设置火柴杆图的标签和基线的位置,基线位置的默认值为0.0。
如果想要绘制多个火柴杆图,可以将hold的值设置为True,这样所有火柴杆图将会被渲染在相同的坐标轴中。调用matplotlib.stem会返回3个对象。第一个是markerline,它是一个Line2D的实例,保存了表示火柴杆本身的线条的引用。它仅仅渲染了标记,不包括连接标记的线条。可以通过编辑该Line2D实例的属性让线条可见,操作步骤会在后面讲解。最后一个对象baseline也是一个Line2D实例,保存了表示stemlines原点的水平线条的引用。返回的第二个对象是stemlines,它表示茎线的Line2D实例的集合(目前是Python列表)。
通过setp函数把属性应用到这些对象或这些对象集合的所有的线条(Line2D实例)上,我们用返回的对象来处理火柴杆图的可视化需求。
你可以尝试一些设置,来理解setp是如何改变图形风格的。
内容来源:异步社区;版权属【人民邮电出版社 异步社区】所有,转载已获得授权;未经授权,不得以任何方式复制和传播本书内容,如需转载请联系异步社区。