Matplotlib 棉棒图函数
棉棒图,也叫做棒棒糖图或火柴杆图,它是由一个 “杆”(直线)和一个 “头”(圆点)组成的,如下图所示。

在 Matplotlib 中,我们可以使用 stem() 函数来绘制一个棉棒图。棉棒图是柱形图的变形,你可以把它看成是一种特殊的柱形图。
语法:
plt.stem(x, y)说明:
参数 x 存放的是所有点的 x 轴坐标,参数 y 存放的是所有点的 y 轴坐标,它们可以是列表、数组、Series 等。
示例 1:Matplotlib 绘制棉棒图
import matplotlib.pyplot as plt
# 绘图
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [53, 11, 54, 34, 21, 36, 19, 48, 16, 35]
plt.stem(x, y)
# 显示
plt.show()运行之后,效果如下图所示。

Matplotlib 棉棒图样式
为了让棉棒图更加的美观,stem() 函数还提供了很多用于定义样式的参数,常用有 2 个:linefmt 和 markerfmt。
参数 linefmt 用于定义直线的样式,它的取值和折线图的 linestyle 参数取值类似,但只能使用字符型的取值,如下表所示。
| 取值 | 说明 |
|---|---|
| -(默认值) | 实线 |
| -- | 虚线 |
| : | 点线 |
| -. | 点划线 |
参数 markerfmt 用于定义圆点的样式,它的取值和折线图的 marker 参数取值是一样的,如下表所示。
| 取值 | 说明 |
|---|---|
| o(默认值) | 实心圆 |
| . | 点 |
| , | 像素 |
| v | 下三角 |
| ^ | 上下角 |
| < | 左三角 |
| > | 右三角 |
| 1 | 下花三角 |
| 2 | 上花三角 |
| 3 | 左花三角 |
| 4 | 右花三角 |
| s | 实心正方形 |
| p | 实心五角星 |
| * | 星形 |
| h | 竖六边形 |
| H | 横六边形 |
| + | 加号 |
| × | 叉号 |
| d | 小菱形 |
| D | 大菱形 |
| | | 垂直线 |
示例 2:直线的样式
import matplotlib.pyplot as plt
# 绘图
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [53, 11, 54, 34, 21, 36, 19, 48, 16, 35]
plt.stem(x, y, linefmt='-.')
# 显示
plt.show()运行之后,效果如下图所示。

示例 3:圆点的样式
import matplotlib.pyplot as plt
# 绘图
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [53, 11, 54, 34, 21, 36, 19, 48, 16, 35]
plt.stem(x, y, markerfmt='D')
# 显示
plt.show()运行之后,效果如下图所示。

Matplotlib 棉棒图案例
在当前项目下的 data 文件夹中有一个 product.csv 文件,项目结构如下图所示。其中 product.csv 文件保存的是每个月的产品销量,如下图所示。


示例 4:Matplotlib 棉棒图的应用
import pandas as pd
import matplotlib.pyplot as plt
# 设置
plt.rcParams['font.family'] = ['SimHei', 'PingFang SC']
plt.rcParams['axes.unicode_minus'] = False
# 读取数据
df = pd.read_csv('data/product.csv')
# 绘制图表
plt.stem(df['月份'], df['销量'])
# 定义标题
plt.title('每月销量棉棒图')
plt.xlabel('月份', loc='right')
plt.ylabel('销量', loc='top')
# 刻度标签
plt.xticks(range(1, 13))
# 显示
plt.show()运行之后,效果如下图所示。

分析:
这里我们再扩展一下,假如让你绘制 “每月销量与平均销量之差” 的棉棒图,又应该怎么去实现呢?其实也很简单,请看下面代码。
import matplotlib.pyplot as plt
# 设置
plt.rcParams['font.family'] = ['SimHei', 'PingFang SC']
plt.rcParams['axes.unicode_minus'] = False
# 读取数据
df = pd.read_csv('data/product.csv')
# 求平均值
mean = df['销量'].mean()
# 求与平均值之差(利用广播机制)
df['差值'] = df['销量'] - mean
# 绘制图表
plt.stem(df['月份'], df['差值'])
# 定义标题
plt.title('每月销量棉棒图')
plt.xlabel('月份', loc='right')
plt.ylabel('销量', loc='top')
# 刻度标签
plt.xticks(range(1, 13))
# 显示
plt.show()运行之后,效果如下图所示。

棉棒图的值也可以是负值,从上图可以清楚地看出来,每个月销量相对于平均值来说是如何波动的。
