1 Matplotlib介绍
Matplotlib是Python中最常用的可视化工具之一,可以非常方便地创建海量类型的2D图表和一些基本的3D图表。
Matplotlib提供了一个套面向绘图对象编程的API接口,能够很轻松地实现各种图像的绘制,并且它可以配合Python GUI工具(如 PyQt、Tkinter 等)在应用程序中嵌入图形。同时 Matplotlib 也支持以脚本的形式嵌入到 IPython shell、Jupyter 笔记本、web 应用服务器中使用。
1.1 Matplotlib架构组成
matplotlib框架分为三层,这三层构成了一个栈,上层可以调用下层。
1.1.1 脚本层
主要用于可视化编程,pytplot模块可以提供给我们一个与matplotlib打交道的接口。可以只通过调用pyplot模块的函数从而操作整个程序包,来绘制图形。
- 操作或者改动Figure对象,例如创建Figure对象
- 大部分工作是处理样本文件的图形与坐标的生成
1.1.2 美工层
图形中所有能看到的元素都属于Artist对象,即标题、轴标签、刻度等组成图形的所有元素都是Artist对象的实例。
- Figure:指整个图形(包括所有的元素,比如标题、线等)。
- Axes(坐标系):axes是子图对象,子图对象指的是x和y轴。axes 常用有set_xlabel()、set_ylabel()设置x和y轴坐标名字。
- Axis(坐标轴):坐标系中的一条轴,包含大小限制、刻度和刻度标签。
一个figure(图)可以包含多个axes(坐标系),但是一个axes只能属于一个figure。一个axes(坐标系)可以包含多个axis(坐标轴),包含两个即为2d坐标系,3个即为3d坐标系。
1.1.3 后端层
matplotlib的底层,实现了大量的抽象接口类,这些API用来在底层实现图形元素的一个个类。
- FigureCanvas对象实现了绘图区域这一概念。
- Renderer对象在FigureCanvas上绘图。
1.2 Pyplot介绍
通过Pyplot 对数据进行图形化展示,可以直观的了解数据的分布情况,更好的制定出学习方法。同时,它还可以展示出我们机器学习到的计算方法,了解其与实际情况是否相符等问题。
- Pyplot 是 Matplotlib 的子库,提供了和 MATLAB 类似的绘图 API。
- Pyplot 是常用的绘图模块,能很方便让用户绘制 2D 图表。
- Pyplot 包含一系列绘图函数的相关函数,每个函数会对当前的图像进行一些修改,例如:给图像加上标记,生成新的图像,在图像中产生新的绘图区域等等。
Pyplot 绘图流程如下:
2 Pyplot函数
Pyplot 包含一系列绘图函数的相关函数,每个函数会对当前的图像进行一些修改
plot()
:用于绘制线图和散点图scatter()
:用于绘制散点图bar()
:用于绘制垂直条形图和水平条形图hist()
:用于绘制直方图pie()
:用于绘制饼图imshow()
:用于绘制图像subplots()
:用于创建子图
2.1 plt.plot参数说明
plt.plot(x,y,format_string,**kwargs)
`plt.plot()`函数是Matplotlib库中用于绘制线条图的函数,它有多个参数可以控制绘图的各个方面。以下是常用的一些参数:
- x: x轴数据的列表或数组
- y: y轴数据的列表或数组
- linewidth: 线条的宽度,从0到无穷大的浮点数,例如2.5
- color: 线条的颜色,可以是字符串、元组或RGBA值,代表不同的颜色。例如:红色'red'、绿色'green'、蓝色'blue'、黑色'black'、白色'white'、灰色'gray'等;RGB元组(0, 0, 1)表示蓝色,RGBA元组(0, 1, 0, 0.5)表示半透明的绿色
- linestyle: 线条的样式,可以是字符串,如实线'-'、虚线'--'、点线':'、破折线'-.'等
'-'
: 实线
'--'
: 虚线
'-.'
: 点划线
':'
: 点线
''
: 无线条,只显示标记
'None'
: 无线条,不显示标记
' '
: 无线条,不显示标记
- marker: 数据点的标记样式
标记字符 | 说明 | 标记字符 | 说明 | 标记字符 | 说明 |
---|---|---|---|---|---|
' . ' | 点标记 | ' 1 ' | 下花三角 | ' h ' | 竖六边形 |
' , ' | 像素标记 | ' 2 ' | 上花三角 | ' H ' | 横六边形 |
' o ' | 实心圆 | ' 3 ' | 左花三角 | ' + ' | 十字标记 |
' v ' | 倒三角 | ' 4 ' | 右花三角 | ' x ' | x标记 |
' ^ ' | 上三角 | ' s ' | 实心方形 | ' D ' | 菱形标记 |
' > ' | 右三角 | ' p ' | 实心五角 | ' d ' | 菱形标记 |
' < ' | 左三角 | ' * ' | 星形标记 | ' | ' | 直线标记 |
- markersize: 标记的大小,从0到无穷大的浮点数,例如7.5
- label: 字符串类型,代表绘制的线条的标签,在图例中显示。例如Line 1
- alpha: 线条和标记的透明度,从0到1的浮点数,表示线条和标记的透明度。例如0.5
- zorder: 整数类型,表示绘图的层数,数值越大越靠上。例如2
还有一些其他参数:
- solid_capstyle: 实线端点的样式,如普通平直样式"butt"、圆角样式"round"、斜角样式"projecting"等
- dash_capstyle: 虚线端点的样式,与solid_capstyle类似
- dash_joinstyle: 虚线连接处的样式,如圆弧连接"round"、斜接连接"bevel"、锐角连接"miter"等
- solid_joinstyle: 实线连接处的样式,与dash_joinstyle类似
- markevery: 标记显示的间隔,可以是数字、元组或者函数,可以是数字、元组或者函数。例如:每隔一个数据点标记一个点:markevery=2;从第二个开始,每个5个数据点标记一个点:markevery=(1, 5);根据某个函数的返回值来控制标记的位置:markevery=lambda i: i%3==0
`plt.plot()`函数的参数比较多,不同的参数组合可以实现各种各样的效果。
2.2 plt.scatter参数说明
matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, *, edgecolors=None, plotnonfinite=False, data=None, **kwargs)
- x, y → 散点的坐标,float or array-like, shape (n, )
- s → 散点的面积,float or array-like, shape (n, ), optional
- c → 散点的颜色(默认值为蓝色,'b',其余颜色同plt.plot( ))
- marker → 散点样式(默认值为实心圆,'o',其余样式同plt.plot( ))
- alpha → 散点透明度([0, 1]之间的数,0表示完全透明,1则表示完全不透明)
- linewidths →散点的边缘线宽
- edgecolors → 散点的边缘颜色
2.3 plt.bar参数说明
bar(x, height, width=0.8, bottom=None, ***, align='center', data=None, **kwargs)
- x 表示x坐标,数据类型为int或float类型,
- height 表示柱状图的高度,也就是y坐标值,数据类型为int或float类型,
- width 表示柱状图的宽度,取值在0~1之间,默认为0.8
- bottom 柱状图的起始位置,也就是y轴的起始坐标,
- align 柱状图的中心位置,"center","lege"边缘
- color 柱状图颜色
- edgecolor 边框颜色
- linewidth 边框宽度
- tick_label 下标标签
- log 柱状图y周使用科学计算方法,bool类型
- orientation 柱状图是竖直还是水平,竖直:"vertical",水平条:"horizontal"
2.4 plt.hist参数说明
matplotlib.pyplot.hist(
x, bins=10, range=None, normed=False,
weights=None, cumulative=False, bottom=None,
histtype=u'bar', align=u'mid', orientation=u'vertical',
rwidth=None, log=False, color=None, label=None, stacked=False,
hold=None, **kwargs)
- x : (n,) array or sequence of (n,) arrays,这个参数是指定每个bin(箱子)分布的数据,对应x轴
- bins : integer or array_like, optional,这个参数指定bin(箱子)的个数,也就是总共有几条条状图
- normed : boolean, optional,If True, the first element of the return tuple will be the counts normalized to form a probability density, i.e.,n/(len(x)`dbin),这个参数指定密度,也就是每个条状图的占比例比,默认为1
- color : color or array_like of colors or None, optional,这个指定条状图的颜色
3.5 plt.pie参数说明
pyplot.pie(x, explode=None, labels=None, colors=None, autopct=None)
- x: 数组序列,数组元素对应扇形区域的数量大小。
- labels: 列表字符串序列,为每个扇形区域备注一个标签名字。
- colors; 为每个扇形区域设置颜色,默认按照颜色周期自动设置。
- autopct: 格式化字符串"fmt%pct",使用百分比的格式设置每个扇形区的标签,并将其放置在扇形区内。
- pctdistance:设置百分比标签与圆心的距离;
- labeldistance:设置各扇形标签(图例)与圆心的距离;
- explode: 指定饼图某些部分的突出显示,即呈现爆炸式;()
- shadow:是否添加饼图的阴影效果
2.6 plt.imshow参数说明
matplotlib.pyplot.imshow(X, cmap=None, norm=None, aspect=None, interpolation=None, alpha=None, vmin=None, vmax=None, origin=None,extent=None, shape=None, filternorm=1, filterrad=4.0, imlim=None, resample=None, url=None, hold=None, data=None, **kwargs)
-
X:图像数据。支持的数组形状是:
- (M,N) :带有标量数据的图像。数据可视化使用色彩图。
- (M,N,3) :具有RGB值的图像(float或uint8)。
- (M,N,4) :具有RGBA值的图像(float或uint8),即包括透明度。
前两个维度(M,N)定义了行和列图片,即图片的高和宽;
RGB(A)值应该在浮点数[0, ..., 1]的范围内,或者
整数[0, ... ,255]。超出范围的值将被剪切为这些界限。
- cmap:将标量数据映射到色彩图,颜色默认为:rc:
image.cmap
。 -
norm :~matplotlib.colors.Normalize,如果使用scalar data ,则Normalize会对其进行缩放[0,1]的数据值内。默认情况下,数据范围使用线性缩放映射到颜色条范围。 RGB(A)数据忽略该参数。
-
aspect:{'equal','auto'}或float,可选,控制轴的纵横比。该参数可能使图像失真,即像素不是方形的。equal:确保宽高比为1,像素将为正方形。(除非像素大小明确地在数据中变为非正方形,坐标使用 extent )。auto: 更改图像宽高比以匹配轴的宽高比。通常,这将导致非方形像素。
-
interpolation:str,使用的插值方法,支持的值有:'none', 'nearest', 'bilinear', 'bicubic','spline16', 'spline36', 'hanning', 'hamming', 'hermite', 'kaiser','quadric', 'catrom', 'gaussian', 'bessel', 'mitchell', 'sinc','lanczos'.如果interpolation = 'none',则不执行插值
-
alpha:alpha值,介于0(透明)和1(不透明)之间。RGBA输入数据忽略此参数。
- vmin, vmax : scalar,如果使用* norm 参数,则忽略 vmin , vmax *。vmin,vmax与norm结合使用以标准化亮度数据。
- origin : {'upper', 'lower'},将数组的[0,0]索引放在轴的左上角或左下角。'upper'通常用于矩阵和图像。请注意,垂直轴向上指向“下”但向下指向“上”。
-
extent:(left, right, bottom, top)数据坐标中左下角和右上角的位置。 如果为“无”,则定位图像使得像素中心落在基于零的(行,列)索引上。
2.7 plt.subplots参数说明
matplotlib.pyplot.subplots(nrows=1, ncols=1, sharex=False, sharey=False, squeeze=True, subplot_kw=None, gridspec_kw=None, **fig_kw)
- nrows,ncols:整型,可选参数,默认为1。表示子图网格(grid)的行数与列数。
- sharex,sharey:布尔值或者{'none','all','row','col'},默认:False,控制x(sharex)或y(sharey)轴之间的属性共享:
1.True或者'all':x或y轴属性将在所有子图(subplots)中共享.
2.False或'none':每个子图的x或y轴都是独立的部分
3.'row':每个子图在一个x或y轴共享行(row)
4.'col':每个子图在一个x或y轴共享列(column)当子图在x轴有一个共享列时('col'),只有底部子图的x tick标记是可视的。同理,当子图在y轴有一个共享行时('row'),只有第一列子图的y tick标记是可视的。
- squeeze:布尔类型,可选参数,默认:True。
如果是True,额外的维度从返回的Axes(轴)对象中挤出。
如果只有一个子图被构建(nrows=ncols=1),结果是单个Axes对象作为标量被返回。
对于N*1或1*N个子图,返回一个1维数组。
对于N*M,N>1和M>1返回一个2维数组。
如果是False,不进行挤压操作:返回一个元素为Axes实例的2维数组,即使它最终是1x1。
- subplot_kw:字典类型,可选参数。把字典的关键字传递给add_subplot()来创建每个子图。
- gridspec_kw字典类型,可选参数。把字典的关键字传递给GridSpec构造函数创建子图放在网格里(grid)。
- **fig_kw:把所有详细的关键字参数传给figure()函数
3 Matplotlib绘图
3.1 绘制一条直线
import matplotlib.pyplot as plt
plt.plot([1,2,3,4])
plt.ylabel('some numbers')
plt.show()
我们为plot命令提供了一个list或者是array,matplotlib认为这个序列是Y轴上的取值,并且会自动生成X轴上的值。因为python中的范围是从0开始的,因此X轴就是从0开始,长度与Y的长度相同,也就是[0,1,2,3],所以显示如下:
3.2 绘制一条折线
import matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4], [1, 4, 9, 16])
plt.ylabel('some numbers')
plt.show()
plot的参数可以是任意数量,上面参数表示的是(x,y)对,(1,1)(2,4)(3,9)(4,16)。这里有第三个可选参数,它是字符串格式的,表示颜色和线的类型。它是颜色字符串和线的类型字符串的组合。默认情况下,该字符串参数是’b-‘,表示蓝色的实线。显示如下:
3.3 绘制一个点集
import matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4], [1, 4, 9, 16], 'ro')
plt.axis([0, 6, 0, 20])
plt.show()
'ro'表示红色圆圈绘制上述点集,显示如下:
3.4 通过numpy数据绘制多个点集
import numpy as np
import matplotlib.pyplot as plt
# 0到5之间每隔0.2取一个数
t = np.arange(0., 5., 0.2)
# 红色的破折号,蓝色的方块,绿色的三角形
plt.plot(t, t, 'r--', t, t**2, 'bs', t, t**3, 'g^')
plt.show()
构建三组numpy数据,通过不同的样式展示出来,显示如下:
3.5 绘制多图形(figures)和多坐标系(axes)
import numpy as np
import matplotlib.pyplot as plt
def f(t):
return np.exp(-t) * np.cos(2*np.pi*t)
t1 = np.arange(0.0, 5.0, 0.1)
t2 = np.arange(0.0, 5.0, 0.02)
plt.figure("2subplot")
plt.subplot(211)
plt.plot(t1, f(t1), 'bo', t2, f(t2), 'k')
plt.subplot(212)
plt.plot(t2, np.cos(2*np.pi*t2), 'r--')
plt.show()
pyplot所有的绘图命令都是应用于当前图形(figure)和当前坐标系(axes),分别在两个坐标系绘制一个图形,显示如下:
3.6 绘图直方图
import numpy as np
import matplotlib.pyplot as plt
mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)
# 直方图
n, bins, patches = plt.hist(x, 50, normed=1, facecolor='g', alpha=0.75)
plt.xlabel('Smarts')
plt.ylabel('Probability')
plt.title('Histogram of IQ')
plt.text(60, .025, r'$\mu=100,\ \sigma=15$')
plt.axis([40, 160, 0, 0.03])
plt.grid(True)
plt.show()
text()命令可以被用来在任何位置添加文字,xlabel()、ylabel()、title()被用来在指定位置添加文字。所有text()命令返回一个matplotlib.text.Text实例,可以通过关键字参数在text()定制文本样式,也可以通过setp()来定制文字的样式:
t = plt.xlabel('my data', fontsize=14, color='red')
setp(t,color='blue')
import matplotlib.pyplot as plt
import numpy as np
# 生成三组随机数据
data1 = np.random.normal(0, 1, 1000)
data2 = np.random.normal(2, 1, 1000)
data3 = np.random.normal(-2, 1, 1000)
# 绘制直方图
plt.hist(data1, bins=30, alpha=0.5, label='Data 1')
plt.hist(data2, bins=30, alpha=0.5, label='Data 2')
plt.hist(data3, bins=30, alpha=0.5, label='Data 3')
# 设置图表属性
plt.title('matplotlib hist() ')
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.grid()
plt.legend()
# 显示图表
plt.show()
3.7 绘制Y轴使用不同刻度下的曲线图
import numpy as np
import matplotlib.pyplot as plt
# 在区间[0,1]制造一些数据
# np.random.normal为高斯分布
y = np.random.normal(loc=0.5, scale=0.4, size=1000)
y = y[(y > 0) & (y < 1)]
y.sort()
x = np.arange(len(y))
# 创建一个窗口
plt.figure(1)
# 线性
plt.subplot(221)
plt.plot(x, y)
plt.yscale('linear')
plt.title('linear')
plt.grid(True)
# 对数
plt.subplot(222)
plt.plot(x, y)
plt.yscale('log')
plt.title('log')
plt.grid(True)
# symmetric log
plt.subplot(223)
plt.plot(x, y - y.mean())
plt.yscale('symlog', linthreshy=0.05)
plt.title('symlog')
plt.grid(True)
# logit
plt.subplot(224)
plt.plot(x, y)
plt.yscale('logit')
plt.title('logit')
plt.grid(True)
plt.show()
matplotlib.pylot不仅仅提供了线性的坐标,还提供了对数(logarithmic)和分对数(logit)坐标。当数据的维度跨越许多数量级时,这种坐标就很有用
3.8 绘制散点图
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import colors
x = np.random.randn(50)
y = np.random.randn(50)
color = np.random.rand(50)
changecolor = colors.Normalize(vmin=0.4, vmax=0.8)
plt.scatter(x, y, c=color, s=60, alpha=0.3, cmap='viridis',norm=changecolor)
plt.colorbar() # 显示颜色条
plt.show()
参数 vmin、vmax 分别为要设置的数据范围的最小值和最大值(注意:设置之后,原来大于vmax的值被“拉低”成vmax;原来小于vmin的值被“拉高”成vmin)
class matplotlib.colors.Normalize(vmin=None, vmax=None)
颜色表如下:
import numpy as np
import matplotlib.pyplot as plt
# 随机数生成器的种子
np.random.seed(2)
N = 50
x = np.random.rand(N)
y = np.random.rand(N)
colors = np.random.rand(N)
area = (30 * np.random.rand(N))**2 # 0 to 15 point radii
plt.scatter(x, y, s=area, c=colors, alpha=0.5) # 设置颜色及透明度
plt.title("matplotlib Scatter ") # 设置标题
plt.colorbar()
plt.show()
3.9 绘制饼图
import matplotlib.pyplot as plt
#定义饼的标签,
labels = ['one','two','three','four','five','other']
#每个标签所占的数量
x = [200,500,1200,7000,200,900]
#饼图分离
explode = (0.03,0.05,0.06,0.04,0.08,0.1)
#设置阴影效果
#plt.pie(x,labels=labels,autopct='%3.2f%%',explode=explode,shadow=True)
plt.pie(x,labels=labels,autopct='%3.2f%%',explode=explode, labeldistance=1.35, pctdistance=1.2)
plt.legend()
plt.show()
3.10 绘制条形图
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
# 将全局的字体设置为黑体
matplotlib.rcParams['font.family'] = 'SimHei'
# 数据
N = 5
y = [20, 10, 30, 25, 15]
x = np.arange(N)
# 绘图 x x轴, height 高度, 默认:color="blue", width=0.8
p1 = plt.bar(x, height=y, width=0.5, )
# 展示图形
plt.show()
"""
水平条形图,需要修改以下属性
orientation="horizontal"
"""
import numpy as np
import matplotlib.pyplot as plt
# 数据
N = 5
x = [20, 10, 30, 25, 15]
y = np.arange(N)
# 绘图 x= 起始位置, bottom= 水平条的底部(左侧), y轴, height 水平条的宽度, width 水平条的长度
p1 = plt.bar(x=0, bottom=y, height=0.5, width=x, orientation="horizontal")
# 展示图形
plt.show()
import numpy as np
import matplotlib.pyplot as plt
# 设置画布颜色为 blue
plt.style.use("seaborn-v0_8-whitegrid")
fig, ax = plt.subplots()
# y 轴数据
data = [[5,25,50,20],
[4,23,51,17],
[6,22,52,19]]
X = np.arange(4)
width=0.25
plt.bar(X+width*0, data[0], color = 'darkorange', width = width,label = 'A')
plt.bar(X+width*1, data[1], color = 'steelblue', width =width,label="B")
plt.bar(X+width*2, data[2], color = 'violet', width = width,label = 'C')
# 添加文字描述
W = [width*0,width*1,width*2]# 偏移量
for i in range(3):
for a,b in zip(X+W[i],data[i]):#zip拆包
plt.text(a,b,"%.0f"% b,ha="center",va= "bottom")#格式化字符串,保留0位小数
plt.xlabel("Group")
plt.ylabel("Num")
# 在(0,48)这个位置,显示note 这个值
plt.text(1,48,"note",fontsize=15, ha='left', rotation=15, wrap=True)
# family参数是一个字体参数
plt.text(1.5,32,"deep",fontsize=15, ha='left', rotation=15, wrap=True,
bbox=dict(boxstyle='round,pad=0.5', fc='yellow', ec='k',lw=1 ,alpha=0.5))
plt.legend()
plt.show()
3.11 绘制多子图
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots(3, 3, figsize=(6,6))
fig.text(0.5, 0, 'x', ha='center')
fig.text(0, 0.5, 'y', va='center')
x = np.linspace(0, 2*np.pi, 50, endpoint=False)
sins = np.sin(x)
coss = np.cos(x)
ax[1][1].plot(x, sins, 'r', alpha=0.5, lw=0.5, ls='-', marker='+', label='sin')
ax2 = ax[1][1].twinx()
ax2.plot(x, coss, 'g', alpha=0.5, lw=0.5, ls='-', marker='+', label='cos')
for tl in ax2.get_yticklabels():
tl.set_color("r")
plt.tight_layout()
plt.show()
3.12 绘制时间变化图
import random
import time
import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams["font.sans-serif"] = ["SimHei"] # 设置显示中文字体
mpl.rcParams["axes.unicode_minus"] = False # 设置正常显示符号
x = range(1, 101)
times = [random.randint(10, 200) for i in range(100)]
plt.figure(figsize=(15, 5), dpi=80) # 创建画布
plt.plot(x, times, color='r', linestyle='-', label='t = 2', marker='v') # 绘制折线图,点划线
plt.legend(loc=0) # 显示图例
# 描述信息
plt.xlabel("设备数/个")
plt.ylabel("时间/s")
plt.title("时间变化图", fontsize=18)
plt.savefig("./time.jpg") # 保存至指定位置
plt.show() # 显示图像
3.13 绘制多张图片显示
# opencv显示
import cv2
# plt显示
from PIL import Image
import matplotlib.pyplot as plt
PATH = 'D:/dataset/cat_dog/valid/3.jpg'
plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文
plt.subplot(1, 3, 1)
im = Image.open(PATH)
plt.imshow(im)
plt.xlabel('原图')
plt.subplot(1, 3, 2)
im = cv2.imread(PATH, 0) # 参数0为灰度显示,参数1为RGB显示
plt.imshow(im, cmap='gray')
plt.xlabel('单通道图')
plt.subplot(1, 3, 3)
im = cv2.imread(PATH, 0) # 参数0为灰度显示,参数1为RGB显示
im = cv2.equalizeHist(im) # 直方图均衡
plt.imshow(im, cmap='gray')
plt.xlabel('直方图')
plt.show()
3.14 绘制3D图
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 生成3D figure
fig = plt.figure()
ax = Axes3D(fig, auto_add_to_figure=False)
fig.add_axes(ax)
# X, Y value
X = np.arange(-4, 4, 0.25)
Y = np.arange(-4, 4, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X ** 2 + Y ** 2)
Z = np.sin(R)
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=plt.get_cmap('rainbow'), edgecolor='k')
ax.contourf(X, Y, Z, zdir='z', offset=-2, cmap='rainbow')
ax.set_zlim(-2, 2)
plt.show()
import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
#定义坐标轴
fig = plt.figure()
ax1 = plt.axes(projection='3d')
#ax = fig.add_subplot(111,projection='3d') #这种方法也可以画多个子图
#定义三维数据
xx = np.arange(-5,5,0.5)
yy = np.arange(-5,5,0.5)
X, Y = np.meshgrid(xx, yy)
Z = np.sin(X)+np.cos(Y)
#作图
ax1.plot_surface(X,Y,Z)
ax1.contour(X,Y,Z, zdim='z',offset=-2,cmap='rainbow') #等高线图,要设置offset,为Z的最小值
fig = plt.figure() #定义新的三维坐标轴
ax3 = plt.axes(projection='3d')
#定义三维数据
xx = np.arange(-5,5,0.5)
yy = np.arange(-5,5,0.5)
X, Y = np.meshgrid(xx, yy)
Z = np.sin(X)+np.cos(Y)
#作图
ax3.plot_surface(X,Y,Z,cmap='rainbow')
ax3.contour(X,Y,Z, zdim='z',offset=-2,cmap='rainbow') #等高线图,要设置offset,为Z的最小值
plt.show()
3.15 给绘图添加注释
import matplotlib.pyplot as plt
import numpy as np
fig, geeeks = plt.subplots()
t = np.arange(0.0, 5.0, 0.001)
s = np.cos(3 * np.pi * t)
line = geeeks.plot(t, s, lw=2)
# Annotation
geeeks.annotate('Local Max', xy=(3.3, 1),
xytext=(3, 1.8),
arrowprops=dict(facecolor='green',
shrink=0.05), )
geeeks.set_ylim(-2, 2)
# Plot the Annotation in the graph
plt.show()
annotate()方法添加注释,有两点需要注意:需要被注释的地方,使用xy参数来指出,还有就是注释文本所放置的位置,使用参数xytext来指定位置,这两个参数都是(x,y)元组,这里的xy和xytext所使用的坐标是根据XY轴的刻度的坐标,称为data coordinates。
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0, 10, 0.005)
y = np.exp(-x / 3.) * np.sin(3 * np.pi * x)
fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_xlim(0, 10)
ax.set_ylim(-1, 1)
# Setting up the parameters
xdata, ydata = 5, 0
xdisplay, ydisplay = ax.transData.transform((xdata, ydata))
bbox = dict(boxstyle ="round", fc ="0.8")
arrowprops = dict(
arrowstyle = "->",
connectionstyle = "angle, angleA = 0, angleB = 90,\
rad = 10")
offset = 72
# Annotation
ax.annotate('data = (%.1f, %.1f)'%(xdata, ydata),
(xdata, ydata), xytext =(-2 * offset, offset),
textcoords ='offset points',
bbox = bbox, arrowprops = arrowprops)
disp = ax.annotate('display = (%.1f, %.1f)'%(xdisplay, ydisplay),
(xdisplay, ydisplay), xytext =(0.5 * offset, -offset),
xycoords ='figure pixels',
textcoords ='offset points',
bbox = bbox, arrowprops = arrowprops)
# To display the annotation
plt.show()