数据分析之matplotlib详解

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_44205272/article/details/102509441

matplotlib介绍

Matplotlib 是 Python 的绘图库。 它可与 NumPy 一起使用,提供了一种有效的 MatLab 开源替代方案。 它也可以和图形工具包一起使用,如 PyQt 和 wxPython

matplotlib安装

pip3 install matplotlib

绘制常用图表

一.折线图

表示随着时间的推移某指标的变化趋势

参数详解

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

  • x:横坐标数据
  • y:纵坐标数据
  • linestyle:线条样式(’-’ , ‘.’ , ‘-.’ , ‘–’ 等)
  • linewidth:线条宽度
  • marker:节点样式('o’圈标记 , '.'点标记 , 'v’下三角 , '^'上三角 , 's’正方形等)
  • markersize:节点大小
  • markeredgecolor:标记外边颜色
  • markeredgewidth:标记外边线宽
  • markerfacecolor:标记填充颜色
  • label:图例名称
代码示例
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('ggplot')    # 使用自带的样式进行美化
# print(plt.style.available)   # 打印出所有的样式
# 下面两行代码用于显示中文
plt.rcParams['font.sans-serif']="Microsoft YaHei"
plt.rcParams['axes.unicode_minus']=False

plt.subplot(1, 1, 1)  # 创建一张图
x = np.array([1,2,3,4,5,6,7,8,9])
y = np.array([866,2335,5710,6482,6120,1605,3813,4428,4631])

plt.plot(x,y,color='k',linestyle='-.',linewidth=1,marker='o',markersize=5,label="注册用户数")
for a,b in zip(x,y):
    plt.text(a,b,b,ha='center',va='bottom',fontsize=11,color='k')
plt.title("XXX公司1-9月注册用户数",color='k')
plt.grid(True)  #设置网格线
plt.legend()  #设置图例

在这里插入图片描述

二.柱形图

比较不同类别之间的数据情况

参数详解

plt.bar(x,height,width=0.8,bottom=None,align=‘center’,color,edgecolor)

  • x:在什么位置显示柱形图;
  • height:每根柱子的高度;
  • width:每根柱子的宽度,可以一样,也可以各不相同;
  • bottom:每根柱子底部位置,可以一样,也可以各不相同;
  • align:柱子的位置与x值的关系,有center、edge可选;
  • color:柱子颜色;
  • edgecolor:柱子边框颜色。
代码示例
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('ggplot')    # 使用自带的样式进行美化
# print(plt.style.available)   # 打印出所有的样式
# 下面两行代码用于显示中文
plt.rcParams['font.sans-serif']="Microsoft YaHei"
plt.rcParams['axes.unicode_minus']=False

plt.subplot(111)
x = np.array(["东区","北区","南区","西区"])
y = np.array([8566,6482,5335,7310])

plt.bar(x,y,width=0.5,align='center',label="任务量",color='b')
plt.title("全国各分区任务量",color='k')
for a,b in zip(x,y):
    plt.text(a,b,b,ha='center',va='bottom',fontsize=11,color='k')
plt.xlabel('分区')
plt.ylabel('任务量')
plt.legend()

在这里插入图片描述

三.簇状柱形图

用来表示不同类别随着同一变量的变化情况

代码示例
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('ggplot')    # 使用自带的样式进行美化
# print(plt.style.available)   # 打印出所有的样式
# 下面两行代码用于显示中文
plt.rcParams['font.sans-serif']="Microsoft YaHei"
plt.rcParams['axes.unicode_minus']=False

plt.subplot(111)
x = np.array([1,2,3,4])
y1 = np.array([8566,5335,7310,6482])
y2 = np.array([4283,2667,3655,3241])

plt.bar(x,y1,width=0.3,label="任务量")
plt.bar(x+0.3,y2,width=0.3,label="完成量",color='b')  #x+0.3相当于把完成量的每个柱子右移0.3
plt.title("全国各分区任务量和完成量",color='k')
for a,b in zip(x,y1):
    plt.text(a,b,b,ha='center',va='bottom',fontsize=11,color='k')
for a,b in zip(x+0.3,y2):
    plt.text(a,b,b,ha='center',va='bottom',fontsize=11,color='k')
plt.xlabel('区域')
plt.ylabel('任务情况')
plt.xticks(x+0.15,["东区","南区","西区","北区"])
plt.grid(False)
plt.legend(ncol=2)

在这里插入图片描述

四.堆积柱形图

用来比较同类别各变量和不同类别变量的总和趋势,只要在相同的x位置绘制不同的y,y就会自动叠加

代码示例
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('ggplot')    # 使用自带的样式进行美化
# print(plt.style.available)   # 打印出所有的样式
# 下面两行代码用于显示中文
plt.rcParams['font.sans-serif']="Microsoft YaHei"
plt.rcParams['axes.unicode_minus']=False

plt.subplot(111)
x = np.array(["东区","北区","南区","西区"])
y1 = np.array([8566,5335,7310,6482])
y2 = np.array([4283,2667,3655,3241])

plt.bar(x,y1,width=0.3,label="任务量")
plt.bar(x,y2,width=0.3,label="完成量",color='b')
plt.title("全国各分区任务量和完成量",color='k')
for a,b in zip(x,y1):
    plt.text(a,b,b,ha='center',va='bottom',fontsize=11,color='k')
for a,b in zip(x,y2):
    plt.text(a,b,b,ha='center',va='top',fontsize=11,color='k')
plt.xlabel('区域')
plt.ylabel('任务情况')
plt.grid(False)
plt.legend(ncol=2,loc='upper center')

在这里插入图片描述

五.条形图

与柱形图类似,只是对柱形图的x轴和y轴进行了调换

参数详解

plt.barh(y,width,height,align,color,edgecolor)

  • y:纵坐标
  • width:横向宽度,即横坐标
  • height:纵向高度,即柱子的实际宽度
  • align:柱子对齐方式
  • color:柱子颜色
  • edgecolor:柱子边缘颜色
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('ggplot')    # 使用自带的样式进行美化
# print(plt.style.available)   # 打印出所有的样式
# 下面两行代码用于显示中文
plt.rcParams['font.sans-serif']="Microsoft YaHei"
plt.rcParams['axes.unicode_minus']=False

plt.subplot(111)
x = np.array(["东区","北区","南区","西区"])
y = np.array([8566,5335,7310,6482])

plt.barh(x,height=0.5,width=y,align="center")
plt.title("全国各分区任务量",color='k')
for a,b in zip(x,y):
    plt.text(b,a,b,ha='center',va='center',fontsize=11,color='k')
plt.ylabel('区域')
plt.xlabel('任务量')
plt.grid(False)

在这里插入图片描述

六.散点图

用来发现各变量之间的相关关系

参数详解

plt.scatter(x,y,s,c,marker,linewidths,edgecolors)

  • (x,y):散点的位置;
  • s:散点的大小。如果只有一个具体值,则所有点大小一样;如果呈现大小不一,则变成气泡图;
  • c:散点的颜色。可只有一个,也可以有多个不同颜色;
  • marker:每个点的标记;
  • inewidths:每个散点的线宽;
  • edgecolors:每个散点的外轮廓的颜色
代码示例
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('ggplot')    # 使用自带的样式进行美化
# print(plt.style.available)   # 打印出所有的样式
# 下面两行代码用于显示中文
plt.rcParams['font.sans-serif']="Microsoft YaHei"
plt.rcParams['axes.unicode_minus']=False

plt.subplot(111)
x = [5.5,6.6,8.1,15.8,19.5,22.4,28.3,28.9]
y = [2.38,3.85,4.41,5.67,5.44,6.03,8.15,6.87]

plt.scatter(x,y,marker='o',s=100)
plt.title("1-8月平均气温与啤酒销量关系图",loc='center',color='k')
plt.xlabel('平均气温')
plt.ylabel('啤酒销量')
plt.grid(False)

在这里插入图片描述

七.气泡图

与散点图类似,散点图各点大小一致,气泡图中各点大小不一致

代码示例
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('ggplot')    # 使用自带的样式进行美化
# print(plt.style.available)   # 打印出所有的样式
# 下面两行代码用于显示中文
plt.rcParams['font.sans-serif']="Microsoft YaHei"
plt.rcParams['axes.unicode_minus']=False

plt.subplot(111)
x = np.array([5.5,6.6,8.1,15.8,19.5,22.4,28.3,28.9])
y = np.array([2.38,3.85,4.41,5.67,5.44,6.03,8.15,6.87])
colors = y*10  #根据y值的大小生成不同的颜色
area = y*100  #根据y值的大小生成大小不同的形状

plt.scatter(x,y,c=colors,s=area,marker='o')
plt.title("1-8月平均气温与啤酒销量关系图",loc='center',color='k')
for a,b in zip(x,y):
    plt.text(a,b,b,ha='center',va='center',fontsize=11,color='white')
plt.xlabel('平均气温')
plt.ylabel('啤酒销量')
plt.grid(False)

在这里插入图片描述

八.面积图

参数详解

plt.stackplot(x,y,labels,colors)

  • (x,y):x/y坐标数值;
  • labels:不同系列图表的图例名;
  • colors:不同系列图表的颜色。
代码示例
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('ggplot')    # 使用自带的样式进行美化
# print(plt.style.available)   # 打印出所有的样式
# 下面两行代码用于显示中文
plt.rcParams['font.sans-serif']="Microsoft YaHei"
plt.rcParams['axes.unicode_minus']=False

plt.subplot(111)
x = np.array([1,2,3,4,5,6,7,8,9])
y1 = np.array([866,2335,5710,6482,6120,1605,3813,4428,4631])
y2 = np.array([433,1167,2855,3241,3060,802,1906,2214,2315])

labels = ["注册人数","激活人数"]
plt.stackplot(x,y1,y2,labels=labels)
plt.title("XXX公司1-9月注册与激活人数",color='k')
plt.xlabel('月份')
plt.ylabel('注册与激活人数')
plt.xticks(x,["1月","2月","3月","4月","5月","6月","7月","8月","9月"])
plt.grid(False)
plt.legend()

在这里插入图片描述

九.箱体图

用来反映一组数据的离散程度

参数详解

plt.boxplot(x,vert,widths,labels)

  • x:待绘图源数据
  • vert:箱体图方向,True纵向,False横向,默认True
  • widths:箱体图的宽度
  • label:标签
代码示例
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('ggplot')    # 使用自带的样式进行美化
# print(plt.style.available)   # 打印出所有的样式
# 下面两行代码用于显示中文
plt.rcParams['font.sans-serif']="Microsoft YaHei"
plt.rcParams['axes.unicode_minus']=False

plt.subplot(1,1,1)
y1 = np.array([866,2335,5710,6482,6120,1605,3813,4428,4631])
y2 = np.array([433,1167,2855,3241,3060,802,1906,2214,2315])
x = [y1,y2]

#绘图
labels = ["注册人数","激活人数"]
plt.boxplot(x,labels=labels,vert=True,widths=[0.2,0.5])
plt.title("XXX公司1-9月注册与激活人数",loc="center")
plt.grid(False)

在这里插入图片描述

十.饼图

常用来表示同一等级中不同类别的占比情况

参数详解

plt.pie(x,explode,labels,colors,autopct,pctdistance,shadow,labeldistance,startangle,radius,counterclock,wedgeprops,textprops,center,frame)

  • x:待绘图数据;
  • explode:每一块离圆心距离;
  • labels:每一块标签;
  • colors:每一块颜色;
  • autopct:饼图内数值的百分比格式;
  • pctdistance:数据标签距中心的距离;
  • shadow:是否有阴影;
  • labeldistance:每一块索引距中心的距离;
  • startangle:饼图的初始角度;
  • radius:饼图的半径;
  • counterclock:是否逆时针显示;
  • wedgeprops:内外边界属性;
  • textprops:文本相关属性;
  • center:中心位置;
  • frame:是否显示背后的图框。
代码示例
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('ggplot')    # 使用自带的样式进行美化
# print(plt.style.available)   # 打印出所有的样式
# 下面两行代码用于显示中文
plt.rcParams['font.sans-serif']="Microsoft YaHei"
plt.rcParams['axes.unicode_minus']=False

#饼图,建立坐标系
plt.subplot(1,1,1)

x=np.array([8566,5335,7310,6482])
labels=["东区","北区","南区","西区"]
explode=[0.1,0,0,0]   # 区域之间的间隙
labeldistance=1.1
plt.pie(x,labels=labels,explode=explode,autopct='%.0f%%',shadow=True,
       radius=1.0,labeldistance=labeldistance)
       
plt.title("全国个区域任务占比",loc="center")

在这里插入图片描述

十一.环形图

常用来表示同一层级不同类别之间的占比关系

参数详解
参数详解

plt.pie(x,explode,labels,colors,autopct,pctdistance,shadow,labeldistance,startangle,radius,counterclock,wedgeprops,textprops,center,frame)

  • x:待绘图数据;
  • explode:每一块离圆心距离;
  • labels:每一块标签;
  • colors:每一块颜色;
  • autopct:饼图内数值的百分比格式;
  • pctdistance:数据标签距中心的距离;
  • shadow:是否有阴影;
  • labeldistance:每一块索引距中心的距离;
  • startangle:饼图的初始角度;
  • radius:饼图的半径;
  • counterclock:是否逆时针显示;
  • wedgeprops:内外边界属性;
  • textprops:文本相关属性;
  • center:中心位置;
  • frame:是否显示背后的图框。
代码示例
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('ggplot')    # 使用自带的样式进行美化
# print(plt.style.available)   # 打印出所有的样式
# 下面两行代码用于显示中文
plt.rcParams['font.sans-serif']="Microsoft YaHei"
plt.rcParams['axes.unicode_minus']=False

#环形图,建立坐标系
plt.subplot(1,1,1)

#指明x值
x1=np.array([8566,5335,7310,6482])
x2=np.array([4283,2667,3655,3241])

#绘图
labels=["东区","北区","南区","西区"]
plt.pie(x1,labels=labels,radius=1.0,wedgeprops={"width":0.3,"edgecolor":"w"})
plt.pie(x2,radius=0.7,wedgeprops={"width":0.3,"edgecolor":"w"})

#添加注释
plt.annotate("完成量",xy=(0.35,0.35),xytext=(0.7,0.45),
             arrowprops={"facecolor":"black","arrowstyle":"->"})
plt.annotate("任务量",xy=(0.75,0.2),xytext=(1.1,0.2),
             arrowprops={"facecolor":"black","arrowstyle":"->"})

#设置标题
plt.title("全国各区域任务量与完成量占比",loc="center")

在这里插入图片描述

更多annotate内容

https://blog.csdn.net/TeFuirnever/article/details/88946088

十二.热力图

将某一事物的响应度反映在图表上,可以快速发现需要重点关注的区域

参数详解

plt.imshow(x,cmap)

  • x:表示待绘图的数据,需要矩阵形式;
  • cmap:配色方案,用来表明图表渐变的主题色。
代码示例
import itertools
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('ggplot')    # 使用自带的样式进行美化
# print(plt.style.available)   # 打印出所有的样式
# 下面两行代码用于显示中文
plt.rcParams['font.sans-serif']="Microsoft YaHei"
plt.rcParams['axes.unicode_minus']=False

cm = np.array([[1,0.082,0.031,-0.0086],[0.082,1,-0.063,0.062],
              [0.031,-0.09,1,0.026],[-0.0086,0.062,0.026,1]])

cmap = plt.cm.cool  #设置配色方案
plt.imshow(cm,cmap=cmap)
plt.colorbar()  #显示右边的颜色条

#设置x轴和y轴的刻度标签
classes=["负债率","信贷数量","年龄","家属数量"]
tick_marks = np.arange(len(classes))
plt.xticks(tick_marks,classes)
plt.yticks(tick_marks,classes)

#将数值显示在指定位置
for i,j  in itertools.product(range(cm.shape[0]),range(cm.shape[1])):
    plt.text(j,i,cm[i,j],ha="center")
    
plt.grid(False)  #设置网格线
plt.show()

在这里插入图片描述

十三.雷达图

用来综合评价某一事物,它可以直观地看出该事物的优势与不足。其实雷达图就是先将各点展示在极坐标系中,再用线将各点连接起来

参数详解

plt.polar(theta,r,color,marker,linewidth)

  • theta:每一点在极坐标系中的角度;
  • r:每一点在极坐标系中的半径;
  • color:连接各点之间线的颜色;
  • marker:每点的标记物;
  • linewidth:连接线的宽度
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('ggplot')    # 使用自带的样式进行美化
# print(plt.style.available)   # 打印出所有的样式
# 下面两行代码用于显示中文
plt.rcParams['font.sans-serif']="Microsoft YaHei"
plt.rcParams['axes.unicode_minus']=False

plt.subplot(1,1,1,polar = True)  #参数polar等于True表示建立一个极坐标系
dataLenth = 5  #把整个圆均分成5份
#np.linspace 表示在指定的间隔内返回均匀间隔的数字
angles = np.linspace(0,2*np.pi,dataLenth,endpoint=False)
labels = ['沟通能力','业务理解能力','逻辑思维能力','快速学习能力','工具使用能力']
data=[2,3,4,5,6]
data = np.concatenate((data,[data[0]]))   #闭合
angles = np.concatenate((angles,[angles[0]]))   #闭合
plt.polar(angles,data,color='r',marker='o')  #绘图
plt.xticks(angles,labels)  #设置x轴刻度
plt.title('某数据分析师的综合评级')

在这里插入图片描述

树形图

表示同一等级中不同类别的占比关系,使用squarify包,需要先安装pip install squarify

参数详解

squarify.plot(sizes,label,color,value,edgecolor,linewidth)

  • sizes:待绘图数据
  • label:不同类别的图例标签
  • color:不同类别的颜色
  • value:不同类别的数据标签
  • edgecolor:不同类别之间边框的颜色
  • linewidth:边框线宽
代码示例
!pip install squarify --upgrade  #更新squarify工具包
import squarify
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('ggplot')    # 使用自带的样式进行美化
# print(plt.style.available)   # 打印出所有的样式
# 下面两行代码用于显示中文
plt.rcParams['font.sans-serif']="Microsoft YaHei"
plt.rcParams['axes.unicode_minus']=False

#指定每一块的大小
size = np.array([3.4,0.693,0.585,0.570,0.562,0.531,0.530,0.524,0.501,0.478,0.468,0.436])

#指定每一块标签文字
xingzuo = np.array(["未知","摩羯座","天秤座","双鱼座","天蝎座","金牛座","处女座",
                    "双子座","射手座","狮子座","水瓶座","白羊座"])
#指定每一块数值标签
rate = np.array(["34%","6.93%","5.85%","5.70%","5.62%","5.31%","5.30%",
                "5.24%","5.01%","4.78%","4.68%","4.36%"])

#指定每一块的颜色
colors = ["steelblue","#9999ff","red","indianred","green","yellow","orange"]

#绘图
plot = squarify.plot(sizes= size,label= xingzuo,color = colors,value = rate, edgecolor = 'white',linewidth =3)

#设置标题
plt.title("菊粉星座分布",fontdict={'fontsize':12})

#去除坐标轴
plt.axis('off')

#去除上边框和右边框的刻度
plt.tick_params(top=False,right=False)

在这里插入图片描述

十五.水平线和垂直线

参数详解

plt.axhline(y,xmin,xmax) plt.axvline(x,ymin,ymax)

  • y/x:画水平/垂直线时的横/纵坐标;
  • xmin/xmax:水平线的起点和终点;
  • ymin/ymax:垂直线的起点和终点。
代码示例
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('ggplot')    # 使用自带的样式进行美化
# print(plt.style.available)   # 打印出所有的样式
# 下面两行代码用于显示中文
plt.rcParams['font.sans-serif']="Microsoft YaHei"
plt.rcParams['axes.unicode_minus']=False

plt.subplot(1,2,1)
plt.axhline(y=2,xmin=0.2,xmax=0.6)
plt.subplot(1,2,2)
plt.axvline(x=2,ymin=0.2,ymax=0.6)

在这里插入图片描述

欢迎大家的讨论与关注

猜你喜欢

转载自blog.csdn.net/qq_44205272/article/details/102509441