第八章、使用matplotlib绘制高级图表

8.1、绘制等高线图
等高线图是地形上高程相等的相邻各点所连成的闭合曲线,它会将地面上海拔高度相同的点连成环线,之后将环线垂直投影到某一水平面上,并按照一定的比例缩绘到图纸上。
在matplotlib中,pyplot可以使用contour()、contourf()函数分别绘制和填充等高线图。
X,Y:表示坐标点的网格数据
Z:表示坐标点对应的高度数据
levels:表示等高线的数量。
colors:表示不同高度的等高线颜色
cmap:表示颜色的映射表
linewidths:表示等高线的宽度
linestyle:表示等高线的线型
Axes类的对象也可以使用contour(),contourf()方法绘制和填充等高线。
示例代码如下:
import numpy as np
import matplotlib.pyplot as plt
def calcu_elevation(x1,y1):
h=(1-x1/2+x15+y13)*np.exp(-x12-y12)
return h
n=256
x=np.linspace(-1,2,n)
y=np.linspace(-1,2,n)
x_grid,y_grid=np.meshgrid(x,y)
fig=plt.figure()
ax=fig.add_subplot(111)
con=ax.contour(x_grid,y_grid,calcu_elevation(x_grid,y_grid),
8,colors=‘black’)
ax.contourf(x_grid,y_grid,calcu_elevation(x_grid,y_grid),
8,alpha=0.75,cmap=plt.cm.copper)
ax.clabel(con,inline=True,fmt=‘%1.1f’,fontsize=10)
ax.set_xticks([])
ax.set_yticks([])
plt.title(‘51’)
plt.show()
第八章、使用matplotlib绘制高级图表_第1张图片
8.2、绘制矢量场流线图
该函数常用参数含义如下:
x,y:表示间距均匀的网格数据
u,v:表示(x,y)速率的二维数组
density:表示流线的密度
arrowsize:表示箭头的大小
arrowstyle:表示箭头的类型
minlength:表示流线的最小长度
maxlength:表示流线的最大长度
Axes类的对象也可以使用streamplot()方法绘制矢量场流线图
示例代码如下:
import numpy as np
import matplotlib.pyplot as plt
y,x=np.mgrid[0:5:50j,0:5:50j]
u=x
v=y
fig=plt.figure()
ax=fig.add_subplot(111)
ax.streamplot(x,y,u,v,density=2)
plt.title(‘51’)
plt.show()
第八章、使用matplotlib绘制高级图表_第2张图片
8.3、绘制棉棒图
x,y:表示茎的x值和茎头的y 值
linefmt:表示茎属性的字符串
markerfmt:表示茎头属性的字符串
basefmt:表示基线属性的字符串
bottom:表示基线的y值
label:表示应用于图例的标签
use_line_collection:若设为True,则将棉棒图的所有线段存储到一个LineCollection类对象中,若设为False,则将棉棒图的所有线段存储到列表中。。
stem()函数会返回一个形如(markerline,stemline,baseline)的三元组。
示例代码如下:

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams[‘font.sans-serif’]=‘SimHei’
plt.rcParams[‘axes.unicode_minus’]=False
x=np.arange(1,16)
y=np.array([5.9,6.2,6.7,7.0,7.1,7.1,7.4,7.5,
7.6,7.7,7.7,7.7,7.8,7.9,8.0])
labels=np.array([‘宝骏310’,‘宝马i3’,‘兰博基尼’,‘奥迪’,‘玛莎拉蒂’,‘大黄蜂’,
‘劳斯莱斯’,‘致享’,‘乐风’,‘和悦’,‘威驰’,‘夏利’,‘启辰’,‘致炫’,‘赛欧’])
fig=plt.figure(figsize=(10,6),dpi=80)
ax=fig.add_subplot(111)
markerline,stemlines,baseline=ax.stem(x,y,linefmt=‘-.’,
markerfmt=‘*’,label=‘TestStem’,use_line_collection=True)
plt.setp(stemlines,lw=1)
plt.setp(markerline,color=‘#CC6699’)
ax.set_title(‘不同品牌汽车的燃料消耗量 51’,fontdict={‘size’:18})
ax.set_ylabel(‘燃料消耗量’)
ax.set_xticks(x)
ax.set_xticklabels(labels,rotation=60)
ax.set_ylim([0,10])
for temp_x,temp_y in zip(x,y):
ax.text(temp_x,temp_y+0.5,s=‘{}’.format(temp_y),ha=‘center’,
va=‘bottom’,fontsize=14)
plt.show()
第八章、使用matplotlib绘制高级图表_第3张图片
8.4、绘制哑铃图
使用pandas读取health.xlsx文件的数据,并根据读取的数据绘制有散点和线组成的哑铃图。
示例代码如下:

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.lines as mlines
plt.rcParams[‘font.sans-serif’]=‘SimHei’
plt.rcParams[‘axes.unicode_minus’]=False
df=pd.read_excel(r"C:\Users\Administrator\Desktop\health.xlsx")
df.sort_values(‘pct_2014’,inplace=True)
df.reset_index(inplace=True)
df=df.sort_values(by=“index”)
def newline(p1,p2,color=‘black’):
ax=plt.gca()
l=mlines.Line2D([p1[0],p2[0]],[p1[1],p2[1]],color=‘skyblue’)
ax.add_line(l)
return l
fig,ax=plt.subplots(1,1,figsize=(8,6))
ax.scatter(y=df[‘index’],x=df[‘pct_2013’],s=50,
color=‘#0e668b’,alpha=0.7)
ax.scatter(y=df[‘index’],x=df[‘pct_2014’],s=50,
color=‘#a3c4dc’,alpha=0.7)
for i,p1,p2 in zip(df[‘index’],df[‘pct_2013’],df[‘pct_2014’]):
newline([p1,i],[p2,i])
ax.set_title(‘2013年与2014年PCT指标变化率 51’,fontdict={‘size’:12})
ax.set_xlim(0,.25)
ax.set_xticks([.05,.1,.15,.20])
ax.set_xticklabels([‘%5’,‘%10’,‘%15’,‘%20’])
ax.set_xlabel(‘变化率’)
ax.set_yticks(df[‘index’])
ax.set_yticklabels(df[‘city’])
ax.grid(alpha=0.5,axis=‘x’)
plt.show()
第八章、使用matplotlib绘制高级图表_第4张图片
8.5、制作甘特图
甘特图亦称为横道图、条状图,它通过活动列表和时间刻度表示特定项目的顺序与持续时间。
甘特图类似于条形图,这两种图表的图形都是横向矩形条,但甘特图中每个矩形条的起始位置是不同的。
使用pyplot的barh()函数可以绘制一个甘特图只需要给该函数的left参数传值,指定每个矩形条的x坐标即可。
示例代码如下:

import numpy as np
import matplotlib.pyplot as plt
ticks=np.array([‘报告提交’,‘数据分析’,‘数据录入’,‘实地执行’,
‘问卷确定’,‘试访’,‘问卷设计’,‘项目确定’])
y_data=np.arange(1,9)
x_data=np.array([0.5,1.5,1,3,0.5,1,1,2])
fig,ax=plt.subplots(1,1)
ax.barh(y_data,x_data,tick_label=ticks,
left=[7.5,6,5.5,3,3,2,1.5,0],color=‘skyblue’)
[ax.spines[i].set_visible(False) for i in [‘top’,‘right’]]
ax.set_title(“任务甘特图 51”)
ax.set_xlabel(“日期”)
ax.grid(alpha=0.5,axis=‘x’)
plt.show()
第八章、使用matplotlib绘制高级图表_第5张图片
8.6、绘制人口金字塔
人口金字塔图是指用类似古埃及金字塔的形象描述人口年龄与性别分布状况的图形,用于表现人口的现状及其发展类型。人口金字塔图中左侧的一组矩形条代表各年龄段男性的人口数,右侧的一组矩形条代表各年龄段女性的人口数。使用pyplot模块的barh()函数可以绘制一个人口金字塔图。
下面使用pandas读取population.xlsx文件的数据,并根据读取的数据绘制人口金字塔图。先将男性和女性参数单独提出来
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
plt.rcParams[‘font.sans-serif’]=‘SimHei’
plt.rcParams[‘axes.unicode_minus’]=False
df=pd.read_excel(r"C:\Users\Administrator\Desktop\population.xlsx")
df_male=df.groupby(by=‘Gender’).get_group(‘Male’)
df_male
第八章、使用matplotlib绘制高级图表_第6张图片
list_male=df_male[‘Number’].values.tolist()
df_female=df.groupby(by=‘Gender’).get_group(‘Female’)
df_female
第八章、使用matplotlib绘制高级图表_第7张图片
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
plt.rcParams[‘font.sans-serif’]=‘SimHei’
plt.rcParams[‘axes.unicode_minus’]=False
df=pd.read_excel(r"C:\Users\Administrator\Desktop\population.xlsx")
df_male=df.groupby(by=‘Gender’).get_group(‘Male’)
list_male=df_male[‘Number’].values.tolist()
df_female=df.groupby(by=‘Gender’).get_group(‘Female’)
list_female=df_female[‘Number’].values.tolist()
df_age=df.groupby(‘AgeGroup’).sum()
count=df_age.shape[0]
y=np.arange(1,11)
labels=[]
for i in range(count):
age=df_age.index[i]
labels.append(age)
fig=plt.figure()
ax=fig.add_subplot(111)
ax.barh(y,list_male,tick_label=labels,label=‘男’,color=‘#6699FF’)
ax.barh(y,list_female,tick_label=labels,label=‘女’,color=‘#CC6699’)
ax.set_ylabel(“年龄段”)
ax.set_xticks([-100000,-75000,-50000,-25000,0,
25000,50000,75000,100000])
ax.set_xticklabels([‘100000’,‘75000’,‘50000’,‘25000’,‘0’,
‘25000’,‘50000’,‘75000’,‘100000’])
ax.set_xlabel(“人数”)
ax.set_title(‘某城市人口金字塔’)
ax.legend()
plt.show()
第八章、使用matplotlib绘制高级图表_第8张图片
8.7、绘制漏斗图
示例代码如下:

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams[‘font.sans-serif’]=‘SimHei’
plt.rcParams[‘axes.unicode_minus’]=False
num=5
height=0.5
x1=np.array([1000,500,300,200,150])
x2=np.array((x1.max()-x1)/2)
x3=[i+j for i,j in zip(x1,x2)]
x3=np.array(x3)
y=-np.sort(-np.arange(num))
labels=[‘访问商店’,‘加购物车’,‘生成订单’,‘支付订单’,‘完成交易’]
fig=plt.figure(figsize=(10,8))
ax=fig.add_subplot(111)
rects1=ax.barh(y,x3,height,tick_label=labels,color=‘#CC6699’,alpha=0.5)
rects2=ax.barh(y,x2,height,color=‘w’,alpha=1)
ax.plot(x3,y,‘black’,alpha=0.7)
ax.plot(x2,y,‘black’,alpha=0.7)
notes=[]
for i in range(0,len(x1)):
notes.append(‘%.2f%%’%((x1[i]/x1[0])*100))
for rect_one,rect_two,note in zip(rects1,rects2,notes):
text_x=rect_two.get_width()+(rect_one.get_width()
-rect_two.get_width())/2-30
text_y=rect_one.get_y()+height/2
ax.text(text_x,text_y,note,fontsize=12)
ax.set_xticks([])
for direction in [‘top’,‘left’,‘bottom’,‘right’]:
ax.spines[direction].set_color(‘none’)
ax.yaxis.set_ticks_position(‘none’)
plt.title(‘51’)
plt.show()
第八章、使用matplotlib绘制高级图表_第9张图片
8.8、绘制桑葚图
桑基图是流图 的一种,用来描述能量,人口,经济等的流动情况。Sankey是一名船长也是工程师,1898年Sankey在土木工程师学会会报纪要的一篇关于蒸汽机能源效率的文章中首次推出了第一个能量流动图,后来被命名为Sankey图,中文音译为桑基图。桑基图中包含若干条从左到右延展的分支,每条分支的宽度代表数据流量的大小。
1、创建桑葚图
ax:若不提供该参数,则会创建一个新的坐标轴;
scale:表示流量比例的因子,用于按比例调整分支的宽度;
unit:表示与流量相关的物理单位的字符串.若设为None,则不会做数量标记;
gap:表示进入或离开顶部或底部的分支间距,默认为0.25;
2、添加桑葚图的选项
patchlabel:表示位于图表中心的标签;
flows:表示流量数据数组,其中投入数据为正值,产生数据为负值;
orientations:表示流的方向列表或用于所有流的单个方向,可以取值为0;
labels:表示流的标签列表或用于所有流的单个标签;
trunklength:表示输入组和输出组的基之间的长度;
3、返回桑葚图绘制完成的对象
patch:表示桑基子图的轮廓;
flows:表示流量值(输入为正,输出为负);
angles:表示箭头角度的列表;
tips:表示流路径的尖端或凹陷位置的数组,其中每一行是一个(x,y);
text:表示中心标签的Text实例;
texts:表示流分支标签的Text实例;
示例代码如下:

import matplotlib.pyplot as plt
from matplotlib.sankey import Sankey
plt.rcParams[‘font.sans-serif’]=‘SimHei’
plt.rcParams[‘axes.unicode_minus’]=False
flows=[0.7,0.3,-0.3,-0.1,-0.3,-0.1,-0.1,-0.1]
labels=[“工资”,“副业”,“生活”,“购物”,“深造”,“运动”,“其他”," 买书"]
orientations=[1,1,0,-1,1,-1,1,0]
sankey=Sankey()
sankey.add(flows=flows,labels=labels,orientations=orientations,
color=‘black’,fc=“lightgreen”,patchlabel=“生活消费”,alpha=0.7)
diagrams=sankey.finish()
diagrams[0].texts[4].set_color(“r”)
diagrams[0].texts[4].set_weight(“bold”)
diagrams[0].text.set_fontsize(20)
diagrams[0].text.set_fontweight(“bold”)
plt.title(“日常生活开支的桑基图 51”)
plt.show()
第八章、使用matplotlib绘制高级图表_第10张图片
8.9、绘制树状图
树状图的绘制需要准备聚类数据。若单独使用matplotlib较为繁琐,因此这里可以结合scipy包的功能完成。scipy是一款基于numpy的、专为科学和工程设计的、易于使用的Python包,它提供了线性代数、傅里叶变换、信号处理等丰富的功能。
scipy.cluster模块中包含众多聚类算法,主要包括矢量量化和层次聚类两种,并分别封装到vq或hierarchy模块中。hierarchy模快中提供了一系列聚类的功能,可以轻松地生成聚类数据并绘制树状图。
1、dendrogram()函数
Z:表示编码层次聚类的链接矩阵
truncate_mode:表示截断的模式,用于压缩因规则矩阵过大而难以阅读的树状图,可以取值为None
color_threshold:表示颜色阈值
labels:表示节点对应的文本标签
2、linkage()函数
(1)y:可以是一维距离向量或二维的坐标矩阵
(2)method:表示计算类簇之间距离的方法,常用的取值可以为‘single’、‘complete’、‘average’、和‘ward’,各取值具体含义如下:
‘single’:表示将类簇与类簇之间最近的距离作为类簇间距
‘complete’:表示将类簇与类簇之间最远距离作为类簇间距
‘average’:表示将类簇与类簇之间的平均距离作为类簇间距
‘ward’:表示将类簇与类簇之间的方差最小化作为类簇间距
示例代码如下:

import pandas as pd
import matplotlib.pyplot as plt
import scipy.cluster.hierarchy as shc
plt.rcParams[‘font.family’]=‘simHei’
plt.rcParams[‘axes.unicode_minus’]=False
df =pd.read_excel(r’C:\Users\Administrator\Desktop\USArrests.xlsx’)
plt.figure(figsize=(10,6),dpi=80)
plt.title(“美国各州犯罪案件的树状图 51”,fontsize=12)
dend=shc.dendrogram(shc.linkage(df[[‘Murder’,‘Assault’,‘UrbanPop’]],
method=‘ward’),labels=df.State.values,color_threshold=100)
plt.xticks(fontsize=10.5)
plt.ylabel(‘案例数量’)

plt.show()
第八章、使用matplotlib绘制高级图表_第11张图片
8.10、绘制华夫饼图
1、pywaffle的安装
可以直接在命令控制端pip命令安装pywaffle包。
pip install pywaffle
2、pywaffle的使用
FigureClass:可以是Figure类或Figure子类
rows:表示华夫饼图的行数
columns:表示华夫饼图的列数
values:表示数据,可以接收数组或字典
vertical:表示是否按垂直方向绘制华夫饼图,默认为False
legend:表示图例,可以接收一个字典
示例代码如下:

import matplotlib.pyplot as plt
from pywaffle import Waffle
plt.rcParams[‘font.family’]=‘simHei’
plt.rcParams[‘axes.unicode_minus’]=False
plt.figure(FigureClass=Waffle,rows=10,columns=10,
values=[95,5],vertical=True,colors=[‘skyblue’,‘#6699FF’],
title={‘label’:‘电影《少年的你》上座率’},
legend={‘loc’:‘upper right’,‘labels’:[‘占座’,‘空座’]})
plt.title(‘51’)
plt.show()
第八章、使用matplotlib绘制高级图表_第12张图片

你可能感兴趣的:(python)