python数据可视化第八章使用matplotlib绘制高级图表

使用matplotlib绘制高级图表
1、绘制高等图
等高线图是地形图上高程相等的相邻各点所连成的j闭合曲线,它会将地面上海拔高度相同的点连成环线,之后将环线垂直投影到某一水平面上,并按照─定的比例缩绘到图纸上,常见于山谷、山峰或梯度下降算法的场景。
在matplotlib中,使用pyplot模块的contour()、contourf()函数可以绘制和填充等高线图。contour()函数的语法格式如下所示:

contour([X, Y,]Z, [levels,]**kwargs)

2、绘制矢量场流线图
矢量场流线图可以表现矢量场的流态,常见于科学和自然学科中的磁场、万有引力和流体运动等场景。
矢量场流线图包含多条带有箭头的线条,其中线条的长度表示矢量场的强度,箭头的方向表示矢量场的方向。此外,矢量场的强度也可以使用线条的密度来表示。
使用pyplot模块的streamplot()函数可以绘制矢量场流线图。

streamplot(x, y, u, v, density=1, linewidth=None, col=None, cmap=None, norm=None,arrowsize=1, arrowstyle='->', minlength=0.1, transform=None,zorder=None,start_points=None, maxlength=4.0, integration_direction='both'*, data=None)

3、绘制棉棒图
棉棒图亦称为火柴杆图、大头针图或棒棒糖图,由线段(茎)与标记符号(茎头,默认为圆点)连接而成,其中线段表示数据点到基线的距离,标记符号表示数据点的数值。棉棒图是柱形图或条形图的变形,主要用于比较标记符号的相对位置,而非比较线段的长度。
使用pyplot模块的stem()函数可以绘制棉棒图。

stem([x,] y, linefmt=None, markerfmt=None, basefmt=None, bottom=O,label—None, use_line_collection=False, data=None)

4、绘制哑铃图
哑铃图亦称为DNA图(图表横着看像哑铃,竖着看像DNA),主要用于展示两个数据点之间的变化。哑铃图可以看作散点图与线型图的组合,适用于比较各种项目“前”与“后”的位置及项目的等级排序的场景。
5、绘制甘特图
甘特图亦称为横道图、条状图,它通过活动列表和时间刻度表示特定项目的顺序与持续时间。甘特图─般以时间为横轴,项目为纵轴,可以直观地展示每个项目的进展情况,便于管理者了解项目的剩余任务及评估工作进度。
甘特图类似于条形图,这两种图表的图形都是横向矩形条,但甘特图中每个矩形条的起始位置是不同的。
使用pyplot的barh()函数可以绘制一个甘特图只需要给该函数的left参数传值,指定每个矩形条的x坐标即可。
6、绘制人口金字塔图
人口金字塔图是指用类似古埃及金字塔的形象描述人口年龄与性别分布状况的图形,用于表现人口的现状及其发展类型。人口金字塔图一般以年龄为纵轴、以人口数为横轴,按年龄自然顺序自下而上在纵轴左侧和右侧绘制并列的横向矩形条,纵轴左侧为男,右侧为女。
人口金字塔图中左侧的一组矩形条代表各年龄段男性的人口数,右侧的一组矩形条代表各年龄段女性的人口数。使用pyplot模块的barh()函数可以绘制一个人口金字塔图。
7、绘制漏斗图
漏斗图亦称为倒三角图,它将数据呈现为几个阶段,每个阶段的占比总计为100%,从一个阶段到另一阶段的数据自上而下逐渐降低。漏斗图通过展示业务各阶段数据的变化,可以帮助运营人员快速发现问题,适用于业务流程较为规范、周期长、环节多的流程分析的场景。
8、绘制桑基图
桑基图亦称为桑基能量分流图、桑基能量平衡图,是一种特定类型的流程图,用于展示数据的“流动”变化。桑基图中包含若干条从左到右延展的分支,每条分支的宽度代表着数据流量的大小,且所有主支宽度的总和等于所有分支宽度的总和,常见于能源、材料成分等场景或金融领域。
matplotlib.sankey模块中专门提供了表示桑基图的类Sankey,通过创建Sankey类的对象可以创建桑基图,之后可以调用add()方法为桑基图添加一些配置选项,最后调用finish()方法完成桑基图的绘制。
创建桑基图
matplotlib中使用Sankey类的构造方法Sankey()创建桑基图。

Sankey(ax=None, scale=1.0, unit=", format='%G', gap=0.25, radius=0.1,
shoulder=0.03, offset=0.15, head_angle=100, margin=0.4,
tolerance=1e-06,**kwargs)

添加桑基图的选项
Sankey类对象可以调用add()方法为桑基图添加诸如数据流量、标签等选项。

add(self,, patchlabel=", flows—None, orientations=None, labels=",trunklength=1.0, pathlengths=0.25, prior=None, connect=(0,0), rotation=O,**kwargs)

9、绘制树状图
树状图亦称为树枝状图,是一种通过树状结构描述父子成员层次结构的图形。树形图的形状一般是一个上下颠倒的树,其根部是一个没有父成员的根节点,之后从根节点开始是用线连接子成员,使子成员变为子节点,直至线的末端为没有子成员的树叶节点为止。树状图用于说明成员之间的关系和连接,常见于分类学、进化科学、企业组织管理等领域。
树状图的绘制需要准备聚类数据。若单独使用matplotlib较为繁琐,因此这里可以结合scipy包的功能完成。scipy是一款基于numpy的、专为科学和工程设计的、易于使用的Python包,它提供了线性代数、傅里叶变换、信号处理等丰富的功能。
scipy.cluster模块中包含众多聚类算法,主要包括矢量量化和层次聚类两种,并分别封装到vq或hierarchy模块中。
hierarchy模快中提供了一系列聚类的功能,可以轻松地生成聚类数据并绘制树状图。
dendrogram()凶数
dendrogram()函数用于将层次聚类数据绘制为树状图。

dendrogram(Z, p=30, truncate_mode=None,color_threshold=None,
get_leaves=T
orientation='top', labels=None,count_sort=False, distance_sort=False,
show_leaf_counts=True,**kwargs)

linkage()函数
linkage()函数用于将一维压缩距离矩阵或二维观测向量阵列进行层次聚类或凝聚聚类。

linkage(y, method='single', metric='euclidean' , optimal_orderin
g=False)

10、绘制华夫饼图
华夫饼图亦称为直角饼图,它是饼图的变体,可以直观地展示部分与整体的比例。华夫饼图一般由100个方格组成,其中每个方格代表1%,不同颜色的方格代表不同的分类,常见于比较同类型指标完成比例的场景,比如电影上座率、公司业务实际完成率等。
matplotlib中并未提供华夫饼图的绘制函数,但可以结合pywaffle包一起使用来绘制华夫饼图。
pywaffle的安装
开发者可以直接使用pip命令安装pywaffle包。打开命令提示符工具,在提示符的后面输入如下命令:

pip install pywaffle

pywaffle的安装
安装完成后,在提示符的后面输入python,之后输入如下导入语句进行验证:

from pywaffle import Waffle

pywaffle的使用
pywaffle是Python中专门绘制华夫饼图的包,它提供了一个继承自Figure的子类Waffle,通过将Waffle类传递给figure()函数的FigureClass参数,即可创建一个华夫饼图。关于figure()函数中创建华夫饼图的常用参数的含义如下:
pywaffle是Python中专门绘制华夫饼图的包,它提供了一个继承自Figure的子类Waffle,通过将Waffle类传递给figure()函数的FigureClass参数,即可创建一个华夫饼图。
代码演示:

import numpy as np
import matplotlib.pyplot as plt
def calcu_elevation(x1,y1):
    h=(1-x1/2+x1**5+y1**3)*np.exp(-x1**2-y1**2)
    return h
n=256
x=np.linspace(-2,2,n)
y=np.linspace(-2,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='skyblue')
ax.contourf(x_grid,y_grid,calcu_elevation(x_grid,y_grid),8,alpha=0.75)
ax.clabel(con,inline=True,fmt='%1.1f',fontsize=10)
ax.set_xticks([])
ax.set_yticks([])
plt.show()

python数据可视化第八章使用matplotlib绘制高级图表_第1张图片

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)
plt.show()

python数据可视化第八章使用matplotlib绘制高级图表_第2张图片

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family']='simHei'
plt.rcParams['axes.unicode_minus']=False
x = np.arange(1, 16)
y = np.array([5.9, 6.2,6.7,7.0,7.0,7.1,7.2,7.4,
                7.5,7.6,7.7,7.7,7.7,7.8,7.91])
labels = np.array(['宝骏310','宝马i3','致享','焕驰',' 力帆530',
'派力奥','悦翔v3','乐风RV',' 奥迪A1','威驰ES','夏利N7','启辰R30','和悦A13RS','1致炫5','赛欧'])
fig = plt.figure(figsize=(10, 6),dpi= 80)
ax = fig.add_subplot(111)
markerline,stemlines,baseline = ax.stem(x,y,linefmt='--',
markerfmt='o',label= 'TestStem',use_line_collection=True)
plt.setp(stemlines, lw=1)
ax.set_title ('不同品牌轿车的燃料消耗量',fontdict={'size':18})
ax.set_ylabel(' 燃料消耗量(L/kxm) ')
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()

python数据可视化第八章使用matplotlib绘制高级图表_第3张图片

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='#0e66FF',alpha=0.7)
ax.scatter(y=df['index'],x=df['pct_2014'],s=50,
          color='#a3c4FF',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与2014PCT指标变化率',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()

python数据可视化第八章使用matplotlib绘制高级图表_第4张图片

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='Cyan')
[ax.spines[i].set_visible(False) for i in ['top','right']]
ax.set_title("任务甘特图")
ax.set_xlabel("日期")
ax.grid(alpha=0.5,axis='x')
plt.show()

python数据可视化第八章使用matplotlib绘制高级图表_第5张图片

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='black')
ax.barh(y,list_female,tick_label=labels,label='女',color='skyblue')
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()

python数据可视化第八章使用matplotlib绘制高级图表_第6张图片

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='g',alpha=0.5)
rects2=ax.barh(y,x2,height,color='w',alpha=1)
ax.plot(x3,y,'w',alpha=0.7)
ax.plot(x2,y,'w',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('42')
plt.show()

python数据可视化第八章使用matplotlib绘制高级图表_第7张图片

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='w',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("日常生活开支的桑基图")
plt.show()

python数据可视化第八章使用matplotlib绘制高级图表_第8张图片

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("美国各州犯罪案件的树状图",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()

python数据可视化第八章使用matplotlib绘制高级图表_第9张图片

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=['#20B2FF','#D3D300'],
          title={'label':'电影《少年的你》上座率'},
          legend={'loc':'upper right','labels':['占座','空座']})
plt.show()

python数据可视化第八章使用matplotlib绘制高级图表_第10张图片

你可能感兴趣的:(数据可视化,笔记,python)