Python数据分析重点绘图库matplotlib,本文分享matplotlib的使用基础知识及技巧

奋斗吧
奋斗吧
擅长邻域:未填写

标签: Python数据分析重点绘图库matplotlib,本文分享matplotlib的使用基础知识及技巧 JavaScript博客 51CTO博客

2023-07-20 18:24:17 137浏览

Python数据分析重点绘图库matplotlib,本文分享matplotlib的使用基础知识及技巧,matplotlib使用技巧:建议优先阅读本公众号提供的几篇基础文章并对照实际操作一遍,然后可。

0、引言

matplotlib就是python的绘图库,一个Python 2D/3D绘图库,用以绘制一些高质量的数学二维图形。在他之上,Seaborn-使用Matplotlib的统计数据可视化,当然python还提供了其他的绘图库,每个绘图库都有自己的特色。

使用技巧:建议优先阅读本公众号提供的几篇基础文章并对照实际操作一遍,然后打开例图网页https://matplotlib.org/gallery.html,选择需要的图片类型,点击进入复制代码,修改代码,制作自己所需风格的图即可。

1、绘图前了解matplotlib的绘图原理

figure(画布) / axes(坐标系) / axis(坐标轴):

一般来说,都会初始化一个figure(画布)对象,
但是一个figure对象中,可以根据需求来初始化多个axes对象!
每个axes其实绘制图形的时候,一般来说,都是2D,或者3D,所以也就表示有2个axis或者3个axis

绘图的基本思想,就是在一个画布中的某一个axes坐标系中,进行数据的图形绘制。

Python数据分析重点绘图库matplotlib,本文分享matplotlib的使用基础知识及技巧_图例

常见概念:

初步了解一下这些常用名词

  • 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)

  • num:图像编号或名称,数字为编号 ,字符串为名称
  • figsize:指定figure的宽和高,单位为英寸;
  • dpi参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80      1英寸等于2.5cm,A4纸是 21*30cm的纸张 
  • facecolor:背景颜色
  • edgecolor:边框颜色
  • frameon:是否显示边框 

    案例:

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)

  • nrows:subplot的行数
  • ncols:subplot的列数
  • sharex:所有subplot应该使用相同的X轴刻度(调节xlim将会影响所有subplot)
  • sharey:所有subplot应该使用相同的Y轴刻度(调节ylim将会影响所有subplot)
  • subplot_kw:用于创建各subplot的关键字字典
  • **fig_kw:创建figure时的其他关键字,如plt.subplots(2,2,figsize=(8,6))

案例: 

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() #显示最终绘图效果


Python数据分析重点绘图库matplotlib,本文分享matplotlib的使用基础知识及技巧_图例_02


案例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() #显示最终绘图效果


Python数据分析重点绘图库matplotlib,本文分享matplotlib的使用基础知识及技巧_坐标轴_03



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()


Python数据分析重点绘图库matplotlib,本文分享matplotlib的使用基础知识及技巧_图例_04


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()


Python数据分析重点绘图库matplotlib,本文分享matplotlib的使用基础知识及技巧_图例_05


第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()


Python数据分析重点绘图库matplotlib,本文分享matplotlib的使用基础知识及技巧_图例_06


其他:

关于图片的美化与完善,作者会单独详细讲解(约13个知识小点),下面我们再过一下保存和读取制作的图片,学习整个matplotlib的使用流程。

3.6、保存和读取图片

说明:

通过plt的savefig方法将当前的图形保存到硬盘或者类文件对象中。


  • dpi:每英寸分辨率点数。
  • facecolor:设置图像的背景色。
  • bbox_inches:设置为tight,可紧凑保存图像,删除figure周围的空白。

保存到硬盘上案例

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展开评论

暂无评论,快来写一下吧

展开评论

您可能感兴趣的博客

客服QQ 1913284695