matplotlib库
1.1、概述:
1、在 python 数据分析领域,matplotlib 库是与 numpy 库、pandas 库并驾齐驱的三库之一,被称作 python 数据分析的“三剑客” 2、matplotlib 库相较于 pandas 绘图以及 seaborn 绘图工具更为底层,因此,matplotlib库中的绘图函数、参数相对更多,我们可以根据自己的风格自由选择。
1.2、pyplot模块
pyplot是matplotlib库下面的一个绘图模块 from matplotlib import pyplot as plt #导入pyplot模块并简写为plt
1.3、matplotlib 库绘图
1.3.1、画布的生成与保存:plt.figure()
figure--[?f?ɡ?(r)]--图形、 size-- [sa?z] --大小
一张图的三个基本要素为:画布,图表,元素,对图表进行解释的内容是图表元素
In [ 12 ]
1
2 plt.figure(figsize=(6, 6))
Out [ 12 ]
<Figure size 432x432 with 0 Axes>
<Figure size 432x432 with 0 Axes>
参数 figsize 可以控制画布的长和宽,一般用元组的形式进行赋值 <Figure size 432x432 with 0 Axes>表示生成了一个空白的画布对象。 画布大小为 6 英寸x6 英寸,默认分辨率为 72 像素/英寸,所以像素为 432x432 plt.savefig():将画布保存到本地,如:plt.savefig(’./工作/各月总订单量趋势图.png’)
1.3.2、 设置 x/y 坐标值
x/y 坐标均为可迭代对象,可以理解为有序的元素序列,比如 x = (x1, x2, x3, ……, xn),y = (y1, y2, y3, ……, yn)。
1.3.3、绘制折线图和柱状图
1.3.3.1绘制折线图:plt.plot()
示例一、
plt.figure(figsize=(6, 6))
x = pd.Series(['第一季度', '第二季度', '第三季度', '第四季度'])
y = pd.Series([59, 70, 68, 56])
plt.plot(x, y, color='dodgerblue')
通过数据清洗后得到一个 的Series 对象:order_number 月份 1 13852.0 2 389319.0 3 1961480.0 4 546276.0 5 158188.0 6 22222.0 Name: 订单量, dtype: float64 Series 对象的 index 和 values 属性可以分别获取左边的索引和右边的数据 values-[?v?lju?z] -价值观、index-- [??ndeks] --指数;指标;索引;标志 array – [??re?] --排列,数组,阵列
order_number.index
order_number.values
示例二、
1
2 x = order_number.index
3
4 y = order_number.values
5
6 plt.figure(figsize=(6, 6))
7
8 plt.plot(x, y)
plt.plot()函数参数表: linewidth 可以设置线条的宽度,常见为数值类型。 参数 color 可以设置线条的的颜色。如红色:color=‘r’(‘red’可以简写为’r’) 下图为 matplotlib 库支持的颜色,只需要向 color 传入颜色块旁边对应的英文单词即可,常见为字符串类型。
marker-- [?mɑ?k?(r)] --n.(表示方位的)标记,记号;标志;标识;
参数 marker 可以设置数据标记点的形状,有点、圆、加号等,常见为字符串类型 参数 markersize 和 markerfacecolor 用来设置数据标记点的大小和填充颜色。markersize 的设置方法与 linewidth 参数相同,而 markerfacecolor 参数的设置方法与 color 参数一致。 face-- [fe?s] --v,面对;面向;正对 n,脸;面孔;
**示例:**数据标记点的形状为圆:marker=‘o’;大小为 10:markersize=10;填充颜色为白色:markerfacecolor=‘w’。 plt.plot(x, y, linewidth=3, color=‘r’, marker=‘o’, markersize=10, markerfacecolor=‘w’) 效果如下: 绘制折线图完整代码示例:
下方代码中order_number为Series对象,见本章1.3.3.1
In [ 36 ]
1
2 plt.figure(figsize=(6, 6))
3
4 x = order_number.index
5 y = order_number.values
6
7 plt.plot(x, y, linewidth=3, color='r', marker='o',
8
markerfacecolor='w', markersize=10)
9
10 plt.title('各月总订单量趋势图', fontsize=20)
11
12 plt.xticks(fontsize=12)
13 plt.yticks(fontsize=12)
14
15 plt.xlabel('月份', fontsize=15)
16 plt.ylabel('各月总订单量(百万)', fontsize=15)
17
18 plt.savefig('./工作/各月总订单量趋势图.png')
输出效果: 思维导图(以绘制多条折线图为例)
1.3.3.2绘制 柱壮图:plt.bar()
plt.bar()的座标参数是 x 和 height,height 表示柱子的高,对应 y 坐标值。
height--[ha?t]--高度、 color--[?k?l?(r)]--颜色
plt.figure(figsize=(6, 6))
x = pd.Series(['第一季度', '第二季度', '第三季度', '第四季度'])
y = pd.Series([59, 70, 68, 56])
plt.bar(x, height=y, color='darkorange', alpha=0.6)
plt.bar()也可以和plt.plot()一样通过调整其中的参数去改变柱子的样式,见下图 1 color 和折线图中的 color 略有不同,当设置一种颜色时,传入值的类型为字符串;设置多种颜色时,传入值的类型为列表,如:color=[‘r’, ‘g’, ‘g’, ‘g’, ‘g’, ‘b’] 柱子的颜色是按照列表中颜色字符串的顺序设置的。
2 width 则需要传入0, 1区间 (大于 0,小于等于 1) 内的浮点数,数值越大表示柱子的宽度越宽;当 width 的值为 1 时,柱子之间的间隙就为 0。
3 alpha参数 可以设置柱子颜色的透明度,需要传入(0, 1]区间内的浮点数,数值越小,表示柱子颜色越浅;相反,则越深。适当地调整颜色深浅,可以提升视觉舒适度。
完整代码示例:
In [ 57 ]
1
2 plt.figure(figsize=(6, 6))
3
4 x = mask_price.index
5 y = mask_price.values
6
7 plt.bar(x, height=y, color=['r', 'g', 'g', 'g', 'g', 'b'], width=0.6, alpha=0.6)
8
9 plt.title('各月平均单价分布图', fontsize=20)
10
11 plt.xticks(fontsize=12)
12 plt.yticks(fontsize=12)
13
14 plt.xlabel('月份', fontsize=15)
15 plt.ylabel('各月平均单价(元)', fontsize=15)
16
17 for a, b in zip(x, y):
18 plt.text(a, b, '%.0f' % b, ha='center', va='bottom', fontsize=12)
19
20 plt.savefig('./工作/各月平均单价分布图.png')
输出效果:
思维导图:
1.3.3.3绘制饼图:plt.pie()
x 表示饼图中各个扇形面积的大小。
In [ 25 ]
1
2 plt.figure(figsize=(6, 6))
3
4 x = pd.Series([59, 70, 68, 56])
5
6 autopct='%.2f%%'
7
8 textprops = {'fontsize': 12, 'color': 'black'}
9
10 explode = [0.1, 0, 0, 0]
11
12 colors = ['cornflowerblue', 'salmon', 'yellowgreen', 'orange']
13
14 plt.pie(x, autopct=autopct, textprops=textprops,
15
explode=explode, colors=colors)
16
17 plt.title('闪光科技2020年各季度研发费用占比饼图', fontsize=20)
18
19 plt.legend(['第一季度', '第二季度', '第三季度', '第四季度'])
运行
Out [ 25 ]
<matplotlib.legend.Legend at 0x7f559aee1a20>
绘制饼图的相关参数:
1.4、设置图表标题:plt.title(label,fontsize)
参数:label 设置图表的标题名,常见为字符串类型,label–[?le?bl]–标签 参数: fontsize 设置标题的字体大小,需要向它传入一个代表字体大小的数值。 例:
plt.figure(figsize=(6, 6))
plt.bar(x, height=y, color='darkorange', alpha=0.6)
plt.title(label='想要填入的标题名称', fontsize=20)
如果想设置更丰富的字体样式,可以用 fontdict 参数代替 fontsize。 fontdict 是一个包含许多参数的字典,以思源黑体字体为例,详见以下表格
1.5、设置坐标轴
1.5.1设置 x、y 轴刻度:plt.xticks()和 plt.yticks()
font--[f?nt]--字体 size--[sa?z]--大小
plt.xticks( ) plt.yticks( ) 坐标轴刻度是可以自定义的,比如调整刻度的间隔、标签名称等,略… 参数fontsize,设置字体大小,它的用法可以参考 plt.title()中 fontsize 的用法,见本章1.4节
1.5.2、设置坐标轴标题:plt.xlabel()和 plt.ylabel()
坐标轴标题主要对坐标轴刻度值的含义进行描述 plt.xlabel(xlabel,fontsize) plt.ylabel(ylabel,fontsize) 第一个参数设置坐标轴的标题名,常见为字符串类型 第二个参数 fontsize同上 例:
plt.figure(figsize=(6, 6))
plt.bar(x, height=y, color='darkorange', alpha=0.6)
plt.xlabel(xlabel='季度',fontsize=15)
plt.ylabel(ylabel='研发费用(百万元)',fontsize=15)
另外可以添加参数ha和va,设置标题文本的对齐方式 与水平对齐方式有关的参数 ha,可选’left’、‘right’、‘center’等,以及与垂直对齐方式有关的参数 va,可选’center’、 ‘top’、‘bottom’、'baseline’等。
1.6、设置图例:plt.legend(labels)
legend-- [?led??nd] --n.传奇;传说;(地图或书中图表的)图例;说明
参数labels表示图例名称,对应图中的多个条件,通常传入可迭代对象,比如列表、Series 对象等。 如:plt.legend(‘变化’,‘分布’) 例:调用柱状图和折线图的绘图函数,生成一个复合图表。
In [ 22 ]
1
2 plt.figure(figsize=(6, 6))
3
4 x = pd.Series(['第一季度', '第二季度', '第三季度', '第四季度'])
5 y = pd.Series([59, 70, 68, 56])
6
7 plt.plot(x, y, color='dodgerblue')
8
9 plt.bar(x, height=y, color='darkorange', alpha=0.6)
?10
11 plt.legend(['研发费用变化','研发费用分布'])
Out [ 22 ] <matplotlib.legend.Legend at 0x7fbe4b217400>
1.7 小结
1 参数label 可以表示图表标题名,常见为字符串类型 2 参数 xlabel、ylabel 分别表示 x 轴、y 轴标题名,常见为字符串类型 3 参数 labels 表示图例名称,常见为可迭代对象
1.8、设置数据标签:plt.text(x、y、s、ha、va fontsize)
数据标签是指坐标点上方显示的标签,用于呈现每个坐标点的数据信息。 调用 plt.text()函数可以在图表的指定位置添加文本,但是每次只能添加一个。 参数x、y 表示所添加文本的位置,受到函数本身的属性限制,常见为数值或者字符串类型,这与绘图函数中 x、y 可以传入可迭代对象有很大的差异。 s 表示数据标签的文本内容,常见为数值或者字符串类型。 与水平对齐方式有关的参数 ha,可选’left’、‘right’、‘center’等,以及与垂直对齐方式有关的参数 va,可选’center’、 ‘top’、‘bottom’、'baseline’等。
例:plt.text(‘第三季度’,50, ‘八八’, ha=‘center’, va=‘bottom’, fontsize=12 参数x y s 对应:第三季度’,50, ‘八八’,意思为:在X轴第三季度柱子上,对应Y轴50刻度的位置上添加数据标签八八。即标签八八添加在X、Y轴交叉点
示例代码:
In [ 21 ]
1
2 plt.figure(figsize=(6, 6))
3
4 plt.bar(x, height=y, color='darkorange', alpha=0.6)
5
?6
7 plt.text('第一季度', 59, 59, ha='center', va='bottom', fontsize=12)
8 plt.text('第二季度', 70, 70, ha='center', va='bottom', fontsize=12)
9 plt.text('第三季度', 68, 68, ha='center', va='bottom', fontsize=12)
10 plt.text('第四季度', 56, 56, ha='center', va='bottom', fontsize=12)
Out [ 21 ]
Text(第四季度, 56, '56')
这样添加数据标签太麻烦了,可以借助 zip() 函数实现简单化。 zip()函数理解为拉链,x=(x1, x2, x3,……, xn)为拉链的左边,y=(y1, y2, y3,……, yn)为拉链的右边,经过 zip()函数,就合并为(x1, y1), (x2, y2), (x3, y3),……,(xn, yn)。 例:
In [ 22 ]
1 x = pd.Series(['第一季度', '第二季度', '第三季度', '第四季度'])
2 y = pd.Series([59, 70, 68, 56])
3 for a, b in zip(x, y):
4 print(a, b)
运行
Out [ 22 ]
第一季度 59
第二季度 70
第三季度 68
第四季度 56
zip()函数可以从 x、y 元素序列中依次取出元素,按照顺序进行一对一匹配。
用zip()函数那前面的代码就可以这样写:
In [ 23 ]
1
2 plt.figure(figsize=(6, 6))
3
4 plt.bar(x, height=y, color='darkorange', alpha=0.6)
5
6 x = pd.Series(['第一季度', '第二季度', '第三季度', '第四季度'])
7 y = pd.Series([59, 70, 68, 56])
8 for a, b in zip(x, y):
9
plt.text(a,b,b,ha='center', va='bottom', fontsize=12)
思维导图汇总
|