Matplotlib-Python之学习记录一

一、Matplotlib库的简述

        Matplotlib是一个基于Python编程语言的创建静态、动态和人机交互式数据可视化的综合库(常用于数据分析、数据挖掘及基础的科研绘图等)。

        Matplotlib通常与Pandas、Numpy共同使用。

二、Matplotlib中绘图的常见关键参数(所有图源[1])

(一)Figure(图形框)的组成结构

        基础的图形绘制框由Legend(图例,说明)、Title(图表标题)、Grid(网格点)、Spine(图表封闭边框线)、Axes(数据绘制区域块,通常包含Axis对象并提供tick尺度信息)、Markers(数据点)、LIne(绘制线)、Axis(数据轴,设置尺度范围与生成tick及tick label)、Major tick(主刻度线—单位)及标签值、Minor tick(辅助估读刻度线)及标签值和Axis label(数据轴名称)组成。

        实际上,Axes区域可以理解为各Axis单位长交汇出的区域,其一般包含了Axis对象。

 (二)组合创建对象的参数解释(基于面向对象思想)

        Ⅰ matplotlib.pyplot.figure()——仅生成画板

         num(int或str或Figure或SubFigure):图形框实体独有的标识符,用于创建或激活Figure对象(Figure可以自动标识编码);

        figsize((float,float)或default):设置初始的Figure图形框大小(Width,Height),后续可拖拉图形框调整;

        dpi(float或default):图形框的分辨率,图像每英寸长度内的像素点数。该参数受到显示器分辨率的限制(查看计算机的显示器分辨率步骤:右键屏幕空白处->显示设置->显示器分辨率);

        facecolor(color或default):图形框背景色;

        edgecolor(color或default):图形框边界线颜色;

        frameon(bool或default):是否绘制图形框的框架;

        FigureClass(subclass of Figure,Figure子类):创建Figure子类实例;

        clear(bool或default):是否清空指定图形框内容;

        layout({‘constrained’,‘tight’,LayoutEngine,None}或default):定位绘画元素,避免Axes装饰重叠(控制子图标签覆叠)。constrained,限制模式;tight,固定模式。


        Ⅱ matplotlib.pyplot.subplots()——同时生成画板及画纸区域(返回Figure和Axes数组)

        该方法适用于多个相同设计布局的绘制,可同时对Figure对象进行设计。

        nrows,ncols(int或default):定位安置多个画纸(即设置Axes区域),总画纸数=nrows×ncols;

        sharex,sharey(bool或{‘none’,‘all’,‘row’,‘col’}):画纸是否共享axes属性,即是否共用坐标轴。一般为在列上共用x轴、在行上共用y轴、全部共用和相互独立;

        squeeze(bool):处理Axes object的记录返回格式(控制返回参数ax);

        width_ratios(array-like of length ncols):设置不同列的宽度(默认则全部宽度一致);

        height_ratios(array-like of length nrows):设置不同行的宽度(默认则全部宽度一致);

        subplot_kw(dict):组织群参数关键字字典通过add_subplot()函数创建画纸;

        gridspec_kw(dict):组织群参数关键字字典通过GridSpec设计器创建画纸所用格网。


        Ⅲ matplotlib.pyplot.subplot()——单次生成画纸区域(返回axes.SubplotBase)

         *args(int(此处应为三位整数)或(int,int,index)或SubplotSpec):画纸在画板上放置位置的描述。前两位int即类似Ⅱ的nrows、ncols设计画纸布局,但是这里仅绘制一个Axes,因此前两位int相当于设计上的占位,而index则为画纸定位(index范围为[1-int×int],自上向下且自左向右编号);

        projection({None,‘aitoff’,‘hammer’,‘lambert’,‘mollweide’,‘polar’,‘rectilinear’,str}):Axes的投影类型。str为自定义投影方式,默认为‘rectilinear’投影;

        polar(bool):设置是否为极坐标系;

        sharex,sharey(Axes):设置当前画纸的刻度、范围限制、尺度等都和输入Axes一致;

        label(str):为返回的Axes设置标签。


        Ⅳ add_subplot()——配合Ⅰ使用

        基本参数与Ⅲ几乎一致,但是此处add_subplot应基于Ⅰ创建出来的画板实例使用。

        该函数可以实现Figure.add_subplot(int,int,(int1,int2))功能,使得不同画纸可以占据不同大小。int1代表当前画纸的左上定位点,int2代表当前画纸的右下定位点。

        举例:左(2,2,(1,3))| 右(2,2,(1,4))

                             


        Ⅴ matplotlib.axes.Axes.stem() — 点位茎杆图

         locs(array-like):茎杆坐标轴根部点,与orientation相关。若orientation为vertical,则茎杆根部坐标轴为x轴;若orientation为horizontal,则茎杆根部坐标轴为y轴;

        heads(array-like):茎杆的头部点;

        linefmt(str):定义茎杆线段的颜色及线条类型;

        markerfmt(str):定义茎杆头部标记点的颜色及形状;

        basefmt(str):定义基线的特性;

        orientation(str,{'vertical','horizontal'}):定义茎杆绘制的方向;

        bottom(float):依赖于orientation,定义y轴与x轴的定位信息;

        label(str):图例标识;

        use_line_collection(bool):茎杆线条对象类型保存和绘制设置;

        data(indexable object):提供数据数组。


        Ⅵ matplotlib.axes.Axes.plot() — 绘制标记点或函数曲线,具体可选参数详见参考资料[7]

         x,y(array-like / scalar,绘制方式一):对应因变量与自变量或坐标系下对应表示点坐标;

        fmt(str):线条类型设置(线条形状、标记点形状、颜色);

        data(indexable,绘制方式二):利用带标签的数据对象(有序)进行绘制;

        scalex,scaley(bool):设置视图限制范围适应于数据限制范围;

        **kwargs(Line2D类特性设置):

                常用于多曲线同步绘制分析,并设置绘制曲线的各类特性信息(包括曲线标签、线宽、标记点颜色、曲线抗锯齿设置(antialiasing))。


        Ⅶ matplotlib.axes.Axes.scatter() —离散点图绘制

         x,y(float / array-like):数据点的坐标;

        s(float / array-like):标记点大小设置(标记点大小可根据数据变化);

        c(array-like / list of colors):设置标记点的颜色;

        marker(MarkerStyle类对象):设置标记点的类型;

        cmap(str / Colormap类对象):利用Colormap实例或标量映射颜色的注册Colormap来设置绘制颜色;

        norm(str / Normalize):在使用cmap进行颜色映射时,将标量数据放缩至[0,1]范围内;

        vmin,vmax(float):如果在使用标量但是没有明确归一化的情况下,vmin和vmax可以定义颜色映射的覆盖范围;

        alpha(float):数值范围为[0,1],调节颜色透明度,0为透明(transparent),1为不透明(opaque);

        linewidths(float / array-like):线宽;

        edgecolors({’face‘,’none‘,None}或color或sequence of color):标记点形状的边界颜色设置;

        plotnonfinite(bool):是否绘制非限定的点位,即异常数据(inf、nan、-inf)。


        Ⅷ matplotlib.pyplot.show() —显示所有开启状态的Figure

 

(三)绘制输入数据要求

        Matplotlib绘制函数的输入数据格式主要为Numpy的ndarray数据格式,常规的数据格式转换可采用Numpy.asarray()或Numpy.array()函数(例如Pandas.DataFrame、Numpy.matrix等)。

        Numpy.asarray()与Numpy.array()的区别主要在于,若输入为Numpy.ndarray格式,那么前者相当于对原数组直接裁剪,而后者相当于对原数组进行深度复制。

三、Matplotlib绘图示例

(一)普通曲线、柱状二维平面图制作

1、常见函数绘制

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

# 在所设置的数域区间内形成等差数列,
# 当endingPoint=True时,公差=(stop-start)/(n-1)
x = np.linspace(2,4,50)
fig,ax = plt.subplots(figsize=(5,8),layout="constrained")
# 在axes画布区域进行常见函数绘制
ax.plot(x,x,label="y=x")
ax.plot(x,x**2,label="y=x^2")
ax.plot(x,x**3,label="y=x^3")
ax.plot(x,np.log(x),label="y=ln(x)")
ax.plot(x,1/x,label="y=1/x")
ax.plot(x,pow(2,x),label="y=2^x")
# axes区域的设计
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_title("Function Plot")
ax.legend()
# 图形显示
plt.show()

2、两组不同数据的同一绘制方法分离绘制

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

# 辅助绘制函数
def myPlot(ax,x,y,param_dict):
    out = ax.plot(x,y,**param_dict)
    return out

# 在所设置的数域区间内形成等差数列,
# 当endingPoint=True时,公差=(stop-start)/(n-1)
x = np.linspace(2,4,50)
# 利用列表解析方法生成y
y1 = [i for i in x]
y2 = [i**3 for i in x]
y = [y1,y2]
fig,(ax1,ax2) = plt.subplots(1,2,figsize=(5,3),layout="constrained")
ax = [ax1,ax2]
# 在axes画布区域进行绘制
for i in range(len(y)):
    myPlot(ax[i],x,y[i],{'marker':'o'})
# axes区域的设计
ax1.set_xlabel("x1")
ax1.set_ylabel("y1")
ax2.set_xlabel("x2")
ax2.set_ylabel("y2")
# 图形显示
plt.show()

3、柱状图绘制

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

fig,ax = plt.subplots(figsize=(5,2.7),layout='constrained')
categories = ["cucumber","apple","banana","watermelon"]
num = [200,500,400,700]
ax.bar(categories,num)
# axes区域的设计
ax.set_xlabel("category")
ax.set_ylabel("amount")
# 图形显示
plt.show()

4、Color mapped data数据图绘制

        需要注意的是,当一个画板中仅设置了一行的画布,那么其返回的画布索引列为一维数组。

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

# 构成网格矩阵数据(x,y,z)
# 若meshgrid中,sprse=True(数据稀疏展示)则具有numpy的broadcast性质
x,y = np.meshgrid(np.linspace(-3,3,100),np.linspace(-3,3,100))
z = x+y
# 构建画板与画布
fig,ax = plt.subplots(1,2,layout="constrained")
# 一画布(z单值对应一种色调)
# vmin和vmax是根据z的取值范围设置的颜色映射域(若z值有超出vmin、vmax的值则按临界颜色显示)
pc = ax[0].pcolormesh(x,y,z,vmin=-6,vmax=6,cmap="RdBu_r")
fig.colorbar(pc,ax=ax[0])
ax[0].set_title("pcolormesh")
# 二画布(z一段值域对应一种颜色)
pc2 = ax[1].contourf(x,y,z,levels=np.linspace(-6,6,13))
fig.colorbar(pc2,ax=ax[1])
ax[1].set_title("contourf")
# 显示
plt.show()

(二)动态柱状图制作(附加结合pynimate库)

        具体详见参考资料[6]

(三)表格制作(附加结合plottable库)

        具体详见参考资料[5]

(四)三维曲面制作

import numpy as np
from matplotlib import cm
import matplotlib.pyplot as plt

# 创建画板
fig = plt.figure()
# 添加画布
ax = fig.add_subplot(projection='3d')
x,y = np.meshgrid(np.arange(-5,5,0.25),np.arange(-5,5,0.25))
z = np.sin(np.sqrt(x**2+y**2))
pc = ax.plot_surface(x,y,z,rstride=1,cstride=1,cmap=cm.coolwarm,linewidth=0)
# 设置z轴显示范围
ax.set_zlim(-1.01,1.01)
fig.colorbar(pc,shrink=0.5,aspect=10)
# 显示
plt.show()

(五)图像展示

import os
import matplotlib.pyplot as plt
import matplotlib.image as mpimg

Filepath = r"D:\ThirdGhomework\CV\HelloRS32\2CultivatedLand"
imgNames = os.listdir(Filepath)
fig,ax = plt.subplots(1,10,figsize=(15,15))
for i in range(10):
    imgPath = os.path.join(Filepath,imgNames[i])
    img = mpimg.imread(imgPath)
    ax[i].imshow(img)
    ax[i].set_title("CultivatedLand",fontsize=8)
plt.show()

四、Matplotlib Cheatsheets and Handouts

        该图表介绍了基础、简短的Matplotlib内置函数使用方法并提供了示例代码,详见参考资料[4]。

 五、常用的绘图配色

参考资料:

[1]Matplotlib documentation — Matplotlib 3.6.3 documentation

[2]pandas - Python Data Analysis Library

[3]matplotlib.pyplot.figure — Matplotlib 3.6.3 documentation(多种数据可视化图形框设计)

[4]Matplotlib cheatsheets — Visualization with Python

[5]基于matplotlib轻松绘制漂亮的表格

[6]超简单,使用pynimate制作动态排序图

[7]matplotlib.axes.Axes.plot — Matplotlib 3.6.3 documentation

[8]matplotlib.axes.Axes.set_title — Matplotlib 3.6.3 documentation

猜你喜欢

转载自blog.csdn.net/Jcb1906824038/article/details/128749699