Python数据可视化工具——Matplotlib

1 基础准备

1.1简介

Matplotlib是Python最著名的绘图库,它提供了一套和matlab相似的命令API,十分适合交互式地进行绘图,而且可以方便地将它作为绘图控件,嵌入GUI应用程序中。
官方文档:https://matplotlib.org/

1.2安装

pip install matplotlib   # 使用pip包管理器安装

1.3 绘图基础知识

  • figure,画纸Sublpot画质,可多图绘画
  • title,标题,用来给图形起名字
  • Axis,坐标轴.横轴叫x坐标轴(xlabel),纵轴叫y坐标轴(ylabel)
  • Legend,图例,代表图形里的内容
  • Grid,网格,图形中的虚线,True显示网格
  • Markers,点 ,表示点的形状。

1.4 查询matplotlib系统中文字体

# 查询matplotlib系统中文字体
from matplotlib.font_manager import fontManager
import os
 #fontManager 是一个字体管理器对象,ttflist 是该对象的一个属性,表示已安装的字体列表。
 #st_size>1e6:选出文件大小大于1MB(1e6字节)的字体文件
fonts = [font.name for font in fontManager.ttflist if 
         os.path.exists(font.fname) and os.stat(font.fname).st_size>1e6] 
 
for font in fonts:
    print(font)

在这里插入图片描述

2 绘图流程

在这里插入图片描述

2.1 简单绘图

简单绘图可以不创建绘图对象直接调用plot函数绘图,会自动创建一个绘图对象

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['axes.unicode_minus'] = False   #解决坐标轴刻度负号乱码
plt.rcParams['font.sans-serif'] = ['Simhei']  #设置中文显示,字体为黑体

#绘制一个y=x^2曲线
x =np.arange(1,100,0.25)
plt.plot(x,x**2) #划线,连线
plt.show()  #显示

在这里插入图片描述

2.2 标准绘图

#绘图数据
x = np.linspace(-2,10,100)#等差数组
y = np.sin(x)
z = np.cos(x)

#绘图设置
plt.figure(figsize=(6,4),dpi = 100) #设置画布,figsize=(6,4)画布尺寸:宽度和高度,dpi 每英寸像素
plt.title("正弦", color = 'r', fontsize = 20, rotation = 0, alpha = 1) #添加标题,rotation角度
plt.xlabel("x",fontsize = 15,color = 'r',rotation = 0 ) #添加x轴名称
plt.ylabel("y")#设置y轴名称
plt.xlim(-2,11) #显示出来的x轴的取值范围
plt.ylim(-1.5,1.5)
# plt.xticks([]) #不显示刻度
plt.xticks(np.arange(-2,12,2),fontsize = 15,rotation = -30) #规定x轴刻度
plt.yticks([-1.5,-1,-0.5,0,0.5,1,1.5]) #规定y轴刻度


#绘图
plt.plot(x,y,color = 'red',linewidth = 2,label = "$sin(x)$")  #划线,latex形式(论文公式形式)
plt.plot(x,z,'m--',label = "$cos(x^2)$")

#plt.legend(["$sin(x)$","$cos(x^2)$"],loc=3) #若是前面绘图时,label中没有信息,可以将图例信息写到列表中,注意顺序
plt.legend(loc=3) #显示图例,设置图例位置
plt.savefig("one.jpg",dpi = 500,bbox_inches = "tight") #保存
plt.show()  #显示

在这里插入图片描述

2.3 绘制子图

  • 一个绘图对象可以包含多个轴,在Matplotlib中用轴表示一个绘图区域,可以将其理解为子图。
  • 可以调用fig对象的add_subplot方法和plt.subplot()绘制有多个轴的图表
    add_subplo方法:
    将整个绘图区域等分为设定好的行和列个子区域,从左到右,从上到下的顺序对每个子区域进行编号,左上的子区域编号为1。如果numRows,numCols和plotNum这三个数都小于10的话,可以将它们缩写为一个整数,例如add_subplot(232)和add_subplot(2,3,2)是相同的。add_subplot在plotNum指定的区域中创建一个轴对象。如果新创建的轴和之前创建的轴重叠的话,之前的轴将被删除。

2.3.1 add_subplot方法

两行一列子图 plt1.add_subplot(2,1,*)
#绘图数据
x = np.linspace(-2,10,100)#等差数组
y = np.sin(x)
z = np.cos(x)

#绘图设置
p1 = plt.figure(figsize=(6,4),dpi = 100) #设置画布,figsize=(6,4)画布尺寸:宽度和高度,dpi 每英寸像素

#通过画布对象调用添加子图的方法
#第一幅子图
p1.add_subplot(2,1,1)  #创建一个2行1列的子图,并开始绘制第一个子图
plt.title("正弦") #添加标题,rotation角度
plt.xlabel("x") #添加x轴名称
plt.ylabel("y")#设置y轴名称
plt.xlim(-2,11) #显示出来的x轴的取值范围
plt.ylim(-1.5,1.5)
plt.xticks(np.arange(-2,12,2),fontsize = 15,rotation = -30) #规定x轴刻度
plt.yticks([-1.5,-1,-0.5,0,0.5,1,1.5]) #规定y轴刻度
plt.plot(x,y,label = "$sin(x)$",color = 'red',linewidth = 2)  #划线,latex形式
plt.legend(loc='lower left')  #显示图例

plt.subplots_adjust(wspace = 0,hspace = 0.5) #调整子图之间的距离

#第二幅子图
p1.add_subplot(2,1,2)  #创建一个2行1列的子图,并开始绘制第2个子图
plt.title("余弦") #添加标题,rotation角度
plt.xlabel("x") #添加x轴名称
plt.ylabel("y")#设置y轴名称
plt.xlim(-2,11) #显示出来的x轴的取值范围
plt.ylim(-1.5,1.5)
plt.xticks(np.arange(-2,12,2),fontsize = 15) #规定x轴刻度
plt.yticks([-1.5,-1,-0.5,0,0.5,1,1.5]) #规定y轴刻度
plt.plot(x,z,'m--',label = "$cos(x)$",linewidth = 2)  #划线,latex形式
plt.legend(loc='lower left')  #显示图例

plt.show()

在这里插入图片描述

一行两列子图 plt1.add_subplot(1,2,*)
#绘图数据
x = np.linspace(-2,10,1000)#等差数组
y = np.sin(x)
z = np.cos(x)

#绘图设置
p1 = plt.figure(figsize=(6,4),dpi = 100) #设置画布,figsize=(6,4)画布尺寸:宽度和高度,dpi 每英寸像素
p1.add_subplot(1,2,1)  #创建一个2行1列的子图,并开始绘制第一个子图
plt.title("PyPlot First Example 正弦") #添加标题,rotation角度
plt.xlabel("x") #添加x轴名称
plt.ylabel("y")#设置y轴名称
plt.xlim(0,11) #显示出来的x轴的取值范围
plt.ylim(-1.5,1.5)
plt.xticks(np.arange(0,12,2),fontsize = 15) #规定x轴刻度
plt.yticks([-1.5,-1,-0.5,0,0.5,1,1.5]) #规定y轴刻度
plt.plot(x,y,label = "$sin(x)$",color = 'red',linewidth = 2)  #划线,latex形式
plt.legend(loc='lower left')  #显示图例

plt.subplots_adjust(wspace = 1,hspace = 0) #调整子图之间的距离

p1.add_subplot(1,2,2)  #创建一个1行2列的子图,并开始绘制第2个子图
plt.title("PyPlot Second Example 余弦") #添加标题,rotation角度
plt.xlabel("x") #添加x轴名称
plt.ylabel("y")#设置y轴名称
plt.xlim(-2,11) #显示出来的x轴的取值范围
plt.ylim(-1.5,1.5)
plt.xticks(np.arange(-2,12,2),fontsize = 15) #规定x轴刻度
plt.yticks([-1.5,-1,-0.5,0,0.5,1,1.5]) #规定y轴刻度
plt.plot(x,z,'m--',label = "$cos(x)$",linewidth = 2)  #划线,latex形式
plt.legend(loc='lower left')  #显示图例

plt.show()

在这里插入图片描述

2.3.2 plt.subplot()方法

将上述语句中的 p1.add_subplot(1,2,1) 改为 plt.subplot(1,2,1)

#绘图数据
x = np.linspace(-2,10,1000)#等差数组
y = np.sin(x)
z = np.cos(x)

#绘图设置
p1 = plt.figure(figsize=(6,4),dpi = 100) #设置画布,figsize=(6,4)画布尺寸:宽度和高度,dpi 每英寸像素
plt.subplot(1,2,1)  #创建一个2行1列的子图,并开始绘制第一个子图     ———————————————————————————————————————————变化的地方
plt.title("PyPlot First Example 正弦") #添加标题,rotation角度
plt.xlabel("x") #添加x轴名称
plt.ylabel("y")#设置y轴名称
plt.xlim(0,11) #显示出来的x轴的取值范围
plt.ylim(-1.5,1.5)
plt.xticks(np.arange(0,12,2),fontsize = 15) #规定x轴刻度
plt.yticks([-1.5,-1,-0.5,0,0.5,1,1.5]) #规定y轴刻度
plt.plot(x,y,label = "$sin(x)$",color = 'red',linewidth = 2)  #划线,latex形式
plt.legend(loc='lower left')  #显示图例


plt.subplots_adjust(wspace = 1,hspace = 0) #调整子图之间的距离



plt.subplot(1,2,2)  #创建一个1行2列的子图,并开始绘制第2个子图       ———————————————————————————————————————————变化的地方
plt.title("PyPlot Second Example 余弦") #添加标题,rotation角度
plt.xlabel("x") #添加x轴名称
plt.ylabel("y")#设置y轴名称
plt.xlim(-2,11) #显示出来的x轴的取值范围
plt.ylim(-1.5,1.5)
plt.xticks(np.arange(-2,12,2),fontsize = 15) #规定x轴刻度
plt.yticks([-1.5,-1,-0.5,0,0.5,1,1.5]) #规定y轴刻度
plt.plot(x,z,'m--',label = "$cos(x)$",linewidth = 2)  #划线,latex形式
plt.legend(loc='lower left')  #显示图例

plt.show()

在这里插入图片描述

2.4 添加文字说明或注释

plt.annotate 中 xy 点坐标,xytext 注释坐标,arrowprops 箭头形状

#绘图数据
x = np.linspace(0,10,1000)#等差数组
y = np.sin(x)
z = np.cos(x)

#绘图设置
plt.figure(figsize=(8,4),dpi = 100) #设置画布,figsize=(8,4)画布尺寸:宽度和高度,分辨率100*8
plt.title("正弦") #添加标题,rotation角度
plt.xlabel("x") #添加x轴名称
plt.ylabel("y")#设置y轴名称
plt.xlim(-1,11) #显示出来的x轴的取值范围
plt.ylim(-1.2,1.2)
plt.xticks([0,2,4,6,8,10]) #规定x轴刻度
plt.yticks([-1.5,-1,-0.5,0,0.5,1,1.5]) #规定y轴刻度
plt.plot(x,y,label = "$sin(x)$",color = 'red',linewidth = 2)  #划线,latex形式
plt.plot(x,z,'b--',label = "$cos(x)$")
plt.legend(loc='lower left')  #显示图例

plt.text(0,0,'零点',color = 'b',fontsize = 10,rotation = 0) #增加文字说明
plt.annotate('最大值',color = 'r',xy = (1.5,1),xytext = (2,1.5),arrowprops = dict(facecolor = 'r',edgecolor = 'b',width = 1,shrink = 0.02,headlength = 10))
plt.show()

在这里插入图片描述

3 常用图表

这里只讲解部分参数,全部参数含义及使用办法
可参考菜鸟教程https://www.runoob.com/matplotlib/matplotlib-tutorial.html

3.1 散点图

matplotlib.pyplot.scatter(x, y, marker=None, c=None, s=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, *, edgecolors=None, plotnonfinite=False, data=None, **kwargs)

参数说明:
x,y:长度相同的数组,也就是我们即将绘制散点图的数据点,输入数据。
marker:点的样式,默认小圆圈 ‘o’。
c:点的颜色,默认蓝色 ‘b’,也可以是个 RGB 或 RGBA 二维行数组。
s:点的大小,默认 20,也可以是个数组,数组每个参数为对应点的大小。
alpha::透明度设置,0-1 之间,默认 None,即不透明。
edgecolors::颜色或颜色序列,默认为 ‘face’,可选值有 ‘face’, ‘none’, None
#绘图数据
x = np.linspace(0,10,100)#等差数组
y = np.sin(x)

#绘图设置
plt.figure(figsize=(8,4),dpi = 100) #设置画布,figsize=(6,4)画布尺寸:宽度和高度,分辨率100*8
plt.title("正弦") #添加标题,rotation角度
plt.xlabel("x") #添加x轴名称
plt.ylabel("y")#设置y轴名称
plt.xlim(-1,11) #显示出来的x轴的取值范围
plt.ylim(-1.2,1.2)
plt.xticks([0,2,4,6,8,10]) #规定x轴刻度
plt.yticks([-1.5,-1,-0.5,0,0.5,1,1.5]) #规定y轴刻度
plt.scatter(x,y,color = 'red',marker = '+',s = 30)  #散点
plt.show()   #显示

在这里插入图片描述

3.2 饼图

matplotlib.pyplot.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=None, radius=None, counterclock=True, wedgeprops=None, textprops=None, center=(0, 0), frame=False, rotatelabels=False, hold=None, data=None)

参数说明:

x:浮点型数组,表示每个扇形的面积。
explode:数组,表示各个扇形之间的间隔,默认值为0。
labels:列表,各个扇形的标签,默认值为 None。
colors:数组,表示各个扇形的颜色,默认值为 None。
autopct:设置饼图内各个扇形百分比显示格式,%d%% 整数百分比,%0.1f 一位小数, %0.1f%% 一位小数百分比, %0.2f%% 两位小数百分比。
textprops :字典类型,默认值为:None。传递给 text 对象的字典参数,用于设置标签(labels)和比例文字的格式。
shadow::布尔值 TrueFalse,设置饼图的阴影,默认为 False,不设置阴影。
plt.figure(figsize=(6,6))
plt.pie(df_mean.loc["第10小学","语文":"英语"]
       ,labels=["语文","数学","英语"]   #各个扇形的标签
       ,autopct="%.2f%%"      #设置饼图内各个扇形百分比显示格式
       ,shadow=True            #设置饼图的阴影
       ,explode=[0.02,0.02,0.05] #各扇形之间的间隔
       , colors = ['r','y','b']  #各扇形的颜色
       ,textprops={'fontsize':14}#设置饼图上字体的大小
       )
plt.title("第十小学学科成绩占比",fontsize=17);
#tilte\label\tickts,有字体大小的参数
plt.show()

在这里插入图片描述

3.3 柱状图

matplotlib.pyplot.bar(x, height, width=0.8, bottom=None, *, align='center', color=None,edgecolor = None, **kwargs)
参数说明:
x:浮点型数组,柱形图的 x 轴数据,可以是一个标量或一个数组。
height:浮点型数组,柱形图的高度,可以是一个标量或一个数组。
width:浮点型数组,柱形图的宽度。
bottom:浮点型数组,底座的 y 坐标,默认 0。
align:柱形图与 x 坐标的对齐方式,‘center’ 以 x 位置为中心,这是默认值。 ‘edge’:将柱形图的左边缘与 x 位置对齐。要对齐右边缘的条形,可以传递负数的宽度值及 align=‘edge’。
color:表示柱的填充颜色,可以是一个颜色名称(如 ‘red’、‘blue’)或一个颜色列表。
edgecolor: 边框颜色。
**kwargs::其他参数。

plt.figure(figsize = (6,6),dpi = 100)
X = ['USA','China','India','Japan','Germany']
Y= [15094025,11999967,12399976,4443211,3456789]
plt.bar(X,Y,color = "pink",width = 0.5)
plt.title("测试")
plt.xlabel('counter')
plt.ylabel('GDP')
plt.show()

在这里插入图片描述

3.4 条形图

条形图用长条形表示每一个类别,长条形的长度表示类别的频数,宽度表示类别
在这里插入图片描述

3.5 直方图

直方图是一种统计报告图,形式上也是一个个的长条形,但是直方图用长条形的面积表示频数或者概率,宽度表示组距,高度表示频数/组距。当宽度相同时,一般就用长条形长度表示频数。

matplotlib.pyplot.hist(x, bins=None, range=None, density=False, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False, **kwargs)

参数说明:
x:表示要绘制直方图的数据,可以是一个一维数组或列表。
bins:可选参数,表示直方图的箱数。默认为10。
density:可选参数,表示是否将直方图归一化。默认为False,即直方图的高度为每个箱子内的样本数,而不是频率或概率密度。
color:可选参数,表示直方图的颜色。

条形图与直方图区别

区别直方图条形图
横轴数据连续的,是一个范围孤立的,是一个类别
长条形之间没有空隙有空隙
横轴数据一般用长条形面积表示,当宽度相同时用长度表示长条形的长度
plt.figure(figsize = (6,4),dpi = 100)
data = np.random.randn(1000) #随机生成(1000,),服从正态分布的数据
plt.hist(data,bins= 100,density = False,facecolor = "blue",color = "black",alpha = 0.7)
plt.xlabel("区间")
plt.ylabel("频率")
plt.title("直方图")
plt.show()

在这里插入图片描述

在这里插入图片描述

3.6 箱线图

用于显示一组数据分散情况的统计图
由上边缘、下边缘、中位数、上四分位数、下四分位数、异常值构成;
在这里插入图片描述

data = np.random.randn(1000)
plt.boxplot(data,1,'r*',1)  #第一个表示中间是否打开,第二个1表示是横向还是竖向箱线图
plt.show()

在这里插入图片描述

  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值