数据可视化:Matplotlib详解及实战

 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 pltplt.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 pltplt.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 pltplt.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 pltdef 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 pltmu, 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 colorsx = 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 radiiplt.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.25plt.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 timeimport matplotlib.pyplot as plt
from pylab import mplmpl.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 pltPATH = '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 npfig, 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()

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/23886.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

黑马程序员SpringMVC练手项目

目录 1、需求 2、项目准备 pom.xml SQL jdbc.properties log4j.properties applicationContext.xml spring-mvc.xml web.xml 3、工作流程 4、难点 项目已经上传到gitee&#xff1a;https://gitee.com/xzl-it/my-projects 1、需求 SpringMVC项目练习&#xff1a;数…

基于Open3D的点云处理14-法向量

法向量 计算法向量的接口函数&#xff1a; Open3d使用estimate_normals函数来计算法向量。其参数设置Open3d提供了3中参数搜索的方法&#xff08;所有计算的法向量模长为1&#xff09;&#xff1a; open3d.geometry.KDTreeSearchParamKNN(knn20) # 计…

Linux从安装到实战 常用命令 Bash常用功能 用户和组管理

1.0初识Linux 1.1虚拟机介绍 1.2VMware Workstation虚拟化软件 下载CentOS; 1.3远程链接Linux系统 &FinalShell 链接finalshell半天没连接进去 他说ip adress 看IP地址是在虚拟机上 win11主机是 终端输入&#xff1a; ifconfig VMware虚拟机的设置 & ssh连接_snge…

初识MySQL数据库之用户管理

目录 一、用户管理 二、用户 1. 用户信息 2. 创建用户 3. 用户登录测试 4. 删除用户 5. 设置用户远端登录 6. 修改密码 6.1 修改当前用户的密码 6.2 root用户修改指定用户的密码 三、权限 1. 数据库中的各个权限含义 2. 给用户授权 3. 查看用户拥有权限 4. 授权…

Flink之JDBC Sink

这里介绍一下Flink Sink中jdbc sink的使用方法,以mysql为例,这里代码分为两种,事务和非事务 非事务代码 import org.apache.flink.connector.jdbc.JdbcConnectionOptions; import org.apache.flink.connector.jdbc.JdbcExecutionOptions; import org.apache.flink.connector.…

设计模式概述与UML图

文章目录 一、设计模式概述1. 软件设计模式的产生背景2. 软件设计模式的概念3. 学习设计模式的必要性4. 设计模式分类&#xff08;1&#xff09;创建型模式&#xff08;2&#xff09;结构型模式&#xff08;3&#xff09;行为型模式 二、UML图1. 类图概述2. 类图作用3. 类图表示…

深入学习JVM —— GC垃圾回收机制

前言 前面荔枝已经梳理了有关JVM的体系结构和类加载机制&#xff0c;也详细地介绍了JVM在类加载时的双亲委派模型&#xff0c;而在这篇文章中荔枝将会比较详细地梳理有关JVM学习的另一大重点——GC垃圾回收机制的相关知识&#xff0c;重点了解的比如对象可达性的判断、四种回收…

215. 数组中的第K个最大元素(快排+大根堆+小根堆)

题目链接&#xff1a;力扣 解题思路&#xff1a; 方法一&#xff1a;基于快速排序 因为题目中只需要找到第k大的元素&#xff0c;而快速排序中&#xff0c;每一趟排序都可以确定一个最终元素的位置。 当使用快速排序对数组进行降序排序时&#xff0c;那么如果有一趟排序过程…

VSCode C/C++ 分目录编译配置

分目录编译配置记录 launch.json文件 注释处为修改内容 {// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息&#xff0c;请访问: https://go.microsoft.com/fwlink/?linkid830387"version": "0.2.0","configur…

PHP8的表达式-PHP8知识详解

表达式是 PHP 最重要的基石。在 PHP8中&#xff0c;几乎所写的任何东西都是一个表达式。简单但却最精确的定义一个表达式的方式就是"任何有值的东西"。 最基本的表达式形式是常量和变量。当键入"$a 5"&#xff0c;即将值"5"分配给变量 $a。&quo…

后端进阶之路——综述Spring Security认证,授权(一)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★前端炫酷代码分享 ★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ 解决算法&#xff0c;一个专栏就够了★ ★ 架…

【数据结构篇】手写双向链表、单向链表(超详细)

文章目录 链表1、基本介绍2、单向链表2.1 带头节点的单向链表测试类&#xff1a;链表实现类&#xff1a; 2.2 不带头节点的单向链表2.3 练习测试类&#xff1a;链表实现类&#xff1a; 3、双向链表测试类&#xff1a;双向链表实现类&#xff1a; 4、单向环形链表**测试类**&…

Gitlab CI/CD笔记-第二天-GitOps的流水线常用关键词(1)

一、常用关键词 在Gitlab项目的根目录需要创建一个 .gitlab-ci.yaml的文件。 这个文件就是定义的流水线。Call :"Pipeline as code" 二、这条流水线怎么写&#xff1f; 一、掌握常用的关键词即可。 1.关键词分类 1.全局关键词 Global Keywards 2.任务关键词…

Java课题笔记~ Spring 概述

Spring 框架 一、Spring 概述 1、Spring 框架是什么 Spring 是于 2003 年兴起的一个轻量级的 Java 开发框架&#xff0c;它是为了解决企业应用开发的复杂性而创建的。Spring 的核心是控制反转&#xff08;IoC&#xff09;和面向切面编程&#xff08;AOP&#xff09;。 Spring…

vue 标题文字字数过长超出部分用...代替 动态显示

效果: 浏览器最大化: 浏览器缩小: 代码: html: <div class"title overflow">{{item.name}}</div> <div class"content overflow">{{item.content}}</div> css: .overflow {/* 一定要加宽度 */width: 90%;/* 文字的大小 */he…

聊聊 Docker 和 Dockerfile

目录 一、前言 二、了解Dockerfile 三、Dockerfile 指令 四、多阶段构建 五、Dockerfile 高级用法 六、小结 一、前言 对于开发人员来说&#xff0c;会Docker而不知道Dockerfile等于不会Docker&#xff0c;上一篇文章带大家学习了Docker的基本使用方法&#xff1a;《一文…

【NLP概念源和流】 01-稀疏文档表示(第 1/20 部分)

一、介绍 自然语言处理(NLP)是计算方法的应用,不仅可以从文本中提取信息,还可以在其上对不同的应用程序进行建模。所有基于语言的文本都有系统的结构或规则,通常被称为形态学,例如“跳跃”的过去时总是“跳跃”。对于人类来说,这种形态学的理解是显而易见的。 在这篇介…

设计模式-迭代器模式在Java中使用示例

场景 为开发一套销售管理系统&#xff0c;在对该系统进行分析和设计时&#xff0c;发现经常需要对系统中的商品数据、客户数据等进行遍历&#xff0c; 为了复用这些遍历代码&#xff0c;开发人员设计了一个抽象的数据集合类AbstractObjectList&#xff0c;而将存储商品和客户…

MySQL正则表达式检索数据

目录 一、使用正则表达式进行基本字符匹配 1.使用regexp关键字 2.使用正则表达式 . 二、进行OR匹配 1.为搜索两个串之一&#xff0c;使用 | 2.匹配几个字符之一[] 3.匹配范围 4.匹配特殊字符 过滤数据允许使用匹配、比较、通配符操作来寻找数据&#xff0c;但是随…

MySQL 的事件调度器

MySQL 的事件调度器可以通过以下方式进行管理&#xff1a; 1】查看事件调度器的状态 SHOW VARIABLES LIKE event_scheduler;2】启用/禁用事件调度器 SET GLOBAL event_scheduler ON;SET GLOBAL event_scheduler OFF; 注意&#xff1a;启用/禁用事件调度器需要具有 SUPE…