前几期已经把读写数据、数据预处理等介绍完了,今天我们接着介绍一个可视化的库matplotlib,虽说现在已经有了更为高级的可视化库,如seaborn,ploty,pyecharts等,但是matplotlib是最为基础,作图思路最为全面的可视化库,学会了matplotlib之后,再学其他的就显得更为简单。
1.作图之前
为了使得作图能正常的显示,作图之前往往都需要添加以下代码:
#解决中文乱码的问题
plt.rcParams["font.sans-serif"] = "SimHei"
#解决负号不能正常显示的问题
plt.rcParams["axes.unicode_minus"] = False
#直接在jupyter notebook展示图片
%matplotlib inline
#作图使用svg格式更为清晰
%config InlineBackend.figure_format = "svg"
1.1 可视化伪代码
设置画布的大小:plt.figure(figsize = (x,y))
建立坐标系: add_subplot()、plt.subplot()、plt.subplots()
作图函数: plot、bar、scatter、barh、pie、boxplot
设置图表标题: plt.title()
设置x轴y轴标题: plt.x/ylabel()
设置x轴y轴刻度: plt.x/yticks()
设置x轴y轴范围: plt.x/ylims()
添加数据标签: plt.text()
添加注释: plt.annotate()
添加数据表格: plt.table()
添加图例: plt.legend()
展示结果: plt.show()
1.2 坐标系的建立
坐标系的建立方法有好几种,add_subplot()是面向对象的方法,也就是得先建立画布,然后在画布上建立坐标系,然后才能在坐标系上作图;而后两种(plt.subplot()、plt.subplots())属于函数式方法,是直接调用plt里面的函数建立的坐标系,区别在于plt.subplot()一次只建立指定的几个坐标系,而plt.subplots()是一次性全部坐标系都建立出来,比如:
# add_subplot(行,列,第几个)建立坐标系
import matplotlib.pyplot as plt
fig = plt.figure()
ax1 = fig.add_subplot(1,2,1)
ax2 = fig.add_subplot(1,2,2)
#plt.subplot(行,列,第几个)建立坐标系
plt.subplot(2,2,1)
plt.subplot(2,2,4)
#plt.subplots(行,列)建立坐标系
plt.subplots(1,2)
1.3 作图函数
作图函数包括很多,常用的有折线图plot,柱形图bar,条形图barh,饼图pie,散点图scatter,面积图stackplot,雷达图polar,热力图imshow等,这里先不具体介绍,等其他参数介绍完之后实例介绍。
1.4 图表的标题
图表的标题通过plt.title()设置,格式如下:
plt.title("xxxx",loc = "left/right/center",fontsize = x,color = x,fontwidth = x)
1.5 坐标轴设置
(1) 轴标题的设置:plt.xlabel/ylabel("xxxx",labelpad = x,fontsize = x,color = x,fontwidth = x)
(2) 坐标系范围:plt.xlim/ylim(x,y)
(3) 坐标轴的刻度:plt.xticks/yticks(range,labels = [])
1.6 附加元素
(1) 网格线设置:plt.grid(True,axis = "x/y",linestyle = x,linewidth = x);
不设定axes时,默认xy轴的网格线都打开;
linestyle表示线的风格,有实线(solid),虚线(dashed),线点(dashdot),虚点线(dotted)。
(2)数据标签的设置:plt.text(x,y,z,ha = "left/right/center",va = "top/bottom/center", fontsize = s,color = s);
ha表示水平的位置,va表示垂直的位置;
格式如下:
for a,b in zip(x,y):
plt.text(a,b,b,ha = xx,va = xx)
(3)注释:plt.annotate("xxx",xy = (x,y),xytext = (x,y),arrowprops = dict(arrowstyle = "x",facecolor = x));
arrowstyle表示注释的风格,常用的有"->","-]","-","","fancy"(头小尾大的箭头);
xy表示需要注释的位置,而xytext表示注释文本所在的位置。
(4)数据表格:plt.table(cellText,cellColours,cellLoc,rowLabels,rowColours,rowLoc,colLabels,colColours,colLoc,loc);
数据表格包含三要素,分别是数值,行和列,数值通过cellText设置,行列标签通过rowLabels和colLabels设置;
需要注意的是数值、行、列的颜色填充分别是cellColours,rowColours和colColours,若写成cellColors,程序会报错。
(5)图例的设置:plt.legend(ncol = x,loc = x);
ncol表示图列分为几列来显示,默认是一列。
1.7 折线图
折线图的格式如下:
plt.plot(x,y,linestyle = s,linewidth = s,color = s,marker = s,markersize = s,markeredgecolor = s, markeredgewidth = s,markerfacecolor = s,label);
marker表示点的风格:常用的有"+","o","*","s"(正方形),"p"(五边形),"h"(六边形),"d"(小菱形);
常用的颜色有:"b"(蓝色),"g"(绿色),"k"(黑色),"w"(白色),"r"(红色),"y"(黄色),"c"(青色),"m"(品红)。
import numpy as np
plt.subplot(1,1,1)
x = np.arange(10)
y = np.arange(10)
plt.plot(x,y,
linestyle = "dashdot",
linewidth = 2,
color = "c",
marker = "*",
markersize = 10,
markerfacecolor = "m",
markeredgecolor = "m",
label = "示例1")
plt.title("示例1",fontsize = 15,color = "k",loc = "center")
plt.xlabel("x轴")
plt.ylabel("y轴")
plt.grid(b = True,axis = "x",linestyle = "dashed")
for a,b in zip(x,y):
plt.text(a,b-0.5,b,va = "center",ha = "center")
plt.annotate("这是坐标xy都是5的位置",xy = (5,5),xytext=(6,4),arrowprops = dict(arrowstyle = "fancy",facecolor = "r"))
plt.legend()
1.8 柱形图与条形图
柱形图与条形图的原理相似,只是height跟width两个参数含义交换,这里只介绍柱形图。
柱形图的格式如下:plt.bar(x,height = s,width = s,color = s,edgecolor = s,align = center/edge);
align表示柱子与x的关系,center表示柱子位于x轴的中心,edge表示柱子位于x轴的边缘;
height表示柱子的高度,就是y值;
width表示柱子的宽度。
import numpy as np
x = np.arange(1,5)
y1 = np.arange(1,5)
y2 = np.arange(2,6)
plt.subplot(2,2,1)
plt.bar(x,
height = y1,
width = 0.3,
align = "center",
facecolor = "c")
for a,b in zip(x,y1):
plt.text(a,b,b,va = "center",ha = "center")
#簇状柱形图
plt.subplot(2,2,2)
plt.bar(x,
height = y1,
width = 0.3,
align = "center",
facecolor = "c",
label = "示例1")
plt.bar(x+0.3,
height = y2,
width = 0.3,
align = "center",
facecolor = "m",
label = "示例2")
for a,b in zip(x,y1):
plt.text(a,b,b,va = "center",ha = "center")
for a,b in zip(x,y2):
plt.text(a+0.3,b,b,va = "center",ha = "center")
plt.legend()
#堆积柱形图
plt.subplot(2,2,3)
plt.bar(x,
height = y1,
width = 0.3,
align = "center",
facecolor = "c",
label = "示例1")
plt.bar(x,
height = y2,
width = 0.3,
align = "center",
facecolor = "m",
label = "示例2")
for a,b in zip(x,y1):
plt.text(a,b,b,va = "center",ha = "center")
for a,b in zip(x,y2):
plt.text(a,b,b,va = "center",ha = "center")
plt.legend()
#堆积柱形图
plt.subplot(2,2,4)
plt.bar(x,
height = y2,
width = 0.3,
align = "center",
facecolor = "m",
label = "示例2")
plt.bar(x,
height = y1,
width = 0.3,
align = "center",
facecolor = "c",
label = "示例1")
for a,b in zip(x,y1):
plt.text(a,b,b,va = "bottom",ha = "center")
for a,b in zip(x,y2):
plt.text(a,b,b,va = "top",ha = "center")
plt.legend()
簇状柱形图的原理就是在同样的x值做不同的柱子时,第二个柱子往左或者往右移动一个柱子的宽度,如上图所示的0.3;
堆积柱形图的原理是只要是在相同的x值作不同的柱子时,柱子会自动叠加,这里需要注意的是更大的y值需要先作图,不然的话会像图3所示,正确的做法如图四所示,y2的值更大,所以先作图。
1.9 饼图
饼图的格式如下:plt.pie(x,explode = [],labels = [],autopct = s,pctdistance = s,radius = s,labeldistance = s, shadow = True/False,wedgeprops = dict(width = s,edgecolor = s),center = s, counterclock = True/False)
explode表示饼图中每一块离圆心的位置;
autopct表示数据标签中数值的百分比格式;
pctdistance表示数据标签距离圆心的距离;
radius表示饼图的半径;
labeldistance表示每一块图例离圆心的距离;
shadow表示是否有阴影;
wedgeprops表示每一块的边界属性;
center表示圆心的位置;
counterclock表示是否让饼图逆时针显示。
#饼图
plt.subplot(1,2,1)
x = [i**2 for i in np.arange(1,5)]
plt.pie(x,
explode= [0,0,0.2,0],
labels = ["东","南","西","北"],
colors = ["b","steelblue","c","g"],
autopct = "%.1f%%",
radius = 1,
pctdistance= 0.7,
labeldistance = 0.5,
shadow= True,
counterclock = False)
#圆环图
plt.subplot(1,2,2)
x = [i**2 for i in np.arange(1,5)]
plt.pie(x,
labels = ["东","南","西","北"],
radius = 1,
labeldistance = 1.2,
wedgeprops= dict(width = 0.3,edgecolor = "w"))
plt.pie(x,
radius = 0.8,
wedgeprops= dict(width = 0.3,edgecolor = "w"))
圆环图的原理就是设置不同的半径,然后通过设置边界的宽度与颜色来达到分离的效果。
1.10 散点图
散点图的格式如下:plt.scatter(x,y,marker = a,s = a,c = a,edgecolors = a,linewidths = a)
s表示散点的大小;
c表示散点的颜色;
edgecolors表示散点边缘的颜色;
linewidths表示散点的线宽。
# 散点图
x = np.arange(1,5)
y = [i**2 for i in x]
plt.subplot(1,2,1)
plt.scatter(x,
y,
marker = "d",
s = 200,
c = "c",
edgecolors = "m")
for a,b in zip(x,y):
plt.text(a,b,b,ha = "center",va = "center")
#气泡图
plt.subplot(1,2,2)
plt.scatter(x,
y,
marker = "o",
s = y*200, #根据y值设置散点的大小
c = y) #根据y值生成不同的颜色
for a,b in zip(x,y):
plt.text(a,b,b,ha = "center",va = "center")