Python数据分析重点绘图库matplotlib,本文分享matplotlib的使用基础知识及技巧
标签: Python数据分析重点绘图库matplotlib,本文分享matplotlib的使用基础知识及技巧 JavaScript博客 51CTO博客
2023-07-20 18:24:17 137浏览
0、引言
matplotlib就是python的绘图库,一个Python 2D/3D绘图库,用以绘制一些高质量的数学二维图形。在他之上,Seaborn-使用Matplotlib的统计数据可视化,当然python还提供了其他的绘图库,每个绘图库都有自己的特色。
- matplotlib官网:
https://matplotlib.org/ - matplotlib官网例图:
https://matplotlib.org/gallery.html
使用技巧:建议优先阅读本公众号提供的几篇基础文章并对照实际操作一遍,然后打开例图网页https://matplotlib.org/gallery.html,选择需要的图片类型,点击进入复制代码,修改代码,制作自己所需风格的图即可。
1、绘图前了解matplotlib的绘图原理
figure(画布) / axes(坐标系) / axis(坐标轴):
一般来说,都会初始化一个figure(画布)对象,
但是一个figure对象中,可以根据需求来初始化多个axes对象!
每个axes其实绘制图形的时候,一般来说,都是2D,或者3D,所以也就表示有2个axis或者3个axis
绘图的基本思想,就是在一个画布中的某一个axes坐标系中,进行数据的图形绘制。
常见概念:
初步了解一下这些常用名词
- figure 画布
- axes 坐标系,一个画布上可以有多个坐标系
- axis 坐标轴,一个坐标系中可以有多个坐标轴,一般都是二维平面坐标系,或者三维立体坐标系
- title 标题
- legend 图例
- grid 背景网格
- tick 刻度
- axis label 坐标轴名称
- tick label 刻度名称 ,关于tick分为两种:
- major
- minor
- line 线
- style 线条样式
- marker 点标记
- font 字体相关
2、绘图前准备工作环境
2.1、安装
matplotlib安装
原生Python环境安装:pip install matplotlib
Anaconda环境安装:
conda install matplotlib
pycharm编辑器中安装:
在Terminal中输入:pip install matplotlib
或者:Settings->Project Interpreter中添加安装matplotlib
2.2、导入库
本文我们使用anocando的jupyter notebook 编辑代码
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt #最常用的绘图库
mpl.rcParams["font.family"]="SimHei" #使用支持的黑体中文字体
mpl.rcParams["axes.unicode_minus"]=False # 用来正常显示负数 "-"
plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签
# mpl.rcParams["font.style"]="normal" #设置标签风格,normal 常规(默认)/italic 斜体/oblique 倾斜
# mpl.rcParams["font.size"]=11 #font.size 字体的大小(默认10)
# % matplotlib inline #jupyter中用于直接嵌入图表,不用plt.show()
import warnings
warnings.filterwarnings("ignore") #用于排除警告
#用于显示使用库的版本
print("numpy_" + np.__version__)
print("pandas_" + pd.__version__)
print("matplotlib_"+ mpl.__version__)
2.3、规避中文乱码及中文字体选择的问题
matplotlib默认情况下不支持中文显示,如果需要显示中文,则我们需要做一些额外的设置操作。设置可以分为:
- 全局设置:设置一次,对所有操作生效
- 局部设置:在某一次绘图中,设置一次,只对当前这个绘图有效果
全局设置
我们可以通过执行:
mpl.rcParams["font.family"] = "SimHei" #使用支持的中文字体
mpl.rcParams["axes.unicode_minus"]=False # 用来正常显示负号 "-"
plt.rcParams['font.sans-serif']=["SimHei"] # 用来正常显示中文标签
mpl.rcParams["font.style"]="normal" #设置标签风格,normal 常规(默认)/italic 斜体/oblique 倾斜
mpl.rcParams["font.size"]=12 #font.size 字体的大小(默认10)
mpl 就是 matplotlib 的简称
控制中文显示相关的问题的。
进行设置。常用的设置如下: 操作系统必须要支持这种字体
①font.family 字体的名称
- ans-serif 西文字体(默认)
- SimHei 中文黑体
- FangSong 中文仿宋
- YouYuan 中文幼圆
- STSong 华文宋体
- Kaiti 中文楷体
- LiSu 中文隶书
②font.sans-serif 标签字体名称
- SimHei 中文黑体
- STSong 华文宋体
- ......
③axes.unicode_minus 是否使用Unicode的减号(负号)【在支持中文显示状态下,需要设置为False】
④font.style 字体的风格
- normal 常规(默认)
- italic 斜体
- oblique 倾斜
⑤font.size 字体的大小(默认10)
局部设置
在需要显式的文字中,使用fontproperties参数进行设置。
说明:如果全局设置与局部设置冲突,以局部设置为准。
font = {"family":"SimHei",
"style":"normal",
"weight":"normal",
"color":"green",
"size": 16}
plt.title("中文", fontdict=font) #显示一个中文标题
plt.show() #查看显示图片
# 在局部设置生效之后,只对当前设置 title 的时候生效!
# 那么其他的显示字符的地方都没有生效,使用全局设置!同样其他地方也是类似设置。
- weights=['ultralight', 'light', 'normal', 'regular', 'book', 'medium', 'roman', 'semibold', 'demibold', 'demi', 'bold', 'heavy', 'extra bold', 'black']
- 字体粗细=[超细的,细的,默认的,普通的,书本粗细,中等的,罗马字体的,半粗的,半粗的,半粗的,粗体的,加粗的,特别粗体的,黑色的]
3、matplotlib的绘图流程
3.1、引入库并且全局规避中文乱码问题 直接使用2.2中的代码即可,基本上是固定使 |
3.2、创建figure(画布)对象 显式创建: 语法:figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)
案例: figure = plt.figure() #创建默认的画布,白色,默认大小 figure = plt.figure(num="画布1",figsize=(8,4),dpi=80,facecolor="red",edgecolor="blue",frameon=True) plt.show() 隐式创建: 就是很多时候为了简化代码,我们没有创建figure和axes就直接绘图, 其实默认就已经给我们创建了一个figure(画布)对象,当中也创建了一个axes坐标系 如:plt.plot([1,5,2,4,3]) 其实就是在这个唯一的figure中的唯一的axes坐标系中进行绘图,plot()画折线 |
3.3、根据figure对象进行布局设置,获取对应位置的axes对象 3.3.1、显式创建figure对象的axes布局设置,平铺分布axes: 方法1: plt.figure(......) plt.subplot(......) 利用subplot可以规划figure划分为n个子图(也就是规划n个axes坐标系),但每条subplot命令只会创建一个子图。 语法:subplot(nrows,ncols,sharex,sharey,subplot_kw,**fig_kw)
案例: figure = plt.figure(num="画布1",figsize=(8,4),dpi=80,facecolor="red",edgecolor="blue",frameon=True) axes1= plt.subplot(2,2,1) axes2= plt.subplot(2,2,2) axes3= plt.subplot(2,2,3) axes4= plt.subplot(2,2,4) plt.show() #显示最终绘图效果 方法2: plt.subplots(......) axes[*,*] 案例: fig,axes=plt.subplots(2,2,num="画布1",figsize=(8,4),dpi=80,facecolor="red",edgecolor="blue",frameon=True) axes1=axes[0,0] axes2=axes[0,1] axes3=axes[1,0] axes4=axes[1,1] plt.show() #显示最终绘图效果 方法3: plt.figure(......) figure.add_subplot(......) add_subplot新增新的子图,add_subplot是面向对象figure类的api,pyplot api中没有此命令 案例: figure = plt.figure(num="画布1",figsize=(8,4),dpi=80,facecolor="red",edgecolor="blue",frameon=True) axes1=figure.add_subplot(2,2,1) axes2=figure.add_subplot(2,2,2) axes3=figure.add_subplot(2,2,3) axes4=figure.add_subplot(2,2,4) plt.show() #显示最终绘图效果 3.3.2、显式创建figure对象的axes布局设置,内嵌分布axes: 方法: plt.figure(......) figure.add_axes([left, bottom, width, height]) add_axes新增子区域 。add_axes为新增子区域,该区域可以座落在figure内任意位置,且该区域可任意设置大小。 案例: figure = plt.figure(num="画布1",figsize=(8,4),dpi=80,facecolor="red",edgecolor="blue",frameon=True) # 新建区域ax1 # figure的百分比,从figure 10%的位置开始绘制, 宽、高是figure的80% left, bottom, width, height = 0.1, 0.1, 0.8, 0.8 # 获得绘制的句柄 axes1 = figure.add_axes([left, bottom, width, height]) axes1.set_title('area1') #新增区域ax2,嵌套在ax1内 left, bottom, width, height = 0.15, 0.6, 0.2, 0.2 # 获得绘制的句柄 axes2 = figure.add_axes([left, bottom, width, height]) axes2.set_title('area2') plt.show() #显示最终绘图效果 |
有些疲惫,关注公众号/收藏休息一下再继续,分享给好友一起学习吧 |
3.4、调用axes对象进行对应的图形绘制 说明: 其实这里就是需要在哪个axes坐标系上画图就调用哪个axes对象即可,(3.3中的每一种方法都一样); 同时1个figure对象可以多次拆分为多个axes对象,如: axes1= plt.subplot(2,2,2) axes2= plt.subplot(2,1,1) 绘制不同的图就使用对应的图形的函数,修改函数的参数即可;如:plot()折线图、bar()柱状图、barh()条形图、pie()饼图、scatter()散点图(气泡图)、hist() 频率图(直方图)、line()线形图、kde()/ density()核密度图、box()箱线图、area()面积图、...... 等; 1个figure可以有多个axes,1个axes中可以绘制多个图。 案例1(显式调用): figure = plt.figure(num="画布1",figsize=(8,4),dpi=80,facecolor="red",edgecolor="blue",frameon=True) x= range(1,11) y = np.random.rand(10) print(x,y) axes1= plt.subplot(2,2,1) axes1.plot(x,y) axes2= plt.subplot(2,2,2) axes2.bar(x,y) axes3= plt.subplot(2,1,2) axes3.plot(x,y) axes3.bar(x,y) plt.show() #显示最终绘图效果 案例2(隐式调用):默认一个画布figure,一个坐标系axes x = range(1, 11) y = np.random.rand(10)*10 z = np.arange(1, 11) #在一张图上绘制多个数据集 plt.plot(x,y, x,z) plt.bar(x, y) plt.show() #显示最终绘图效果 |
3.5、美化和完善图片 3.5.1 添加标题: figure=plt.figure(num="画布1",figsize=(8,4),dpi=80,facecolor="red",edgecolor="blue",frameon=True) x=range(1,11) y=np.random.rand(10) print(x,y) axes1=plt.subplot(2,2,1) axes1.plot(x,y) plt.title("这是标题1") axes2=plt.subplot(2,2,2) axes2.bar(x,y) plt.title("这是标题2") axes3=plt.subplot(2,1,2) axes3.plot(x,y) axes3.bar(x,y) plt.title("这是标题3") plt.show() 3.5.2 添加图例标签: 第1种方式:绘图时不指定标签,而在legend方法中指定标签。 x=range(1,11) y=np.random.rand(10)*10 z=np.arange(1,11) plt.plot(x,y,x,z)#一次画多条线 plt.bar(x,y) plt.title("这是标题") plt.legend(["Y","Z","B_Y"],loc="best",framenotallow=False,title="趋势",ncol=1) #plt.legend(["名1","名2","名3"],loc="位置",framenotallow=是否绘制边框,title="标签名称",ncol=占n列) #loc控制图例的显示位置,默认为best,即选择一个最好的位置,upper、down、left、right、best有5种方案。 plt.show() 第2种方式:在绘图时指定标签,在legend中不指定 #通过label参数指定标签信息。该信息可以用来当做legend的图例标签。 plt.plot(list(range(1,13)),np.random.randint(50,100,12),label="2016") plt.plot(list(range(1,13)),np.random.randint(50,100,12),label="2017") plt.legend(loc="best") plt.title("图例") plt.show() 其他: 关于图片的美化与完善,作者会单独详细讲解(约13个知识小点),下面我们再过一下保存和读取制作的图片,学习整个matplotlib的使用流程。 |
3.6、保存和读取图片 说明: 通过plt的savefig方法将当前的图形保存到硬盘或者类文件对象中。
保存到硬盘上案例: plt.savefig("image1.png", dpi=100, facecolor="g", bbox_inches="tight") 从硬盘读取案例:(pip install pillow) from PIL import Image #从硬盘读取文件 image=Image.open("image1.png") image.show()#会使用操作系统的默认图片打开器打开图片 保存到类文件对象中案例: #把图片保存到内存中 from io impor tBytesIO data=BytesIO() plt.plot([1,5,8,10],[2,3,9,6],"r-.o") plt.savefig(data) #读取数据,从内存中读取图片数据 display(data.getvalue()[:100]) 从类文件对象读取案例: from PIL import Image #从类文件对象中读取信息 image=Image.open(data) image.show() 使用plt.savefig保存图片时一片空白: 是因为在plt.show()后调用了plt.savefig(), 在plt.show()后实际上已经创建了一个新的空白的图片(坐标轴), 这时候你再plt.savefig()就会保存这个新生成的空白图片。 3.7、显示最终绘图效果 plt.show() |
到此,matplotlib的基础作图流程就完了,后面更新的matplotlib模块文章会有《matplotlib的图片完善及美化》、《matplotlib绘制常见的统计图案例》、《python绘制可视化大屏报告》。更多数据运营与分析的干货,关注公众号,和作者一起学习交流成长。 |
好博客就要一起分享哦!分享海报
此处可发布评论
评论(0)展开评论
展开评论