上一期我们介绍了matplotlib作图的基本思维,也对相关参数以及一些简单的图表进行示例演示,今天继续用matplotlib绘制一些既实用又有趣的图表。另外还有朋友问到能不能介绍一下pyecharts的用法,其实在很早之前就介绍过了,分别是pyecharts在手,天下我有(常用图表篇上)和pyecharts在手,天下我有(常用图表篇下)。
1. 面积图
上一期有读者问到如果想要把折线图下方的面积都填充上,那该怎么办?其实可以使用plt.stackplot进行填充。plt.stackplot填充的是图形与x轴组成的封闭空间。格式如:plt.stackplot(x,y,colors = xx)
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
plt.subplot(1,1,1)
x = np.array([1,2,3,4,5])
y = np.array([123,345,178,98,223])
plt.stackplot(x,y,colors = '#F4B833')
plt.title('面积图',fontsize = 15,loc = 'center')
plt.xlabel('月份')
plt.ylabel('人数')
plt.xticks(np.arange(1,6),['1月','2月','3月','4月','5月'])
说到填充还有一些填充函数,那就是plt.fill()和plt.fill_between();
(1)plt.fill():填充颜色的部分是首末两端连成一线组成的封闭空间,连接方式如下图红色箭头所示。格式为:plt.fill(x, y, colors = xx);
(2)plt.fill_between:填充指定区域的颜色,格式如:plt.fill_between(x, y1 ,y2=0, where = None, color=xx, alpha = xx);
#plt.fill()填充所有点或线组成的封闭空间的颜色,而封闭空间的组成是:point1-->point2-->point3.....-->point1
plt.figure(figsize=(8,6))
plt.subplot(1,1,1)
x = np.array([1,2,3,4,5,6])
y = np.array([123,345,178,98,128,246])
plt.plot(x, y, linestyle = 'dashed', color = '#2E2E2E')
plt.fill(x, y, color = '#FFD03B')
plt.annotate("",xy = (1,123),xytext = (6,246),arrowprops = dict(facecolor = "#2E2E2E",shrink = 0.001))
for a,b in zip(x,y):
plt.text(a,b,"点%d"%a,fontsize = 15)
plt.xticks([])
plt.yticks([])
#plt.fill_between()填充符合条件的封闭空间的颜色
plt.figure(figsize = (16,4))
plt.subplot(1,2,1)
x = np.linspace(-10,10,100)
y = -x**2
plt.plot(x,y, color='#FFD03B',linewidth = 3)
plt.fill_between(x,y,where =(x>=-5)&(x<=5),color = "#2E2E2E")
plt.subplot(1,2,2)
plt.plot(x,y, color='#FFD03B',linewidth = 3)
plt.fill_between(x,y,y2= -y-40,where =(x>=-5)&(x<=5),color = "#2E2E2E")
可以看到通过设置x,y1,y2填充不一样的区域,比如像上左图,y2默认是0,也就是填充符合条件的区域与x轴组成的封闭空间;
而如果不想跟x轴组成,想自定义的话就设置y2的值,如上右图所示。当然多出来的那两个小角是因为两条曲线相交的点不是在x=5的这个位置,具体是多少,可以通过等式-x2 = x2-40算出来,交点的x值等于正负根号20。
plt.figure(figsize = (10,4))
plt.subplot(1,1,1)
x1 = np.linspace(-10,10,100)
x2 = np.linspace(-2.5,2.5,100)
plt.plot(x1,-x1**2, color='#FFD03B',linewidth = 3)
plt.fill_between(x1,-x1**2,y2= x1**2-40,where =(x1>=-20**0.5)&(x1<=20**0.5),color = "#2E2E2E")
plt.scatter([-3.5,3.5],[-70,-70],c = "k",s = 300)
plt.plot(x2,-x2**2-90, color='k',linewidth = 3)
plt.axis("off")
2. 雷达图
雷达图常用来表示同一个主体不同指标的分布,最常见的估计就是王者荣誉结算后的战绩表了吧!我们可以通过建立极坐标系的方式画出来,格式如:plt.polar(theta = xx,r = xx,color = xx,marker = xx,linewidth = xx)
(1)theta:每个点在极坐标系中的角度;
(2)r:每一个点在极坐标系中的半径,也就是对应的数值;
plt.subplot(1,1,1,polar = True)
angles = np.linspace(0,2*np.pi,5,endpoint=False)
labels = ["输出","KDA","发育","团战","生存"]
data = [4.2,3.6,3.9,4.9,2.6]
data = np.concatenate((data,[data[0]])) #闭包
angles = np.concatenate((angles,[angles[0]])) #闭包
plt.polar(angles,data,color = "#2E2E2E",marker = "*",linestyle = "dashed")
plt.fill(angles,data,color = '#FFD03B')
plt.xticks(angles,labels,fontsize = 15)
plt.yticks(np.arange(1,6),labels= []) #去除雷达图里的标签
3. 热力图
热气图是常用的图表之一,它能快速的将重点关注区域反映出来,常用于相关性的可视化或者与地图结合起来表示数据的分布。我们可以通过plt.imshow()来绘制,格式如:plt.imshow(data,cmap = xx);
cmap:配色方案,用来表明图表渐变的主题色。
x = np.random.random(16).reshape(4,4) #随机生成4行4列的数组
cmap = plt.cm.summer_r #选择配色方案
plt.imshow(x,cmap = cmap)
plt.colorbar() #显示颜色条
for i in range(x.shape[0]):
for j in range(x.shape[1]):
plt.text(j,i,round(x[i,j],2),fontsize = 10)
4. 箱型图
箱型图常用来观察数据的分布情况,可直观地观察到异常点。可以通过plt.boxplot()绘制,
格式如:plt.boxplot(data,vert = True, widths = xx, labels = xx,sym = '+',showmeans = False, meanline = False,filerprops = xx,medianprops = xx,meanprops = xx)
(1)vert:箱型图的方向,默认是True,表示箱型图是纵向的;而False表示是横向的;
(2)widths:箱型图的宽度;
(3)sym:异常点的形状,默认是‘+’;
(4)showmeans:是否显示均值;
(5)meanline:是否用线表示均值,默认是点;
plt.subplot(1,1,1)
x = np.random.randn(1000)
plt.boxplot(x,vert = True,widths= 0.2,sym = "*",showmeans= True,meanline = False)
通过箱型图我们可以直观地看到异常点的存在,星星表示的点就是异常点,而中位数与均值在同一个位置,意味着这个数据并没有偏向。
5. 带数据表的图表
带数据表的图表常见于excel,对于数据相近或者需要查看具体数值时,数据表的作用就很明显。我们可以通过作图函数与plt.table()相结合,绘制带数据表的图表。格式如:plt.table(cellText,cellLoc,cellColours,rowLabels,rowColours,rowLoc,colLabels,colColours,colLoc,loc)
(1)cellText:数据;
(2)cellLoc、rowLoc,colLoc:单元格、行、列的对齐方式;
(3)cellColours、rowColours,colColours:单元格、行、列的颜色;
(4)rowLabels、colLabels:行、列的标签;
(5)loc:数据表的位置;
plt.subplot(1,1,1)
x = np.arange(1,5)
y1 = [20,30,40,50]
y2 = [10,20,30,40]
rows = ["行1","行2"]
columns = ["列1","列2","列3","列4"]
plt.table(cellText = [y1,y2],
cellLoc = "center",
rowLabels = rows,
rowLoc = "center",
rowColours = ["#E4E4E4"]*2,
colLabels = columns,
colColours = ["#E4E4E4"]*4,
colLoc = "center",
loc = "bottom"
)
plt.bar(x,y1,color = "#2E2E2E")
plt.bar(x,y2,color = "#FFD03B")
plt.xticks([])
6. 双坐标轴图表
在绘制图表时,经常会把不同的图表放到一张画布里进行对比分析或者增加信息量,但往往会因为两者的量纲不同,或者数据差异太大导致图表显示效果差,因此会设置一个副坐标轴。我们可以通过plt.twinx()建立y副坐标轴或者plt.twiny()建立x副坐标轴。
plt.subplot(1,1,1)
x = np.arange(1,10)
y1 = np.random.randint(10,100,9)
y2 = np.random.randint(10,100,9)
plt.plot(x,y1,color = "#FFD03B",marker = "o",linestyle = "dashed",linewidth = 3,markersize = 3,markerfacecolor = "w",label = "示例1")
plt.xlabel("月份")
plt.ylabel("人数")
plt.twinx()
plt.plot(x,y2,color = "#2E2E2E",marker = "*",linestyle = "dotted",linewidth = 3,markersize = 3,markerfacecolor = "w",label = "示例2")
plt.ylabel("人流量")
Text(0, 0.5, '人流量')
7. 配色方案
好看的图表往往离不开好看的配色方案,这里提供几种我常用的配色。
plt.figure(figsize=(12,8))
plt.subplot(2,2,1)
for i,j,k in zip([1,1,1,1],[10,7.5,5,2.5],["#2E2E2E","#FFFFFF","#FFD03B","#E4E4E4"]):
plt.bar(x = i,height = j,color = k)
plt.subplot(2,2,2)
for i,j,k in zip([1,1,1,1],[10,7.5,5,2.5],["#7294D4","#D8A499","#C6CDF7","#E6A0C4"]):
plt.bar(x = i,height = j,color = k)
plt.subplot(2,2,3)
for i,j,k in zip([1,1,1],[9,6,3],["#2F83E4","#00E5C1","#23CBFF"]):
plt.bar(x = i,height = j,color = k)
plt.subplot(2,2,4)
for i,j,k in zip([1,1,1],[9,6,3],["#CCB05D","#F4B833","#E43927"]):
plt.bar(x = i,height = j,color = k)