数据可视化: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.rhkb.cn/news/77849.html

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

相关文章

2023年08月IDE流行度最新排名

点击查看最新IDE流行度最新排名&#xff08;每月更新&#xff09; 2023年08月IDE流行度最新排名 顶级IDE排名是通过分析在谷歌上搜索IDE下载页面的频率而创建的 一个IDE被搜索的次数越多&#xff0c;这个IDE就被认为越受欢迎。原始数据来自谷歌Trends 如果您相信集体智慧&am…

小白电脑装机(自用)

几个月前买了配件想自己装电脑&#xff0c;结果最后无法成功点亮&#xff0c;出现的问题是主板上的DebugLED黄灯常亮&#xff0c;即DRAM灯亮。对于微星主板的Debug灯&#xff0c;其含义这篇博文中有说明。 根据另一篇博文&#xff0c;有两种可能。 我这边曾将内存条和主板一块…

全球出货量突破1.3亿:华为智能穿戴产品国内第一份额诞生

根据华为运动健康技术暨HDC运动健康分论坛的消息&#xff0c;华为运动健康军团首席执行官兼华为终端BG智能穿戴与运动健康产品线总裁张炜透露&#xff0c;华为智能穿戴产品的全球出货量已突破1.3亿&#xff0c;用户数量也超过4.5亿&#xff0c;并多年来一直在中国智能手表市场占…

每日一题——复杂链表的复制

复杂链表的复制 题目链接 思路 如果不考虑random指针的复制&#xff0c;仅仅复制单链表的结构还是简单的。只需要通过一个指针cur遍历原链表&#xff0c;再不断创建新节点尾插到newHead后即可。 但如果要考虑random指针的复制&#xff0c;那过程就复杂了。 有小伙伴会这样想…

基于Azure OpenAI Service 的知识库搭建实验⼿册

1.概要 介绍如何使⽤Azure OpenAI Service 的嵌⼊技术&#xff0c;创建知识库&#xff1b;以及创建必要的资源组和资源&#xff0c;包括 Form Recognizer 资源和 Azure 翻译器资源。在创建问答机器⼈服务时&#xff0c;需要使⽤已部署模型的 Azure OpenAI 资源、已存在的…

Kafka-Broker工作流程

kafka集群在启动时&#xff0c;会将每个broker节点注册到zookeeper中&#xff0c;每个broker节点都有一个controller&#xff0c;哪个controller先在zookeeper中注册&#xff0c;哪个controller就负责监听brokers节点变化&#xff0c;当有分区的leader挂掉时&#xff0c;contro…

初识MySQL数据库之用户管理

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

iMX6ULL驱动开发 | 让imx6ull开发板支持usb接口FC游戏手柄

手边有一闲置的linux开发板iMX6ULL一直在吃灰&#xff0c;不用来搞点事情&#xff0c;总觉得对不住它。业余打发时间就玩起来吧&#xff0c;总比刷某音强。从某多多上买来一个usb接口的游戏手柄&#xff0c;让开发板支持以下它&#xff0c;后续就可以接着在上面玩童年经典游戏啦…

【使用bat脚本实现批量创建文件夹、批量复制文件至对应文件夹中】

使用bat脚本实现批量创建文件夹、批量复制文件至对应文件夹中 常用cmd命令 场景一&#xff1a;在指定位置批量创建文件夹 在桌面创建一个txt文件编写创建目录代码 //在桌面"五保户结算单"的文件夹下创建名称为"1张三"的文件夹 md E:\桌面\五保户结算单\…

【类和对象】日期类总结

日期类是我们学习类和对象这部分知识的常客&#xff0c;本篇博客我们就对日期类成员函数进行全面总结 目录 一、一览Date.h函数声明 二、Date.cpp逐部分实现 一、流插入与流提取运算符重载 二、日期之间比较大小相等运算符重载 1. > 2. 3. > 4. ! 5. <…

element+vue 之动态form

1.页面部分 <div v-for"(item,index) in formList" :key"index"><el-col :span"6" v-if"item.inputType0"><el-form-item :label"item.conditionName" :prop"item.conditionCode":rules"{req…

Abaqus 中最常用的子程序有哪些 硕迪科技

在ABAQUS中&#xff0c;用户定义的子程序是一种重要的构件&#xff0c;可以将其插入到Abaqus分析中以增强该软件的功能和灵活性。这些子程序允许用户在分析过程中添加自定义材料模型、边界条件、初始化、加载等特定操作&#xff0c;以便更精准地模拟分析中的现象和现象。ABAQUS…

二叉树迭代遍历

PS:以下代码均为C实现 1.二叉树前序遍历 力扣 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 class Solution { public:vector<int> preorderTraversal(TreeNode* root) {stack<TreeNode*> st;vector<int> str;TreeNode* curroot;whil…

简单认识ELK日志分析系统

一. ELK日志分析系统概述 1.ELK 简介 ELK平台是一套完整的日志集中处理解决方案&#xff0c;将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用&#xff0c; 完成更强大的用户对日志的查询、排序、统计需求。 好处&#xff1a; &#xff08;1&#xff09;提高安全…

【leetcode】394. 字符串解码

题目链接&#xff1a;力扣 给定一个经过编码的字符串&#xff0c;返回它解码后的字符串。 编码规则为: k[encoded_string]&#xff0c;表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。 你可以认为输入字符串总是有效的&#xff1b;输入字符串中没…

MySQL 主从复制

MySQL主从复制是一种数据复制技术&#xff0c;用于将一个MySQL数据库的数据实时复制到其他MySQL数据库&#xff0c;通常一个作为主数据库&#xff08;master&#xff09;&#xff0c;其他作为从数据库&#xff08;slave&#xff09; 基本工作原理&#xff1a; 主数据库记录所有…

RabbitMQ 教程 | 第10章 网络分区

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的编码爱好者 大家好&#xff0c;我是 DevO…

【云原生】K8S二进制搭建三:高可用配置

目录 一、部署CoreDNS二、配置高可用三、配置负载均衡四、部署 Dashboard 一、部署CoreDNS 在所有 node 节点上操作 #上传 coredns.tar 到 /opt 目录中 cd /opt docker load -i coredns.tar在 master01 节点上操作 #上传 coredns.yaml 文件到 /opt/k8s 目录中&#xff0c;部…

三、JVM-如何判断对象已死问题

内存模型以及如何判定对象已死问题 体验与验证 2.4.5.1 使用visualvm visualgc插件下载链接 &#xff1a;https://visualvm.github.io/pluginscenters.html 选择对应JDK版本链接—>Tools—>Visual GC 若上述链接找不到合适的&#xff0c;大家也可以自己在网上下载对应…

面试热题(最长回文子串)

给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同&#xff0c;则该字符串称为回文字符串 输入&#xff1a;s "babad" 输出&#xff1a;"bab" 最长回文子串以前的博客已经讲过KMP算法以及比较不常见的Manacher算法…