# 绘制棉棒图
# 棉棒图亦称为火柴杆图、大头针图或棒棒糖图,由线段 (茎) 与标记符号 (茎头,默认为圆点) 连接而成。其中,线段表示数据点到基线的距离,标记符号表示数据点的数值。棉棒图是柱形图或条形图的变形,主要用于比较标记符号的相对位置,而非比较线段的长度。例如,某公司全年盈利情况的棉棒图如图 8-5 所示。
# 在 matplotlib 中,pyplot 可以使用 stem() 函数绘制棉棒图。stem() 函数的语法格式如下所示 :
stem([x,] y, linefmt=None, markerfmt=None, basefmt=None, bottom=O,
label=None, use_line_collection=Fa1se, data=None)
# 该函数常用参数的含义如下。
# · x, y :表示茎的 x 值和茎头的 y 值。
· linefmt :表示茎属性的字符串。
· markerfmt :表示茎头属性的字符串。
· basefmt :表示基线属性的字符串。
· bottom :表示基线的 y 值。
· label :表示应用于图例的标签。
· use_line_collection :若设为 True, 则将棉棒图的所有线段存储到一个 LineCollection 类对象中;若设为 False, 则将棉棒图的所有线段存储到列表中。
# stem() 函数会返回一个形如 (markerline, stemlines, baseline) 的元组,其中元组的第 1 个元素 markerline 为代表棉棒图标记的 Line2D 对象,第 2 个元素 stemlines 为代表棉棒图线段的 Line2D 对象,第 3 个元素 baseline 为代表基线的 Line2D 对象。
此外,Axes 类的对象也可以使用 stem() 方法绘制棉棒图。
假设汽车生产商生产了一批小型轿车,并测试了这批小型轿车的燃料消耗量,结果如表 8-1 所示。
# 根据表 8-1 的数据,将 “轿车品牌” 一列的数据作为 X 轴的标签,将 “燃料消耗量” 一列的数据作为 y 轴的数据,使用 stem() 绘制不同品牌轿车燃料消耗量的棉棒图,具体代码如下。
In [3]:
import nurapy as np
import matplot1ib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
x = np.arange(1, 16)
y = np.array([5.9, 6.2, 6.7, 7.0, 7.0, 7.1, 7.2, 7.4,
7.5, 7.6, 7.7, 7.7, 7.7, 7.8, 7.9])
labels = np.array(['宝骏310','宝马', '致享', '焕驰', '力帆530',
'派力奥', '悦翔V3', '乐风RV', '奥迪A1', '威驰FS',
'夏利N7', '启辰R3', '和悦A13RS', '致炫', '赛欧'])
fig = plt.figure(figsize=(10, 6), dpi= 80)
ax = fig.add_subplot(111)
# 绘制棉棒图
markerline, stemlines, baseline = ax.stem(x, y, linefmt='--',
markerfmt='o', labels='TestStem', use_line__collection=True)
# 设置棉棒图线段的属性
plt.setp(stemlines, lw=1)
ax.set_title('不同品牌轿车的燃料消耗量', fontdict=('size':18))
ax.set_ylabel('燃料消耗量 (L/km)')
ax.set_xticks(x)
ax.set_xticklabels(labels, rotation=60)
ax.set_ylim([0, 10])
for temp_x, temp_y in zip(x, y):
ax.text(temp_x, temp_y+0.5, s='()'.format(temp_y), ha= 'center',
va='bottom', fontsize=14)
plt.show()