图形模块使用

图形模块使用

  • 水平条形图

  • 交叉条形图

  • 直方图
  • 箱线图
  • 折线图

  • 散点图和气泡图

  • 热力图

  • 组合图绘制

  • 可视化相关模块

水平条形图

概念

擅长对比差异不大或水平值过多的离散型变量

对于条形图而言,对比的是柱形的高低,柱体越高,代表的数值越大,反之亦然

语法:

bar(x, height, 
width=0.8, 
bottom=None, 
color=None, 
edgecolor=None, 
tick_label=None, 
label = None, 
ecolor=None)

参数:

x:传递数值序列,指定条形图中x轴上的刻度值 
height:传递数值序列,指定条形图y轴上的高度
width:指定条形图的宽度,默认为0.8 
bottom:用于绘制堆叠条形图 
color:指定条形图的填充色 
edgecolor:指定条形图的边框色 
tick_label:指定条形图的刻度标签 
label:指定条形图的标签,一般用以添加图例

案例

调用模块

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

读取数据

GDP=pd.read_excel(r'P.xlsx')
GDP

 

绘制图形

# 解决乱码
plt.rcParams['font.sans-serif'] = ['SimHei']
# 设置绘图风格gglot2风格
plt.style.use('ggplot')
# 绘制条形图
plt.barh(
    # 设置y轴的刻度值
    y=range(GDP.shape[0]),
    # x轴的数值    
    width = GDP.GDP,
    # 设置x轴的刻度标签
        tick_label=GDP.Province,
    # 设置填充颜色
    color='red',
        )
    # 添加y轴标签
plt.xlabel('GDP(万亿)')
    # 添加图标题
plt.title('6省GDP分布')
    # 为每个条形图加标签
for y,x in enumerate(GDP.GDP):
        plt.text(
            # 设置位置
            x,y+0.1,
            # 设置内容文本内容,y值四舍五入
            '%s'%round(x,1),
            # 文本位置居中
            va='center'
        )
plt.show()

 

交叉条图形

概念与条形图一致,使用模块也基本一致

案例与基本使用

需求:

获取每年的每个城市的富豪数

读取数据

pic=pd.read_excel('HuRun.xlsx')
pic

制作透视表

# 设置透视表,每个城市每年的富豪量
pic_num=pic.pivot_table(index='City',columns='Year',values='Counts').reset_index()
# 对数据进行降序排序
pic_num.sort_values(2016,ascending=False,inplace=True)
pic_num

 

绘图

# 绘制图
pic_num.plot(
    # 设置x轴名字
    x = 'City', 
    # 设置y轴名字
    y = [2016,2017], 
    # 设置图形样式
    kind = 'bar', 
    # 颜色
color = ['red', 'green'], 
                # 用于旋转x轴刻度标签的角度,0表示水平显示刻度标签
                   rot = 45, 
                # 图形宽度
                   width = 0.5, title = '近两年5个城市亿万资产家庭数比较')
# 加y轴标签
plt.ylabel('亿万资产家庭数')
# 显示内容
plt.show()

 

直方图

概念

主要用于观察数据分布,x轴代表数值的均匀分段,y轴代表每个段内的观测数量

方图都会与核密度图搭配使用,可以掌握数据的分布特征

语法:

plt.hist(x, 
         bins=10, 
         normed=False, 
         orientation='vertical', 
         color=None, 
         label=None)

参数:

x:指定要绘制直方图的数据。 
bins:指定直方图条形的个数。
normed:是否将直方图的频数转换成频率
orientation:设置直方图的摆放方向,默认为垂直方向 
color:设置直方图的填充色 
edgecolor:设置直方图边框色 
label:设置直方图的标签,可通过legend展示其图例

案例

需求:

查看每个年龄段的分布

调用模块

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

获取数据

dateo=pd.read_csv('titanic_train.csv')
dateo

查看数缺失状况

# 检查年龄缺失
dateo.Age.isnull().sum()
# 删除含有缺失年龄的观察
dateo.dropna(subset=['Age'], inplace=True)
# 输出结果
dateo.Age.isnull().sum()

输出为0

绘图

plt.hist(
    # 获取数据
    x=dateo.Age,
    # 指定直方图中条块的个数
    bins=30,
    # 填充色
    color='red',
    # 边框色
    edgecolor='green'
)
# 添加x轴和y轴标签
plt.xlabel('年龄')
plt.ylabel('频率')
# 标题
plt.title('年龄分布图')
# 出图
plt.show()

 

箱型图

基本知识

1、下四分位数Q1

(1)确定四分位数的位置。Qi所在位置=i(n+1)/4,其中i=1,2,3。n表示序列中包含的项数。

(2)根据位置,计算相应的四分位数。

例中:

Q1所在的位置=(14+1)/4=3.75,

Q1=0.25×第三项+0.75×第四项=0.25×17+0.75×19=18.5;

2、中位数(第二个四分位数)Q2

中位数,即一组数由小到大排列处于中间位置的数。若序列数为偶数个,该组的中位数为中间两个数的平均数。

例中:

Q2所在的位置=2(14+1)/4=7.5,

Q2=0.5×第七项+0.5×第八项=0.5×25+0.5×28=26.5

3、上四分位数Q3

计算方法同下四分位数。

例中:

Q3所在的位置=3(14+1)/4=11.25,

Q3=0.75×第十一项+0.25×第十二项=0.75×34+0.25×35=34.25。

4、上限

上限是非异常范围内的最大值。

首先要知道什么是四分位距如何计算的?

四分位距IQR=Q3-Q1,那么上限=Q3+1.5IQR

5、下限

下限是非异常范围内的最小值。

下限=Q1-1.5IQR

rot 控制x轴角度

均值是点,中位数是虚线

6、更重要的是,箱线图还可以发现数据中的异常点;

语法:

plt.boxplot(x, 
            vert=None, 
            whis=None, 
            patch_artist=None, 
            meanline=None, 
            showmeans=None, 
            showcaps=None, 
            showbox=None, 
            showfliers=None,
            boxprops=None, 
            labels=None, 
            flierprops=None, 
            medianprops=None, 
            meanprops=None, 
            capprops=None, 
            whiskerprops=None)

参数:

x:指定要绘制箱线图的数据
vert:是否需要将箱线图垂直摆放,默认垂直摆放
whis:指定上下须与上下四分位的距离,默认为1.5倍的四分位差
patch_artist:bool类型参数,是否填充箱体的颜色;默认为False
meanline:bool类型参数,是否用线的形式表示均值,默认为False
showmeans:bool类型参数,是否显示均值,默认为False
showcaps:bool类型参数,是否显示箱线图顶端和末端的两条线(即上下须),默认为True showbox:bool类型参数,是否显示箱线图的箱体,默认为True
showfliers:是否显示异常值,默认为True
boxprops:设置箱体的属性,如边框色,填充色等
labels:为箱线图添加标签,类似于图例的作用
filerprops:设置异常值的属性,如异常点的形状、大小、填充色等
medianprops:设置中位数的属性,如线的类型、粗细等
meanprops:设置均值的属性,如点的大小、颜色等
capprops:设置箱线图顶端和末端线条的属性,如颜色、粗细等
whiskerprops:设置须的属性,如颜色、粗细、线的类型等

案例

需求:

房屋单价分布

获取数据

house= pd.read_excel('sec_buildings.xlsx')
house

plt.boxplot(
    # 获取数据
    x=house.price_unit,
    # 用自定义颜色填充盒形图,默认白色填充
    patch_artist=True,
    # 以点的形式显示均值
    showmeans=True,
    #  设置箱体属性,如边框色和填充色
    boxprops={'color':'red','facecolor':'green'},
    # 设置点属性
    flierprops = {
    # 点的形状
    'marker':'o',
    # 填充色
    'markerfacecolor':'red', 
    # 点大小
    'markersize':5,
    # 边框色    
    'markeredgecolor':'yellow'},
    # 设置均值点的属性,如点的形状、填充色和点的大小
    meanprops={
    'marker':'D',
    'markerfacecolor':'indianred',
    'markersize':4},
    # 设置中位数线的属性,如线的类型和颜色
    medianprops={'linestyle':'--','color':'blue'},
    #  删除x轴的刻度标签,否则图形显示刻度标签为1
    labels=['']
)
# 加标题
plt.title('房价分布的箱线图')
# 出图
plt.show()

 

折线图

概念

对于时间序列数据而言,一般都会使用折线图反映数据背后的趋势。

通常折线图的横坐标指代日期数据,纵坐标代表某个数值型变量,当然还可以使用第三个离散变量对折线图进行分组处理;

语法:

plt.plot(x, y, 
         linestyle, 
         linewidth, 
         color,
         marker,
         markersize,
         markeredgecolor,
         markerfactcolor,
         markeredgewidth,
         label,
         alpha)

参数:

x:指定折线图的x轴数据
y:指定折线图的y轴数据
linestyle:指定折线的类型,可以是实线、虚线、点虚线、点点线等,默认为实线
linewidth:指定折线的宽度
marker:可以为折线图添加点,该参数是设置点的形状
markersize:设置点的大小
markeredgecolor:设置点的边框色
markerfactcolor:设置点的填充色
markeredgewidth:设置点的边框宽度
label:为折线图添加标签,类似于图例的作用

案例

需求:

显示每天微信文章阅读人数与人次趋势

获取数据

reads = pd.read_excel(r'wechat.xlsx')
reads

导入模块

# 导入模块,用于日期刻度的修改
import matplotlib as mpl

绘制图

plt.plot(
# x轴数据
reads.Date,
# y轴数据
reads.Counts,
# 折线类型
linestyle='-',
# 折线宽度
linewidth=3,
# 折线颜色
color='red',
# 折线图中添加圆点
marker='o',
# 点的大小
markersize='3',
# 点填充颜色
markerfacecolor='yellow',
# 点的边框色
markeredgecolor='yellow'
)
# 获取坐标值
ax=plt.gca()
# 设置日期的显示格式
date_format = mpl.dates.DateFormatter("%m-%d")
ax.xaxis.set_major_formatter(date_format) 
# 设置x轴刻度间隔
xlocator = mpl.ticker.MultipleLocator(7)
ax.xaxis.set_major_locator(xlocator)
# 添加y轴坐标
plt.ylabel('人数')
# 加标题
plt.title('人数趋势')
# 以弹框的形式显示图形,第一次没结果,第二次删除该命令运行
%matplotlib
# 出图
plt.show()

绘制第二个图

# 将该代码,放入ax=plt.gca()
# 绘制阅读人次折线图
plt.plot(
reads.Date,  # x轴数据
reads.Times,  # y轴数据
linestyle = '--',  # 折线类型,虚线
color = 'black',  # 折线颜色
label = '阅读人次' # 出标题
)
......
# 此代码加在plt.show()之前
# 为了避免x轴刻度标签的紧凑,将刻度标签旋转45度
plt.xticks(rotation=45)
# 加图列
plt.legend()

 

散点图和气泡图

概念

散点图:

如果需要研究两个数值型变量之间是否存在某种关系,例如正向的线性关系,或者是趋势性的非线性关系,那么散点图将是最佳的选择;

气泡图:

气泡图的实质就是通过第三个数值型变量控制每个散点的大小,点越大,代表的第三维数值越高,反之亦然;

气泡图的绘制,使用的仍然是scatter函数,区别在于函数的s参数被赋予了具体的数值型变量;

语法:

scatter(x, y, s=20, c=None, marker='o', alpha=None, linewidths=None, edgecolors=None)

参数

x:指定散点图的x轴数据
y:指定散点图的y轴数据
s:指定散点图点的大小,默认为20,通过传入其他数值型变量,可以实现气泡图的绘制
c:指定散点图点的颜色,默认为蓝色,也可以传递其他数值型变量,通过cmap参数的色阶表示数值大小
marker:指定散点图点的形状,默认为空心圆
alpha:设置散点的透明度
linewidths:设置散点边界线的宽度
edgecolors:设置散点边界线的颜色

案例

需求:

输出鸢尾花的花瓣宽度与长度关系

获取数据

flower=pd.read_csv(r'iris.csv')
flower

 绘制图

plt.scatter(x = flower.Petal_Width, # 指定散点图的x轴数据
            y = flower.Petal_Length, # 指定散点图的y轴数据
            color = 'green' # 指定散点图中点的颜色
           )
# 添加x轴和y轴标签
plt.xlabel('花瓣宽度')
plt.ylabel('花瓣长度')
# 加标题
plt.title('鸢尾花的花瓣宽度与长度关系')
# 出图
plt.show()

 

热力图

概念

热力图也称为交叉填充表,图形最典型的用法就是实现列联表的可视化,即通过图形的方式展现两个离散变量之间的组合关系;

语法:

# matplotlib绘制热力图不太方便需要借助于seaborn模块
sns.heatmap(data, 
            cmap=None, 
            annot=None,
            fmt='.2g',
            annot_kws=None,
            linewidths=0,
            linecolor ='white')

参数

data:指定绘制热力图的数据集
cmap:指定一个colormap对象,用于热力图的填充色
annot:指定一个bool类型的值或与data参数形状一样的数组,如果为True,就在热力图的每个单元上显示数值
fmt:指定单元格中数据的显示格式
annot_kws:有关单元格中数值标签的其他属性描述,如颜色、大小等
linewidths:指定每个单元格的边框宽度
linecolor:指定每个单元格的边框颜色

案例

需求:

每年各月份销售总额热力图

调用模块

import numpy as np
import seaborn as sns

获取数据

info = pd.read_excel(r'Sales.xlsx')
info

数据处理

#  新增列,获取年份
info['yaer']=info.Date.dt.year
#  新增列,获取月份
info['month'] = info.Date.dt.month
info

 

数据出现错误,进行修改

# 删除列yaer
info.drop(['yaer'],axis=1)
# 新增列,year
info['year']=info.Date.dt.year

 

准备数据

# 统计每年各月份的销售总额(绘制热力图之前,必须将数据转换为交叉表形式)
infoo = info.pivot_table(
    # year为索引标签
    index = 'year', 
    # month为列
    columns = 'month', 
    # 值为Sales
    values = 'Sales', 
    # 处理方式为总和
    aggfunc = np.sum)
infoo

 

绘制图

sns.heatmap(data= infoo,  # 指定绘图数据
            cmap = 'PuOr',  # 指定填充色
            linewidths = 3,  # 设置每个单元格边框的宽度
            annot = True,  # 显示数值
            fmt = '.1e' # 以科学计算法显示数据
            )
# 加标题
plt.title('每年各月份销售总额热力图')
# 显示图形
plt.show()

 

组合图的绘制

存在的原因

工作中往往会根据业务需求,将绘制的多个图形组合到一个大图框内,形成类似仪表板的效果;

语法:

plt.subplot2grid(shape, loc, rowspan=1, colspan=1, **kwargs)

参数:

shape:指定组合图的框架形状,以元组形式传递,如2×3的矩阵可以表示成(2,3)
loc:指定子图所在的位置,如shape中第一行第一列可以表示成(0,0)
rowspan:指定某个子图需要跨几行
colspan:指定某个子图需要跨几列

案例:

需求:

六个图

排版设置

"""
# 设置大图框的长和高 plt.figure(figsize = (15,9))
# 设置第一个子图的布局
ax1 = plt.subplot2grid(shape = (2,3), loc = (0,0))
# 设置第二个子图的布局
ax2 = plt.subplot2grid(shape = (2,3), loc = (0,1))
# 设置第三个子图的布局
ax3 = plt.subplot2grid(shape = (2,3), loc = (0,2), rowspan = 2)
# 设置第四个子图的布局
ax4 = plt.subplot2grid(shape = (2,3), loc = (1,0), colspan = 2)
# 设置第五个子图的布局
ax4 = plt.subplot2grid(shape = (2,3), loc = (2,0), colspan = 2)
# 设置第六个子图的布局
ax4 = plt.subplot2grid(shape = (2,3), loc = (0,3), rowspan = 2)
"""

获取数据

Tra = pd.read_excel(r'Prod_Trade.xlsx')
# 衍生出交易年份和月份字段
Tra['year'] = Prod_Trade.Date.dt.year
Tra['month'] = Prod_Trade.Date.dt.month
Tra

绘图

# 设置大图框的长和高
plt.figure(figsize = (15,9))
# 设置第一个子图的布局
ax1 = plt.subplot2grid(shape = (2,3), loc = (0,0))
# 统计2011年各订单等级的数量
Class_Counts = Tra.Order_Class[Tra.year == 2011].value_counts()
Class_Percent = Class_Counts/Class_Counts.sum()
print(Class_Counts,Class_Percent)

# 绘制订单等级饼图
ax1,pie(x=Class_Percent.values, labels = Class_Percent.index, autopct = '%.1f%%')
# 加标题
ax1.set_title('各等级订单比例')

完整代码:

# 设置大图框的长和高
plt.figure(figsize = (15,9))
# 设置第一个子图的布局
ax1 = plt.subplot2grid(shape = (2,3), loc = (0,0))
# 统计2011年各订单等级的数量
Class_Counts = Tra.Order_Class[Tra.year == 2011].value_counts()
Class_Percent = Class_Counts/Class_Counts.sum()
print(Class_Counts,Class_Percent)
# 绘制订单等级饼图
ax1.pie(x=Class_Percent.values, labels = Class_Percent.index, autopct = '%.1f%%')
# 加标题
ax1.set_title('各等级订单比例')
# 设置第二个子图的布局
ax2 = plt.subplot2grid(shape = (2,3), loc = (0,1))
sns.heatmap(data= infoo,  # 指定绘图数据
            cmap = 'PuOr',  # 指定填充色
            linewidths = 3,  # 设置每个单元格边框的宽度
            annot = True,  # 显示数值
            fmt = '.1e', # 以科学计算法显示数据
            ax=ax2
            )
# 加标题
ax2.set_title('每年各月份销售总额热力图')
# 设置第三个子图的布局
ax3 = plt.subplot2grid(shape = (2,3), loc = (0,2))
ax3.plot(
# x轴数据
reads.Date,
# y轴数据
reads.Counts,
# 折线类型
linestyle='-',
# 折线宽度
linewidth=3,
# 折线颜色
color='red',
# 折线图中添加圆点
marker='o',
# 点的大小
markersize='3',
# 点填充颜色
markerfacecolor='yellow',
# 点的边框色
markeredgecolor='yellow',
)
# 设置日期的显示格式
date_format = mpl.dates.DateFormatter("%m-%d")
ax3.xaxis.set_major_formatter(date_format) 
# 设置x轴刻度间隔
xlocator = mpl.ticker.MultipleLocator(7)
ax3.xaxis.set_major_locator(xlocator)
# 添加y轴坐标
ax3.set_ylabel('人数')
# 加标题
ax3.set_title('人数趋势与人数')
# 设置第四个子图的布局
ax4 = plt.subplot2grid(shape = (2,3), loc = (1,0))
# 绘制条形图
ax4.barh(
    # 设置y轴的刻度值
    y=range(GDP.shape[0]),
    # x轴的数值    
    width = GDP.GDP,
    # 设置x轴的刻度标签
        tick_label=GDP.Province,
    # 设置填充颜色
    color='red',
        )
    # 添加y轴标签
ax4.set_xlabel('GDP(万亿)')
    # 添加图标题
ax4.set_title('6省GDP分布')
    # 为每个条形图加标签
for y,x in enumerate(GDP.GDP):
        ax4.text(
            # 设置位置
            x,y+0.1,
            # 设置内容文本内容,y值四舍五入
            '%s'%round(x,1),
            # 文本位置居中
            va='center'
        )
        
# 设置第五个子图的布局
ax5 = plt.subplot2grid(shape = (2,3), loc = (1,2))
# 设置透视表,每个城市每年的富豪量
pic_num=pic.pivot_table(index='City',columns='Year',values='Counts').reset_index()
# 对数据进行降序排序
pic_num.sort_values(2016,ascending=False,inplace=True)
pic_num
# 绘制图
pic_num.plot(
    # 设置x轴名字
    x = 'City', 
    # 设置y轴名字
    y = [2016,2017], 
    # 设置图形样式
    kind = 'bar', 
    # 颜色
color = ['red', 'green'], 
                # 用于旋转x轴刻度标签的角度,0表示水平显示刻度标签
                   rot = 45, 
                # 图形宽度
                   width = 0.5, title = '近两年5个城市亿万资产家庭数比较',
ax=ax5
)
# 加y轴标签
ax5.set_ylabel('亿万资产家庭数')
# 设置第六个子图的布局
ax6 = plt.subplot2grid(shape = (2,3), loc = (1,1))
ax6.boxplot(
    # 获取数据
    x=house.price_unit,
    # 用自定义颜色填充盒形图,默认白色填充
    patch_artist=True,
    # 以点的形式显示均值
    showmeans=True,
    #  设置箱体属性,如边框色和填充色
    boxprops={'color':'red','facecolor':'green'},
    # 设置点属性
    flierprops = {
    # 点的形状
    'marker':'o',
    # 填充色
    'markerfacecolor':'red', 
    # 点大小
    'markersize':5,
    # 边框色    
    'markeredgecolor':'yellow'},
    # 设置均值点的属性,如点的形状、填充色和点的大小
    meanprops={
    'marker':'D',
    'markerfacecolor':'indianred',
    'markersize':4},
    # 设置中位数线的属性,如线的类型和颜色
    medianprops={'linestyle':'--','color':'blue'},
    #  删除x轴的刻度标签,否则图形显示刻度标签为1
    labels=['']
)
# 加标题
ax6.set_title('房价分布的箱线图')

# 调整子图之间的水平间距和高度间距
plt.subplots_adjust(hspace=0.6, wspace=0.3)
# 图形显示
plt.show()

 

可视化模块扩展

1.matplotlib

网址:https://matplotlib.org/

2.seaborn

网址:http://seaborn.pydata.org/

3.higcharts

网址:https://www.highcharts.com.cn/

4.echarts

网址:https://echarts.apache.org/zh/index.html

pyecharts  # 可以通过python代码直接调用

5.ds.js

网址:http://www.dsjs.org.cn/

返回目录

posted @ 2021-10-19 23:03  微纯册  阅读(144)  评论(0编辑  收藏  举报