Matplotlib教程(非常详细)(第二部分)

接着上一部分Matplotlib教程(非常详细)(第一部分)接着描述。

十七、Matplotlib双轴图

在一些应用场景中,有时需要绘制两个 x 轴或两个 y 轴,这样可以更直观地显现图像,从而获取更有效的数据。Matplotlib 提供的 twinx() 和 twiny() 函数除了可以实现绘制双轴的功能外,还可以使用不同的单位来绘制曲线,比如一个轴绘制对函数,另外一个轴绘制指数函数。

下面示例绘制了一个具有两个 y 轴的图形,一个显示指数函数 exp(x),另一个显示对数函数 log(x)。

import matplotlib.pyplot as plt
import numpy as np
#创建图形对象
fig = plt.figure()
#添加子图区域
a1 = fig.add_axes([0,0,1,1])
#准备数据
x = np.arange(1,11)
#绘制指数函数
a1.plot(x,np.exp(x))
a1.set_ylabel('exp')
#添加双轴
a2 = a1.twinx()
#‘ro’表示红色圆点
a2.plot(x, np.log(x),'ro-')
#绘制对数函数
a2.set_ylabel('log')
#绘制图例
fig.legend(labels = ('exp','log'),loc='upper left')
plt.show()

输出结果:

matplotlib绘图

图1:输出结果

十八、Matplotlib柱状图(代码+注释详解)

柱状图是一种用矩形柱来表示数据分类的图表,柱状图可以垂直绘制,也可以水平绘制,它的高度与其所表示的数值成正比关系。柱状图显示了不同类别之间的比较关系,图表的水平轴 X 指定被比较的类别,垂直轴 Y 则表示具体的类别值。

Matplotlib 提供了bar()函数来绘制柱状图,它可以应用在 MATLAB 样式以及面向对象的绘图方法中。当它与 axes 对象一起使用时,其语法格式如下:

ax.bar(x, height, width, bottom, align)

该函数的参数说明,如下表所示:

bar()函数参数说明

x一个标量序列,代表柱状图的x坐标,默认x取值是每个柱状图所在的中点位置,或者也可以是柱状图左侧边缘位置。
height一个标量或者是标量序列,代表柱状图的高度。
width可选参数,标量或类数组,柱状图的默认宽度值为 0.8。
bottom可选参数,标量或类数组,柱状图的y坐标默认为None。
algin有两个可选项 {"center","edge"},默认为 'center',该参数决定 x 值位于柱状图的位置。

该函数的返回值是一个 Matplotlib 容器对象,该对象包含了所有柱状图。

下面是一个关于 Matplotlib 柱状图的简单示例。它用来显示了不同编程语言的学习人数。

import matplotlib.pyplot as plt
#创建图形对象
fig = plt.figure()
#添加子图区域,参数值表示[left, bottom, width, height ]
ax = fig.add_axes([0,0,1,1])
#准备数据
langs = ['C', 'C++', 'Java', 'Python', 'PHP']
students = [23,17,35,29,12]
#绘制柱状图
ax.bar(langs,students)
plt.show()

输出结果如下:

bar()函数

图1:matplotlib bar()绘图

通过调整柱状图的宽度,可以实现在同一 x 轴位置绘制多个柱状图。您可以将它们设置成不同的颜色,从而使它们更容易区分。下面示例描述了某工程学院过去四年中,三个专业录取的统招学生数量。

import numpy as np
import matplotlib.pyplot as plt
#准备数据
data =[[30, 25, 50, 20],[40, 23, 51, 17],[35, 22, 45, 19]]
X = np.arange(4)
fig = plt.figure()
#添加子图区域
ax = fig.add_axes([0,0,1,1])
#绘制柱状图
ax.bar(X + 0.00, data[0], color = 'b', width = 0.25)
ax.bar(X + 0.25, data[1], color = 'g', width = 0.25)
ax.bar(X + 0.50, data[2], color = 'r', width = 0.25)
plt.show()

上述代码执行后,将显示四个柱状图,将每个柱状图又均分为三个小柱状图,每个柱状图占据 0.25 个单位。

matplotlib绘图

图2:matplotlib绘图

柱状图除了上述使用方法外,还有另外一种堆叠柱状图。所谓堆叠柱状图就是将不同数组别的柱状图堆叠在一起,堆叠后的柱状图高度显示了两者相加的结果值。

bar() 函数提供了一个可选参数bottom该参数可以指定柱状图开始堆叠的起始值,一般从底部柱状图的最大值开始,依次类推。

下面是一个不同国家参加奥林匹克运动会所得奖牌(金银铜)的柱状堆叠图示例,如下所示:

import numpy as np
import matplotlib.pyplot as plt

countries = ['USA', 'India', 'China', 'Russia', 'Germany']
bronzes = np.array([38, 17, 26, 19, 15])
silvers = np.array([37, 23, 18, 18, 10])
golds = np.array([46, 27, 26, 19, 17])
# 此处的 _ 下划线表示将循环取到的值放弃,只得到[0,1,2,3,4]
ind = [x for x, _ in enumerate(countries)]
#绘制堆叠图
plt.bar(ind, golds, width=0.5, label='golds', color='gold', bottom=silvers+bronzes)
plt.bar(ind, silvers, width=0.5, label='silvers', color='silver', bottom=bronzes)
plt.bar(ind, bronzes, width=0.5, label='bronzes', color='#CD853F')
#设置坐标轴
plt.xticks(ind, countries)
plt.ylabel("Medals")
plt.xlabel("Countries")
plt.legend(loc="upper right")
plt.title("2019 Olympics Top Scorers")
plt.show()

在上述代码中,第一次调用plt.bar()绘制了黄色柱状图, 第二次调用plot.bar()时绘制了灰色柱状图,最后一次调用plt.bar()则绘制最底部的柱状图。两个柱状图相接触的位置就是顶部与底部的位置,这样就构成了柱状堆叠图。

柱状图堆叠图画法

图3:柱状堆叠图

十九、Matplotlib直方图

直方图(Histogram),又称质量分布图,它是一种条形图的一种,由一系列高度不等的纵向线段来表示数据分布的情况。 直方图的横轴表示数据类型,纵轴表示分布情况。

首先,我们需要了解柱状图和直方图的区别。直方图用于概率分布,它显示了一组数值序列在给定的数值范围内出现的概率;而柱状图则用于展示各个类别的频数。

例如,我们对某工厂的员工年龄做直方图统计,首先我们要统计出每一位员工的年龄,然后设定一个 20 至 65 的数值范围,并将该数值范围细分为 4 个区间段 (20,35),(35,45),(45,55),(55,65) , 最后通过直方图的形式,展示该工厂员工在相应年龄区间的分布情况。

如果想要构建直方图,必须遵循以下步骤:

  • 将整个值范围划分为一系列区间。
  • 区间值(bin)的取值,不可遗漏数据;
  • 计算每个区间中有多少个值。

通常将 bin 指定为连续且不重叠的数值区间,而 bin 值指区间开始和结束的数值。

您可以使用下面的函数来绘制直方图:

matplotlib.pyplot.hist()

该函数的参数说明如下:

x必填参数,数组或者数组序列。
bins可选参数,整数或者序列,bins 表示每一个间隔的边缘(起点和终点)默认会生成10个间隔。
range指定全局间隔的下限与上限值 (min,max),元组类型,默认值为 None。
density如果为 True,返回概率密度直方图;默认为 False,返回相应区间元素的个数的直方图
histtype要绘制的直方图类型,默认值为“bar”,可选值有 barstacked(堆叠条形图)、step(未填充的阶梯图)、stepfilled(已填充的阶梯图)。

以下示例绘制了班级学生得分情况的直方图。其中定义了四个区间(bins)分别是:0-25、26-50、51-75 和 76-100。直方图显示了相应范围的学生人数。

from matplotlib import pyplot as plt
import numpy as np
#创建图形对象和轴域对象
fig,ax = plt.subplots(1,1)
a = np.array([22,87,5,43,56,73,55,54,11,20,51,5,79,31,27])
#绘制直方图
ax.hist(a, bins = [0,25,50,75,100])
#设置坐标轴
ax.set_title("histogram of result")
ax.set_xticks([0,25,50,75,100])
ax.set_xlabel('marks')
ax.set_ylabel('no.of students')
plt.show()

上述代码执行后,输出结果如下:

hist()直方图绘制

图1:直方图绘制结果

二十、Matplotlib饼状图

饼状图用来显示一个数据系列,具体来说,饼状图显示一个数据系列中各项目的占项目总和的百分比。

Matplotlib 提供了一个 pie() 函数,该函数可以生成数组中数据的饼状图。您可使用 x/sum(x) 来计算各个扇形区域占饼图总和的百分比。pie() 函数的参数说明如下:

X数组序列,数组元素对应扇形区域的数量大小。
labels列表字符串序列,为每个扇形区域备注一个标签名字。
color为每个扇形区域设置颜色,默认按照颜色周期自动设置。
autopct格式化字符串"fmt%pct",使用百分比的格式设置每个扇形区的标签,并将其放置在扇形区内。

以下示例:关于不同计算机语言学习人数的饼状图。autopct 参数设置为 %1.2f% ,并将各项所占总和的百分比显示在相对应的扇形区内。

from matplotlib import pyplot as plt
import numpy as np
#添加图形对象
fig = plt.figure()
ax = fig.add_axes([0,0,1,1])
#使得X/Y轴的间距相等
ax.axis('equal')
#准备数据
langs = ['C', 'C++', 'Java', 'Python', 'PHP']
students = [23,17,35,29,12]
#绘制饼状图
ax.pie(students, labels = langs,autopct='%1.2f%%')
plt.show()

输出结果如下:

matplotlib饼状图

图1:Matplotlib饼状图

二十一、Matplotlib折线图(绘图实例+代码详解)

折线图(line chart)是我们日常工作、学习中经常使用的一种图表,它可以直观的反映数据的变化趋势。与绘制柱状图、饼状图等图形不同,Matplotlib 并没有直接提供绘制折线图的函数,因此本节着重讲解如何绘制一幅折线图。

1、绘制单条折线

下面示例是关于 C语言中文网用户活跃度的折线图:

import matplotlib.pyplot as plt
#准备绘制数据
x = ["Mon", "Tues", "Wed", "Thur", "Fri","Sat","Sun"]
y = [20, 40, 35, 55, 42, 80, 50]
# "g" 表示红色,marksize用来设置'D'菱形的大小
plt.plot(x, y, "g", marker='D', markersize=5, label="周活")
#绘制坐标轴标签
plt.xlabel("登录时间")
plt.ylabel("用户活跃度")
plt.title("C语言中文网活跃度")
#显示图例
plt.legend(loc="lower right")
#调用 text()在图像上绘制注释文本
#x1、y1表示文本所处坐标位置,ha参数控制水平对齐方式, va控制垂直对齐方式,str(y1)表示要绘制的文本
for x1, y1 in zip(x, y):
    plt.text(x1, y1, str(y1), ha='center', va='bottom', fontsize=10)
#保存图片
plt.savefig("1.jpg")
plt.show()

显示结果如下:

matplotlib折线图绘制

2、绘制多条折线图

当学习完如何绘制单条折线的绘制后,再绘制多条折线也变的容易,只要准备好绘制多条折线图的数据即可。

下面是一个简单示例,绘制了两天内同一时刻,天气温度随时间变化的折线图:

import matplotlib.pyplot as plt
#对比两天内同一时刻温度的变化情况
x = [5, 8, 12, 14, 16, 18, 20]
y1 = [18, 21, 29, 31, 26, 24, 20]
y2 = [15, 18, 24, 30, 31, 25, 24]
#绘制折线图,添加数据点,设置点的大小
# * 表示绘制五角星;此处也可以不设置线条颜色,matplotlib会自动为线条添加不同的颜色
plt.plot(x, y1, 'r',marker='*', markersize=10)
plt.plot(x, y2, 'b', marker='*',markersize=10)
plt.title('温度对比折线图') # 折线图标题
plt.xlabel('时间(h)') # x轴标题
plt.ylabel('温度(℃)') # y轴标题
#给图像添加注释,并设置样式
for a, b in zip(x, y1):
    plt.text(a, b, b, ha='center', va='bottom', fontsize=10)
for a, b in zip(x, y2):
    plt.text(a, b, b, ha='center', va='bottom', fontsize=10)

#绘制图例
plt.legend(['第一天', '第二天'])
#显示图像
plt.show()

显示结果如下:

Matplotlib绘制折线图

二十二、Python Matplotlib散点图

散点图用于在水平轴和垂直轴上绘制数据点,它表示了因变量随自变量变化的趋势。通俗地讲,它反映的是一个变量受另一个变量的影响程度。

散点图将序列显示为一组点,其中每个散点值都由该点在图表中的坐标位置表示。对于不同类别的点,则由图表中不同形状或颜色的标记符表示。同时,您也可以设置标记符的颜色或大小。

下面示例,绘制了学生考试成绩的散点图,其中蓝色代表男孩成绩,红色表示女孩的成绩。

import matplotlib.pyplot as plt
girls_grades = [89, 90, 70, 89, 100, 80, 90, 100, 80, 34]
boys_grades = [30, 29, 49, 48, 100, 48, 38, 45, 20, 30]
grades_range = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
fig=plt.figure()
#添加绘图区域
ax=fig.add_axes([0,0,1,1])
ax.scatter(grades_range, girls_grades, color='r',label="girls")
ax.scatter(grades_range, boys_grades, color='b',label="boys")
ax.set_xlabel('Grades Range')
ax.set_ylabel('Grades Scored')
ax.set_title('scatter plot')
#添加图例
plt.legend()
plt.show()

代码执行后,输出结果如下:

散点图

图1:绘制散点图

二十三、Matplotlib等高线图

等高线图(也称“水平图”)是一种在二维平面上显示 3D 图像的方法。等高线有时也被称为 “Z 切片”,如果您想要查看因变量 Z 与自变量 X、Y 之间的函数图像变化(即 Z=f(X,Y)),那么采用等高线图最为直观。

自变量 X 和 Y 需要被限制在矩形网格内,您可以将 x 、y 数组作为参数传递给 numpy.meshgrid() 函数来构建一个网格点矩阵。

关于 meshgrid() 函数用法可参考《numpy.meshgrid()用法详解》

Matplotlib API 提供了绘制等高线(contour)与填充等高线( contourf)的函数。这两个函数都需要三个参数,分别是 X、Y 与 Z。

import numpy as np
import matplotlib.pyplot as plt
#创建xlist、ylist数组
xlist = np.linspace(-3.0, 3.0, 100)
ylist = np.linspace(-3.0, 3.0, 100)
#将上述数据变成网格数据形式
X, Y = np.meshgrid(xlist, ylist)
#定义Z与X,Y之间的关系
Z = np.sqrt(X**2 + Y**2)
fig,ax=plt.subplots(1,1)
#填充等高线颜色
cp = ax.contourf(X, Y, Z)
fig.colorbar(cp) # 给图像添加颜色柱
ax.set_title('Filled Contours Plot')
ax.set_xlabel('x (cm)')
ax.set_ylabel('y (cm)')
#画等高线
plt.contour(X,Y,Z)
plt.show()

代码执行后,输出结果如下:

matplotlib画图

图1:等高线示例图

左侧图像绘制了两个变量 X、Y ,右侧的颜色柱(colorbar)则表示 X 的取值,颜色越深表示值越小,中间深色部分的圆心点表示 x=0,y=0,z=0。

二十四、Matplotlib振动图

振动图也叫磁场图,或量场图,其图像的表现形式是一组矢量箭头,其数学含义是在点 (x,y) 处具有分向量 (u,v)。

Matplotlib 提供绘制量场图的函数,如下所示:

quiver(x,y,u,v)

上述函数表示,在指定的 (x,y) 坐标上以箭头的形式绘制向量,参数说明如下:

参数说明
x一维、二维数组或者序列,表示箭头位置的x坐标。
y一维、二维数组或者序列,表示箭头位置的y坐标。
u一维、二维数组或者序列,表示箭头向量的x分量
v一维、二维数组或者序列,表示箭头向量的y分量
c一维、二维数组或者序列,表示箭头颜色

以下示例,绘制了一个简单的振动图:

import matplotlib.pyplot as plt
import numpy as np
x,y = np.meshgrid(np.arange(-2, 2, 0.2), np.arange(-2, 2, 0.25))
z = x*np.exp(-x**2 - y**2)
#计算数组中元素的梯度
v, u = np.gradient(z, 0.2, 0.2)
fig, ax = plt.subplots()
q = ax.quiver(x,y,u,v)
plt.show()

上述代码执行后,输出结果如下:

matplotlib画图

图1:振动示例图

二十五、Matplotlib箱型图

箱型图(也称为盒须图)于 1977 年由美国著名统计学家约翰·图基(John Tukey)发明。它能显示出一组数据的最大值、最小值、中位数、及上下四分位数。

在箱型图中,我们从上四分位数到下四分位数绘制一个盒子,然后用一条垂直触须(形象地称为“盒须”)穿过盒子的中间。上垂线延伸至上边缘(最大值),下垂线延伸至下边缘(最小值)。箱型图结构如下所示:

箱型图结构图

图1:箱型如结构图

首先准备创建箱型图所需数据:您可以使用numpy.random.normal()函数来创建一组基于正态分布的随机数据,该函数有三个参数,分别是正态分布的平均值、标准差以及期望值的数量。如下所示:

#利用随机数种子使每次生成的随机数相同
np.random.seed(10)
collectn_1 = np.random.normal(100, 10, 200)
collectn_2 = np.random.normal(80, 30, 200)
collectn_3 = np.random.normal(90, 20, 200)
collectn_4 = np.random.normal(70, 25, 200)
data_to_plot=[collectn_1,collectn_2,collectn_3,collectn_4]

然后用 data_to_plot 变量指定创建箱型图所需的数据序列,最后用 boxplot() 函数绘制箱型图,如下所示:

fig = plt.figure()
#创建绘图区域
ax = fig.add_axes([0,0,1,1])
#创建箱型图
bp = ax.boxplot(data_to_plot)
plt.show()

上述代码执行后,输出结果如下:

箱型图输出结果

图2:箱型图输出结果

二十六、Matplotlib提琴图

小提琴图(Violin Plot)是用来展示数据分布状态以及概率密度的图表。这种图表结合了箱形图和密度图的特征。小提琴图跟箱形图类似,不同之处在于小提琴图还显示数据在不同数值下的概率密度。

小提琴图使用核密度估计(KDE)来计算样本的分布情况,图中要素包括了中位数、四分位间距以及置信区间。在数据量非常大且不方便一一展示的时候,小提琴图特别适用。

概率密度估计、置信区间、四分位间距都属于统计学中的概念,可自行查阅,这里不做说明。

小提琴图比箱型图能提供了更多的信息。虽然箱型图显示了均值、中位数和上、下四分位数等统计信息,但是小提琴图却显示了数据的完整分布情况,这更利于数据的分析与比对。下面是小提琴图的使用示例:

import matplotlib.pyplot as plt
np.random.seed(10)
collectn_1 = np.random.normal(100, 10, 200)
collectn_2 = np.random.normal(80, 30, 200)
collectn_3 = np.random.normal(90, 20, 200)
collectn_4 = np.random.normal(70, 25, 200)
#创建绘制小提琴图的数据序列
data_to_plot = [collectn_1, collectn_2, collectn_3, collectn_4]
#创建一个画布
fig = plt.figure()
#创建一个绘图区域
ax = fig.add_axes([0,0,1,1])
# 创建一个小提琴图
bp = ax.violinplot(data_to_plot)
plt.show()

输出结果如下:

violinplot小提琴图绘制

图1:小提琴图绘制

二十七、Python Matplotlib 3D绘图详解(汇总)

最初开发的 Matplotlib,仅支持绘制 2d 图形,后来随着版本的不断更新, Matplotlib 在二维绘图的基础上,构建了一部分较为实用的 3D 绘图程序包,比如 mpl_toolkits.mplot3d,通过调用该程序包一些接口可以绘制 3D散点图、3D曲面图、3D线框图等。

mpl_toolkits 是 Matplotlib 的绘图工具包。

1、第一个三维绘图程序

下面编写第一个三维绘图程序。

首先创建一个三维绘图区域, plt.axes() 函数提供了一个参数projection,将其参数值设置为 "3d"。如下所示:

#导入三维工具包mplot3d
from mpl_toolkits import mplot3d
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
#创建3d绘图区域
ax = plt.axes(projection='3d')

有了三维绘图区域,接下来就要构建 3d 图像,如下所示:

#从三个维度构建
z = np.linspace(0, 1, 100)
x = z * np.sin(20 * z)
y = z * np.cos(20 * z)

最后调用 plot3D() 方法绘制 3d 图形,代码如下:

#调用 ax.plot3D创建三维线图
ax.plot3D(x, y, z, 'gray')
ax.set_title('3D line plot')
plt.show()

完整程序如下所示:

from mpl_toolkits import mplot3d
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
#创建3d绘图区域
ax = plt.axes(projection='3d')
#从三个维度构建
z = np.linspace(0, 1, 100)
x = z * np.sin(20 * z)
y = z * np.cos(20 * z)
#调用 ax.plot3D创建三维线图
ax.plot3D(x, y, z, 'gray')
ax.set_title('3D line plot')
plt.show()

输出结果如下所示:

matplotlib 3D绘图

图1:三维线图(3D Line)

上述代码中的 ax.plot3D() 函数可以绘制各种三维图形,这些三维图都要根据(x,y,z)三元组类来创建。

2、3D散点图

通过 ax.scatter3D() 函数可以绘制 3D 散点图,示例代码如下:

from mpl_toolkits import mplot3d
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
#创建绘图区域
ax = plt.axes(projection='3d')
#构建xyz
z = np.linspace(0, 1, 100)
x = z * np.sin(20 * z)
y = z * np.cos(20 * z)
c = x + y
ax.scatter3D(x, y, z, c=c)
ax.set_title('3d Scatter plot')
plt.show()

输出结果图:

scatter散点图3D绘图

图2:Matplotlib 3D绘图

3、3D等高线图

ax.contour3D() 可以用来创建三维等高线图,该函数要求输入数据均采用二维网格式的矩阵坐标。同时,它可以在每个网格点(x,y)处计算出一个 z 值。

以下示例展示了如何绘制三维正弦等高线图。代码如下:

from mpl_toolkits import mplot3d
import numpy as np
import matplotlib.pyplot as plt
def f(x, y):
    return np.sin(np.sqrt(x ** 2 + y ** 2))
#构建x、y数据
x = np.linspace(-6, 6, 30)
y = np.linspace(-6, 6, 30)
#将数据网格化处理
X, Y = np.meshgrid(x, y)
Z = f(X, Y)
fig = plt.figure()
ax = plt.axes(projection='3d')
#50表示在z轴方向等高线的高度层级,binary颜色从白色变成黑色
ax.contour3D(X, Y, Z, 50, cmap='binary')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
ax.set_title('3D contour')
plt.show()

输出结果图如下:

三维绘图

图3:绘制三维轮廓图

4、3D线框图

线框图同样要采用二维网格形式的数据,与绘制等高线图类似

线框图可以将数据投影到指定的三维表面上,并输出可视化程度较高的三维效果图。通过 plot_wireframe() 能够绘制 3D 线框图。代码如下:

from mpl_toolkits import mplot3d
import numpy as np
import matplotlib.pyplot as plt
#要绘制函数图像
def f(x, y):
    return np.sin(np.sqrt(x ** 2 + y ** 2))
#准备x,y数据
x = np.linspace(-6, 6, 30)
y = np.linspace(-6, 6, 30)
#生成x、y网格化数据
X, Y = np.meshgrid(x, y)
#准备z值
Z = f(X, Y)
#绘制图像
fig = plt.figure()
ax = plt.axes(projection='3d')
#调用绘制线框图的函数plot_wireframe()
ax.plot_wireframe(X, Y, Z, color='black')
ax.set_title('wireframe')
plt.show()

输出结果如下:

图4:Matplotlib绘制线框图

5、3D曲面图

曲面图表示一个指定的因变量y两个自变量xz之间的函数关系。

3D 曲面图是一个三维图形,它非常类似于线框图。不同之处在于,线框图的每个面都由多边形填充而成。Matplotlib 提供的 plot_surface() 函数可以绘制 3D 曲面图,该函数需要接受三个参数值 x,y 和 z 。示例代码如下:

from mpl_toolkits import mplot3d
import numpy as np
import matplotlib.pyplot as plt
#求向量积(outer()方法又称外积)
x = np.outer(np.linspace(-2, 2, 30), np.ones(30))
#矩阵转置
y = x.copy().T
#数据z
z = np.cos(x ** 2 + y ** 2)
#绘制曲面图
fig = plt.figure()
ax = plt.axes(projection='3d')
调用plot_surface()函数
ax.plot_surface(x, y, z,cmap='viridis', edgecolor='none')
ax.set_title('Surface plot')
plt.show()

输出结果图:

Matplotlib绘制表面图

图5:Matplotlib绘制曲面图

二十八、Matplotlib绘制文本

Matplotlib 支持广泛的文本格式,比如 TTF 页面语言、Unicode 字符等。这是因为 Matplotlib 内置了 matplotlib.font_manager 字体管理器,它是一个实现了跨平台,并符合 W3C 字体查找算法的字体集合。

TTF(TrueType Font) 是苹果公司和微软公司合作开发的页面描述语言,用来描述字符的轮廓,结合了光栅技术和矢量技术的优点。

用户可以对文本属性进行控制,比如字体大小、粗细、位置和颜色等。

与此同时,Matplotlib 也支持绘制 TeX 包含的数学符号。TeX 是一套功能强大、十分灵活的排版语言,它可以用来绘制文本、符号、数学表达式等。通过下表中的方法可以绘制出相应的内容:

text绘图区域的任意位置添加文本。
annotate在绘图区域的任意位置添加带有可选箭头的注释。
xlabel在绘图区域的 x 轴上添加标签。
ylabel在绘图区域的 y 轴上添加标签。
title为绘图区域添加标题。
figtext画布的任意位置添加文本。
suptitle画布中添加标题。


Matplotlib 使用pyplot模块中的 text() 函数绘制文本,函数的语法格式如下:

plt.text(x, y, string, weight="bold", color="b")

参数说明如下:

  • x: 注释文本内容所在位置的横坐标;
  • y:注释文本内容所在位置的纵坐标;
  • string:注释文本内容;
  • weight:注释文本内容的粗细风格;

下面使用 text() 函数会创建一个文本对象。示例如下:

import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"]=["SimHei"] #设置字体
plt.rcParams["axes.unicode_minus"]=False #正常显示负号
fig = plt.figure()
#添加绘图区域
ax = fig.add_axes([0,0,1,1])
#设置格式
ax.set_title('axes title')
ax.set_xlabel('xlabel')
ax.set_ylabel('ylabel')
# 3,8 表示x,y的坐标点;style设置字体样式为斜体;bbox用来设置盒子的属性,比如背景色
ax.text(3, 8, 'C语言中网网,编程爱好者都喜欢的网站', style='italic',bbox = {'facecolor': 'yellow'},fontsize=15)
#绘制数学表达式,用$符包裹
ax.text(2, 6, r'an equation: $E = mc^2$', fontsize = 15)
#添加文字,并设置样式
ax.text(4, 0.05, '网址:c.biancheng.net',verticalalignment = 'bottom', color = 'green', fontsize = 15)
ax.plot([2], [1], 'o')
#xy为点的坐标;xytext为注释内容坐标;arrowprops设置箭头的属性
ax.annotate('C语言中文网', xy = (2, 1), xytext = (3, 4),arrowprops = dict(facecolor = 'blue', shrink = 0.1))
#设置坐标轴x,y
ax.axis([0, 10, 0, 10])
plt.show()

代码执行结果如下:

python matplotlib文本绘制

图1:Matplotlib文本绘图

二十九、Matplotlib数学表达式

Matplotlib 中的文本字符串都可以使用 Text Markup(一种文本标记语言)显现出来,具体的使用方法是将文本标记符放在一对美元符号$内,语法格式如下:

#数学表达式

plt.title(r'$\alpha > \beta$')

如果要绘制下标和上标,您需要使用'_''^'符号,下面是一个简单的示例:

#绘制表达式 r'$\alpha_i> \beta_i$'
import numpy as np
import matplotlib.pyplot as plt
t = np.arange(0.0, 2.0, 0.01)
s = np.sin(2*np.pi*t)
#绘制函数图像
plt.plot(t,s)
#设置标题
plt.title(r'$\alpha_i> \beta_i$', fontsize=20)
#设置数学表达式
plt.text(0.6, 0.6, r'$\mathcal{A}\mathrm{sin}(2 \omega t)$', fontsize = 20)
#设置数学表达式
plt.text(0.1, -0.5, r'$\sqrt{2}$', fontsize=10)
plt.xlabel('time (s)')
plt.ylabel('volts (mV)')
plt.show()

上面代码的输出结果:

Matplot数学表达式设置

Matplotlib数学表达式绘制

从上述示例可以看出,虽然数学表达式种类繁多,但是 Matplotlib 对各种数学符号都做了良好的支持。

三十、Matplotlib image图像处理

Matplotlib 软件包中的image模块提供了加载、缩放和显示图像的功能,该模块只能支持 PNG 格式的图片,如果格式不符,需要对图片的格式进行转换。

Matplotlib 支持的图片格式非常有限,所以通常情况下,建议采用 Python 图像处理库 Pillow 来处理图像,若感兴趣可以自行了解。

下面示例,imread() 函数用于读取图像数据并形成 ndarray 数组 ,其数据类型为 float32。

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
img = mpimg.imread('mtplogo.png')

假设在当前目录中存在名为 mtplogo.png 的图像。

Matplotlib图像处理

图1:mtplogo图像

通过执行 imsave() 函数,可以将包含图像数据的 ndarray 数组保存到磁盘文件中。

plt.imsave("logo.png", img, cmap = 'gray', origin = 'lower')

如下所示,将 imsave()方法的origin参数设置为 lower 实现了原始图像的垂直翻转。

图2:垂直翻转图

通过 imshow() 函数可以在 Matplotlib 查看器上绘制出相应的图像。其函数格式如下:

imgplot = plt.imshow(img)

下面列举一组示例:

import matplotlib.pyplot as plt
import numpy as np
fig=plt.figure()
ax1=fig.add_subplot(221)
ax2=fig.add_subplot(222)
ax3=fig.add_subplot(223)
ax4=fig.add_subplot(224)
#准备数据
#绘制z = sqrt(x^2+y^2)图像
points=np.arange(-5,5,0.01)
# meshgrid 接受两个一维数组,然后产生两个二维矩阵
xs,ys=np.meshgrid(points,points)
#绘制图像
z=np.sqrt(xs**2+ys**2)
ax = fig.add_subplot(221)
#默认
ax.imshow(z)
ax = fig.add_subplot(222)
ax.imshow(z,cmap = "gray")
ax = fig.add_subplot(223)
ax.imshow(z,cmap="cool")
ax = fig.add_subplot(224)
ax.imshow(z,cmap="hot")
#显示图像
plt.show()

输出结果如下:

imshow()函数用法

图3:输出结果

三十一、Matplotlib转换对象

Matplotlib 是一款轻量级的图形转换框架,它通过转换对象轻松地实现了数据坐标系、轴域坐标系、图形坐标系,以及显示坐标系四者之间的相互转换,由于这种转换是 Matplotlib 自动完成的,因此无需考虑其底层原理。

1、坐标系转换对象

下面对四种坐标系做简单说明,其中ax代表轴域对象的实例;fig代表图形对象的实例。

Matplotlib坐标系和转换对象

坐标系转换对象描述
Dataax.transData数据坐标系,由 xlim 和 ylim 控制。
Axesax.transAxes轴域坐标系(即绘图区坐标系),(0,0) 在轴域坐标系左下角,(1,1)在轴域坐标系的右上角。
Figurefig.transFigure图形坐标系。(0,0) 在图的左下角,(1,1) 在图的右上角。
DisplayNone显示坐标系。(0,0)显示左下角,而(width,height) 则显示右上角。注意,此处以像素 px 为单位。

转换对象作用就是在不同对象之间架起一座沟通的桥梁。输入一组数据最终以图像的形式显示,这个过程就是依靠转换对象来实现的。

上表中的 Data、Axes、Figure,这三个转换对象都可以接受一组数据,它们会将接受的数据转换到显示坐标系中,即 Display。在这个过程中,显示坐标系只是充当数据的接收者,因此显示坐标系不存在转换对象。

2、示例说明

下面举一个简单的示例,现有文本“my text”放置在数据点 (x,y) 位置处:

axes.text(x,y,"my text") 

通过 Axes 转换对象,我们可以指定文本的位置。使用以下代码,将文本移动至在坐标系的中心位置:

axes.text(0.5, 0.5, "middle of graph", transform=axes.transAxes)
  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值