Matplotlib 棉棒图

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绘制棉棒图

Matplotlib 棉棒图样式

为了让棉棒图更加的美观,stem() 函数还提供了很多用于定义样式的参数,常用有 2 个:linefmt 和 markerfmt。

参数 linefmt 用于定义直线的样式,它的取值和折线图的 linestyle 参数取值类似,但只能使用字符型的取值,如下表所示。

参数 linefmt 的取值
取值 说明
-(默认值) 实线
-- 虚线
: 点线
-. 点划线

参数 markerfmt 用于定义圆点的样式,它的取值和折线图的 marker 参数取值是一样的,如下表所示。

参数 markerfmt 的取值
取值 说明
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()

运行之后,效果如下图所示。

Matplotlib棉棒图直线样式

示例 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棉棒图圆点样式

Matplotlib 棉棒图案例

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

Matplotlib棉棒图项目结构

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()

运行之后,效果如下图所示。

Matplotlib棉棒图的实际应用

分析:

这里我们再扩展一下,假如让你绘制 “每月销量与平均销量之差” 的棉棒图,又应该怎么去实现呢?其实也很简单,请看下面代码。

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()

运行之后,效果如下图所示。

Matplotlib包含正负值的棉棒图

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

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号