今天 探讨plot函数中fmt传参中是否指定marker的各种情况,以及不通过fmt传参,而是通过**kwargs传参的情况
在此先准备绘制一份带有误差棒的柱形图用以对比区分(数据摘自课本P48)
#导入库并命名
import matplotlib.pyplot as plt
import numpy as np
#设置汉字显示
plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
#准备x轴和y轴数据
x = np.arange(3)
y1 = np.array([2.04, 1.57, 1.63])
y2 = np.array([1.69, 1.61, 1.64])
y3 = np.array([4.65, 4.99, 4.94])
y4 = np.array([3.39, 2.33, 4.10])
#指定测量偏差
error1 = [0.16, 0.08, 0.10]
error2 = [0.27, 0.14, 0.14]
error3 = [0.34, 0.32, 0.29]
error4 = [0.23, 0.23, 0.39]
bar_width = 0.2
#绘制柱形图
plt.bar(x, y1, bar_width)
plt.bar(x + bar_width, y2, bar_width, tick_label=["春季", "夏季", "秋季"])
plt.bar(x + 2*bar_width, y3, bar_width)
plt.bar(x + 3*bar_width, y4, bar_width)
#绘制误差棒: 横杆大小为 3, 线条宽度为 2, 线条颜色为黑色, 数据点标记样式为p(五角星)
plt.errorbar(x, y1, yerr=error1, capsize=3, elinewidth=2, fmt='pk')
plt.errorbar(x + bar_width, y2, yerr=error2, capsize=3, elinewidth=2, fmt='pk')
plt.errorbar(x + 2*bar_width, y3, yerr=error3, capsize=3, elinewidth=2, fmt='pk')
plt.errorbar(x + 3*bar_width, y4, yerr=error4, capsize=3, elinewidth=2, fmt='pk')
#运行
plt.show()
运行结果图:
首先我们先了解fmt参数:可选参数 [fmt] 是一个字符串来定义图的基本属性如:颜色(color),点型(marker),线型(linestyle), 具体形式 fmt = ' [color] [marker] [line]'
颜色:
符号 | 含义 |
---|---|
r | 红色 |
g | 绿色 |
b | 蓝色 |
c | 青色 |
y | 黄色 |
k | 黑色 |
w | 白色 |
m | 品红 |
标记样式:
符号 | 含义 |
---|---|
. | 实心点 |
+ | 十字号 |
* | 星号 |
< | 朝左三角 |
> | 朝右三角 |
^ | 朝上三角 |
v | 朝下三角 |
d | 菱形 |
p | 五角星 |
h | 六角星 |
s | 方块 |
o | 空心圆圆 |
x | 叉字符 |
线型:
符号 | 含义 |
---|---|
- | 细直线 |
: | 虚点线 |
-. | 点画线 |
– | 虚画线 |
如果我们通过fmt传参时没有指定marker类型:
#绘制误差棒: 横杆大小为 3, 线条宽度为 2, 线条颜色为黑色, 无数据点标记样式
plt.errorbar(x, y1, yerr=error1, capsize=3, elinewidth=2, fmt='k')
plt.errorbar(x + bar_width, y2, yerr=error2, capsize=3, elinewidth=2, fmt='k')
plt.errorbar(x + 2*bar_width, y3, yerr=error3, capsize=3, elinewidth=2, fmt='k')
plt.errorbar(x + 3*bar_width, y4, yerr=error4, capsize=3, elinewidth=2, fmt='k')
运行结果图:
两者较之对比,很明显下面没指定marker类型的柱形图相较于上面一张柱形图在数据点的位置少了五边形的标记.并且marker在无参时不会影响其他属性的正常传入
那么我们再来换个标识点样式试一下:
#绘制误差棒: 横杆大小为 3, 线条宽度为 2, 线条颜色为黑色, 数据点标记样式为x(叉字符)
plt.errorbar(x, y1, yerr=error1, capsize=3, elinewidth=2, fmt='xk')
plt.errorbar(x + bar_width, y2, yerr=error2, capsize=3, elinewidth=2, fmt='xk')
plt.errorbar(x + 2*bar_width, y3, yerr=error3, capsize=3, elinewidth=2, fmt='xk')
plt.errorbar(x + 3*bar_width, y4, yerr=error4, capsize=3, elinewidth=2, fmt='xk')
我们可以看到标记样式从五边形变成了叉字符
同时要注意:
- 如果fmt字符串中
提供了标记部分
而没有提供线形部分
,将不会绘制直线
! - 如果不提供
fmt
字符串,则只绘制直线,不绘制标记。
然后再来了解**kwargs参数
**kwargs是将一个可变的关键字参数的字典传给函数实参,同样参数列表长度可以为0或为其他值。
若不用fmt参数,那就要改用关键字参数(**kwargs)对单个属性赋值。
例如:
plot(x,y1,color='blue', marker='v', linestyle=':')
如果两个参数都对某一外观属性进行了定义,以关键字参数定义为准。 即关键字参数 **kwargs 参数优先级高于 fmt 参数
下面举例一下:
#绘制误差棒: 横杆大小为 3, 线条宽度为 2, 线条颜色为黑色, 数据点标记样式为p(五角星),线条样式为点线
plt.errorbar(x,y1, yerr=error1, capsize=3, elinewidth=2, color='black',linestyle=':',marker='p')
plt.errorbar(x + bar_width, y2, yerr=error2, capsize=3, elinewidth=2, color='black',linestyle=':',marker='p')
plt.errorbar(x + 2*bar_width, y3, yerr=error3, capsize=3, elinewidth=2, color='black',linestyle=':',marker='p')
plt.errorbar(x + 3*bar_width, y4, yerr=error4, capsize=3, elinewidth=2, color='black',linestyle=':',marker='p')
运行结果图: