当前位置: 首页 > news >正文

Python 数据分析——matplotlib 快速绘图

matplotlib采用面向对象的技术来实现,因此组成图表的各个元素都是对象,在编写较大的应用程序时通过面向对象的方式使用matplotlib将更加有效。但是使用这种面向对象的调用接口进行绘图比较烦琐,因此matplotlib还提供了快速绘图的pyplot模块。本节首先介绍该模块的使用方法。

为了将matplotlib绘制的图表嵌入Notebook中,需要执行下面的命令:

%matplotlib inline

使用inline模式在Notebook中绘制的图表会自动关闭,为了在Notebook的多个单元格内操作同一幅图表,需要运行下面的魔法命令:

%config InlineBackend.close_figures = False

一、使用pyplot模块绘图

matplotlib的pyplot模块提供了与MATLAB类似的绘图函数调用接口,方便用户快速绘制二维图表。我们先看一个简单的例子:

pylab模块

matplotlib还提供了一个名为pylab的模块,其中包括了许多NumPy和pyplot模块中常用的函数,方便用户快速进行计算和绘图,十分适合在IPython交互式环境中使用。

import matplotlib.pyplot as plt ❶  x = np.linspace(0, 10, 1000)  
y = np.sin(x)  
z = np.cos(x**2)  plt.figure(figsize=(8,4)) ❷  plt.plot(x,y,label="$sin(x)$",color="red",linewidth=2) ❸  
plt.plot(x,z,"b--",label="$cos(x^2)$") ❹  plt.xlabel("Time(s)") ❺  
plt.ylabel("Volt")  
plt.title("PyPlot First Example")  
plt.ylim(-1.2,1.2)  
plt.legend()  plt.show() ❻

程序的输出如图1所示。

图1 使用pyplot模块快速将数据绘制成曲线

❶首先载入matplotlib的绘图模块pyplot,并且重命名为plt。❷调用figure()创建一个Figure(图表)对象,并且它将成为当前Figure对象。也可以不创建Figure对象而直接调用接下来的plot()进行绘图,这时matplotlib会自动创建一个Figure对象。figsize参数指定Figure对象的宽度和高度,单位为英寸。此外还可以用dpi参数指定Figure对象的分辨率,即每英寸所表示的像素数,这里使用默认值80。因此本例中所创建的Figure对象的宽度为8*80 = 640个像素。

❸创建Figure对象之后,接下来调用plot()在当前的Figure对象中绘图。实际上plot()是在Axes(子图)对象上绘图,如果当前的Figure对象中没有Axes对象,将会为之创建一个几乎充满整个图表的Axes对象,并且使此Axes对象成为当前的Axes对象。plot()的前两个参数是分别表示X、Y轴数据的对象,这里使用的是NumPy数组。使用关键字参数可以指定所绘制曲线的各种属性:

·label:给曲线指定一个标签,此标签将在图示中显示。如果标签字符串的前后有字符’$',matplotlib会使用内嵌的LaTeX引擎将其显示为数学公式。

·color:指定曲线的颜色,颜色可以用英文单词或以’#‘字符开头的6位十六进制数表示,例如’#ff0000’表示红色。或者使用值在0到1范围之内的三个元素的元组来表示,例如(1.0, 0.0, 0.0)也表示红色。

·linewidth:指定曲线的宽度,可以不是整数,也可以使用缩写形式的参数名lw。

使用LaTeX语法绘制数学公式会极大地降低图表的描绘速度。

❹直接通过第三个参数’b–‘指定曲线的颜色和线型,它通过一些易记的符号指定曲线的样式。其中’b’表示蓝色,’–'表示线型为虚线。在IPython中输入plt.plot?可以查看格式化字符串以及各个参数的详细说明。

❺接下来通过一系列函数设置当前Axes对象的各个属性:

·xlabel、ylabel:分别设置X、Y轴的标题文字。

·title:设置子图的标题。

·xlim、ylim:分别设置X、Y轴的显示范围。

·legend:显示图示,即图中表示每条曲线的标签(label)和样式的矩形区域。

❻最后调用plt.show()显示绘图窗口,在Notebook中可以省略此步骤。在通常的运行情况下,show()将会阻塞程序的运行,直到用户关闭绘图窗口。

还可以调用plt.savefig()将当前的Figure对象保存成图像文件,图像格式由图像文件的扩展名决定。下面的程序将当前的图表保存为test.png,并且通过dpi参数指定图像的分辨率为120,因此输出图像的宽度为8*120 = 960个像素。

plt.savefig("test.png", dpi=120)

如果关闭了图表窗口,则无法使用savefig()保存图像。实际上不需要调用show()显示图表,可以直接用savefig()将图表保存成图像文件。使用这种方法可以很容易编写批量输出图表的程序。

savefig()的第一个参数可以是文件名,也可以是和Python的文件对象有相同调用接口的对象。例如可以将图像保存到io.BytesIO对象中,这样就得到了一个表示图像内容的字符串。这里需要使用fmt参数指定保存的图像格式。

import io  
buf = io.BytesIO() # 创建一个用来保存图像内容的BytesIO对象  
plt.savefig(buf, fmt="png") # 将图像以png格式保存到buf中  
buf.getvalue()[:20] # 显示图像内容的前20个字节  
'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x03 '

二、面向对象方式绘图

matplotlib实际上是一套面向对象的绘图库,它所绘制的图表中的每个绘图元素,例如线条、文字、刻度等在内存中都有一个对象与之对应。为了方便快速绘图,matplotlib通过pyplot模块提供了一套和MATLAB类似的绘图API,将众多绘图对象所构成的复杂结构隐藏在这套API内部。我们只需要调用pyplot模块所提供的函数就可以实现快速绘图以及设置图表的各种细节。

为了将面向对象的绘图库包装成只使用函数的API,pyplot模块的内部保存了当前图表以及当前子图等信息。可以使用gcf()和gca()获得这两个对象,它们分别是“Get Current Figure”和“Get Current Axes”开头字母的缩写。gcf()获得的是表示图表的Figure对象,而gca()获得的则是表示子图的Axes对象。

fig = plt.gcf()  
axes = plt.gca()  
print fig, axes  
Figure(640x320) Axes(0.125,0.1;0.775x0.8)

在pyplot模块中,许多函数都是对当前的Figure或Axes对象进行处理,例如前面介绍的plot()、xlabel()、savefig()等。我们可以在IPython中输入函数名并加“??”,查看这些函数的源代码以了解它们是如何调用各种对象的方法进行绘图处理的。例如下面的例子查看plot()函数的源程序,可以看到plot()函数实际上会通过gca()获得当前的Axes对象ax,然后再调用它的plot()方法来实现真正的绘图。请读者使用类似的方法查看pyplot模块的其他函数是如何对各种绘图对象进行包装的。

def plot(*args, **kwargs):  
ax = gca()  
...  
try:  
ret = ax.plot(*args, **kwargs)  
...  
finally:  
ax.hold(washold)

三、配置属性

matplotlib所绘制图表的每个组成部分都和一个对象对应,可以通过调用这些对象的属性设置方法set_*()或者pyplot模块的属性设置函数setp()来设置它们的属性值。例如plot()返回一个元素类型为Line2D的列表,下面的例子设置Line2D对象的属性:

plt.figure(figsize=(4, 3))  
x = np.arange(0, 5, 0.1)  
line = plt.plot(x, 0.05*x*x)[0] # plot返回一个列表  
line.set_alpha(0.5) # 调用Line2D对象的set_*()方法来设置属性值

上面的例子中,通过调用Line2D对象的set_alpha(),修改它在图表中对应曲线的透明度。下面的语句同时绘制正弦和余弦两条曲线,lines是一个有两个Line2D对象的列表:

lines = plt.plot(x, np.sin(x), x, np.cos(x))

调用setp()可以同时配置多个对象的属性,这里同时设置两条曲线的颜色和线宽:

plt.setp(lines, color="r", linewidth=4.0)

图2 配置绘图对象的属性

同样,可以通过调用Line2D对象的get_*()或者通过plt.getp()来获取对象的属性值:

print line.get_linewidth()  
print plt.getp(lines[0], "color") # 返回color属性  
2.0  
r

注意getp()和setp()不同,它只能对一个对象进行操作,它有两种用法:

·指定属性名:返回对象的某个属性的值。

·不指定属性名:输出对象的所有属性和值。

下面通过getp()查看Figure对象的属性:

f = plt.gcf()  
plt.getp(f)  
agg_filter = None  
alpha = None  
animated = False  
axes = [<matplotlib.axes._subplots.AxesSubplot object at ...  
...

Figure对象的axes属性是一个列表,它保存图表中的所有子图对象。下面的程序查看当前图表的axes属性,它就是gca()所获得的当前子图对象:

print plt.getp(f, "axes"), plt.getp(f, "axes")[0] is plt.gca()  
[<matplotlib.axes._subplots.AxesSubplot object at 0x05DE5790>] True

用plt.getp()可以继续获取AxesSubplot对象的属性,例如它的lines属性为子图中的Line2D对象列表:

alllines = plt.getp(plt.gca(), "lines")  
print alllines, alllines[0] is line # 其中的第一条曲线就是最开始绘制的那条曲线  
<a list of 3 Line2D objects> True

通过这种方法可以很容易查看对象的属性值以及各个对象之间的关系,找到需要配置的属性。因为matplotlib实际上是一套面向对象的绘图库,因此也可以直接获取对象的属性,例如:

print f.axes, len(f.axes[0].lines)  
[<matplotlib.axes._subplots.AxesSubplot object at 0x05DE5790>] 3

四、绘制多子图

一个Figure对象可以包含多个子图(Axes),在matplotlib中用Axes对象表示一个绘图区域,在本书中称之为子图。在前面的例子中,Figure对象只包括一个子图。可以使用subplot()快速绘制包含多个子图的图表,它的调用形式如下:

subplot(numRows, numCols, plotNum)

图表的整个绘图区域被等分为numRows行和numCols列,然后按照从左到右、从上到下的顺序对每个区域进行编号,左上区域的编号为1。plotNum参数指定所创建Axes对象的区域。如果numRows、numCols和plotNum三个参数都小于10,则可以把它们缩写成一个整数,例如subplot(323)和subplot(3,2,3)的含义相同。如果新创建的子图和之前创建的子图区域有重叠的部分,之前的子图将被删除。

下面的程序创建如图3(左)所示的3行2列共6个子图,并通过axisbg参数给每个子图设置不同的背景颜色。

图3 在Figure对象中创建多个子图

for idx, color in enumerate(“rgbyck”):

plt.subplot(321+idx, axisbg=color)

如果希望某个子图占据整行或整列,可以如下调用subplot(),程序的输出如图3(右)所示。

plt.subplot(221) # 第一行的左图  
plt.subplot(222) # 第一行的右图  
plt.subplot(212) # 第二整行

在绘图窗口的工具栏中,有一个名为“Configure Subplots”的按钮,单击它会弹出调节子图间距和子图与图表边框距离的对话框。也可以在程序中调用subplots_adjust()调节这些参数,它有left、right、bottom、top、wspace和hspace共6个参数,这些参数与对话框中的各个控件对应。参数的取值范围为0到1,它们是以图表绘图区域的宽和高进行正规化之后的坐标或长度。

subplot()返回它所创建的Axes对象,我们可以将这些对象用变量保存起来,然后用sca()交替让它们成为当前Axes对象,并调用plot()在其中绘图。如果需要同时绘制多幅图表,可以给figure()传递一个整数参数来指定Figure对象的序号。如果序号所指定的Figure对象已经存在,将不创建新的对象,而只是让它成为当前的Figure对象。下面的程序演示了依次在不同图表的不同子图中绘制曲线:

plt.figure(1) # 创建图表1  
plt.figure(2) # 创建图表2  
ax1 = plt.subplot(121) # 在图表2中创建子图1  
ax2 = plt.subplot(122) # 在图表2中创建子图2  x = np.linspace(0, 3, 100)  
for i in xrange(5):  
plt.figure(1)  ❶选择图表1  
plt.plot(x, np.exp(i*x/3))  
plt.sca(ax1)   ❷选择图表2的子图1  
plt.plot(x, np.sin(i*x))  
plt.sca(ax2)  # 选择图表2的子图2  
plt.plot(x, np.cos(i*x))

也可以不调用sca()指定当前子图,而直接调用ax1和ax2的plot()方法来绘图。

首先通过figure()创建了两个图表,它们的序号分别为1和2。然后在图表2中创建了左右并排的两个子图,并用变量ax1和ax2保存。

在循环中,❶先调用figure(1)让图表1成为当前图表,并在其中绘图。❷然后调用sca(ax1)和sca(ax2)分别让子图ax1和ax2成为当前子图,并在其中绘图。当它们成为当前子图时,包含它们的图表2也自动成为当前图表,因此不需要调用figure(2)。这样依次在图表1和图表2的两个子图之间切换,逐步在其中添加新的曲线,效果如图4所示。

图4 同时在多幅图表、多个子图中进行绘图

此外subplots()可以一次生成多个子图,并返回图表对象和保存子图对象的数组。在下面的例子中,axes是一个形状为(2, 3)的数组,每个元素都是一个子图对象,可以利用Python的赋值功能将这个数组中的每个元素用一个变量表示:

fig, axes = plt.subplots(2, 3)  
[a, b, c], [d, e, f] = axes  
print axes.shape  
print b  
(2, 3)  
Axes(0.398529,0.536364;0.227941x0.363636)

还可以调用subplot2grid()进行更复杂的表格布局。表格布局和在Excel或Word中绘制表格十分类似,其调用参数如下:

subplot2grid(shape, loc, rowspan=1, colspan=1, **kwargs)

其中,shape为表示表格形状的元组:(行数, 列数)。loc为子图左上角所在的坐标:(行, 列)。rowspan和colspan分别为子图所占据的行数和列数。在下面的例子中,在3×3的网格上创建5个子图,在每个子图中间显示该子图对应的变量名,如图5所示:

图5 使用subplot2grid()创建表格布局

fig = plt.figure(figsize=(6, 6))  
ax1 = plt.subplot2grid((3, 3), (0, 0), colspan=2)  
ax2 = plt.subplot2grid((3, 3), (0, 2), rowspan=2)  
ax3 = plt.subplot2grid((3, 3), (1, 0), rowspan=2)  
ax4 = plt.subplot2grid((3, 3), (2, 1), colspan=2)  
ax5 = plt.subplot2grid((3, 3), (1, 1))

五、配置文件

绘制一幅图需要对许多对象的属性进行配置,例如颜色、字体、线型等。在前面的绘图程序中,并没有逐一对这些属性进行配置,而是直接采用matplotlib的默认配置。matplotlib将这些默认配置保存在一个名为matplotlibrc的配置文件中,通过修改配置文件,可以修改图表的默认样式。

在matplotlib中可以使用多个matplotlibrc配置文件,它们的搜索顺序如下:顺序靠前的配置文件将会被优先采用。

·当前路径:程序的当前路径。

·用户配置路径:通常在用户文件夹的.matplotlib目录下,可以通过环境变量MATPLOTLIBRC修改它的位置。

·系统配置路径:保存在matplotlib的安装目录下的mpl-data中。

通过下面的语句可以获取用户配置路径:

from os import path  
path.abspath(matplotlib.get_configdir())  
u'C:\\Users\\RY\\Dropbox\\scipybook2\\settings\\.matplotlib'

通过下面的语句可以获得目前使用的配置文件的路径:

path.abspath(matplotlib.matplotlib_fname())  
u'C:\\Users\\RY\\Dropbox\\scipybook2\\settings\\.matplotlib\\matplotlibrc'

如果使用文本编辑器打开此配置文件,就会发现它实际上是一个字典。为了对众多的配置进行区分,字典的键根据配置的种类,用“.”分为多段。配置文件的读入可以使用rc_params(),它返回一个配置字典:

print(matplotlib.rc_params())  
agg.path.chunksize: 0  
animation.avconv_args: []  
animation.avconv_path: avconv  
animation.bitrate: -1  
...

在matplotlib模块载入时会调用rc_params(),并把得到的配置字典保存到rcParams变量中:

print(matplotlib.rcParams)  
agg.path.chunksize: 0  
animation.avconv_args: []  
animation.avconv_path: avconv  
animation.bitrate: -1  
...

matplotlib将使用rcParams字典中的配置进行绘图。用户可以直接修改此字典中的配置,所做的改变会反映到此后创建的绘图元素。例如下面的脚本所绘制的折线将带有圆形的点标识符:

matplotlib.rcParams["lines.marker"] = "o"  
plt.plot([1,2,3,2])

为了方便对配置字典进行设置,可以使用rc()。下面的例子同时配置点标识符、线宽和颜色:

matplotlib.rc("lines", marker="x", linewidth=2, color="red")

如果希望恢复到matplotlib载入时从配置文件读入的默认配置,可以调用rcdefaults():

matplotlib.rcdefaults()

如果手工修改了配置文件,希望重新从配置文件载入最新的配置,可以调用:

matplotlib.rcParams.update( matplotlib.rc_params() )

通过pyplot模块也可以使用rcParams、rc和rcdefaults。

matplotlib.style模块提供绘图样式切换功能,所有可选样式可以通过available获得:

from matplotlib import style  
print style.available  
[u'dark_background', u'bmh', u'grayscale', u'ggplot', u'fivethirtyeight']

调用use()函数即可切换样式,例如下面使用ggplot样式绘图,效果如图6所示。

图6 使用ggplot样式绘图

style.use("ggplot")

六、在图表中显示中文

matplotlib的默认配置文件中所使用的字体无法正确显示中文,可以通过下面几种方法设置中文字体:

·在程序中直接指定字体。

·在程序开头修改配置字典rcParams。

·修改配置文件。

在matplotlib中可以通过字体名指定字体,而每个字体名都与一个字体文件相对应。通过下面的程序可以获得所有可用字体的列表:

from matplotlib.font_manager import fontManager  
fontManager.ttflist[:6]  
[<Font 'cmss10' (cmss10.ttf) normal normal 400 normal>,  
<Font 'cmb10' (cmb10.ttf) normal normal 400 normal>,  
<Font 'cmex10' (cmex10.ttf) normal normal 400 normal>,  
<Font 'STIXSizeFourSym' (STIXSizFourSymBol.ttf) normal normal 700 normal>,  
<Font 'Bitstream Vera Serif' (VeraSeBd.ttf) normal normal 700 normal>,  
<Font 'Bitstream Vera Sans' (VeraIt.ttf) oblique normal 400 normal>]

ttflist是matplotlib的系统字体列表。其中每个元素都是表示字体的Font对象,下面的程序显示了第一个字体文件的全路径和字体名,由路径可知它是matplotlib自带的字体:

print fontManager.ttflist[0].name  
print fontManager.ttflist[0].fname  
cmss10  
C:\WinPython-32bit-2.7.9.2\python-2.7.9\lib\site-packages\matplotlib\mpl-data\fonts\ttf\cmss10.ttf

下面的程序使用字体列表中的字体显示中文文字,效果图7所示。

图7 显示系统中所有的中文字体名

scpy2/matplotlib/chinese_fonts.py:显示系统中所有文件大于1MB的TTF字体,请读者使用该程序查询计算机中可使用的中文字体名。

import os  
from os import path  fig = plt.figure(figsize=(8, 7))  
ax = fig.add_subplot(111)  
plt.subplots_adjust(0, 0, 1, 1, 0, 0)  
plt.xticks([])  
plt.yticks([])  
x, y = 0.05, 0.05  
fonts = [font.name for font in fontManager.ttflist if  
path.exists(font.fname) and os.stat(font.fname).st_size>1e6] ❶  
font = set(fonts)  
dy = (1.0 - y) / (len(fonts) // 4 + (len(fonts)%4 != 0))  for font in fonts:  
t = ax.text(x, y + dy / 2, u"中文字体",  
{'fontname':font, 'fontsize':14}, transform=ax.transAxes) ❷  
ax.text(x, y, font, {'fontsize':12}, transform=ax.transAxes)  
x += 0.25  
if x >= 1.0:  
y += dy  
x = 0.05  
plt.show()

❶利用os模块中的stat()获取字体文件的大小,并保留字体列表中所有大于1MB的字体文件。由于中文字体文件通常都很大,因此使用这种方法可以粗略地找出所有的中文字体文件。

❷调用子图对象的text()在其中添加文字,注意文字必须是Unicode字符串。通过一个描述字体的字典指定文字的字体:'fontname’键对应的值就是字体名。

由于matplotlib只搜索TTF字体文件,因此无法通过上述方法使用系统中安装的许多复合TTC字体文件。可以直接创建使用字体文件的FontProperties对象,并使用此对象指定图表中的各种文字的字体。下面是一个例子:

from matplotlib.font_manager import FontProperties  
font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=14) ❶  
t = np.linspace(0, 10, 1000)  
y = np.sin(t)  
plt.close("all")  
plt.plot(t, y)  
plt.xlabel(u"时间", fontproperties=font) ❷  
plt.ylabel(u"振幅", fontproperties=font)  
plt.title(u"正弦波", fontproperties=font)  
plt.show()

❶创建一个描述字体属性的FontProperties对象,并设置其fname属性为字体文件的绝对路径。❷通过fontproperties参数将FontProperties对象传递给显示文字的函数。

还可以通过字体工具将TTC字体文件分解为多个TTF字体文件,并将其复制到系统的字体文件夹中。为了缩短启动时间,matplotlib不会每次启动时都重新扫描所有的字体文件并创建字体列表,因此在复制完字体文件之后,需要运行下面的语句重新创建字体列表:

from matplotlib.font_manager import _rebuild  
_rebuild()

还可以直接修改配置字典,设置默认字体,这样就不需要在每次绘制文字时设置字体了。例如:

plt.rcParams["font.family"] = "SimHei"  
plt.plot([1,2,3])  
plt.xlabel(0.5 ,0.5, u"中文字体")

或者修改上节介绍的配置文件,修改其中的font.family配置为SimHei,注意SimHei是字体名,请读者运行前面的代码来查看系统中所有可用的中文字体名。

---------------------------END---------------------------

题外话

在这里插入图片描述

感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。

👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img
img

二、Python必备开发工具

工具都帮大家整理好了,安装就可直接上手!img

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、Python视频合集

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

五、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。img

六、面试宝典

在这里插入图片描述

在这里插入图片描述

简历模板在这里插入图片描述

👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

如有侵权,请联系删除。

相关文章:

Python 数据分析——matplotlib 快速绘图

matplotlib采用面向对象的技术来实现,因此组成图表的各个元素都是对象,在编写较大的应用程序时通过面向对象的方式使用matplotlib将更加有效。但是使用这种面向对象的调用接口进行绘图比较烦琐,因此matplotlib还提供了快速绘图的pyplot模块。…...

uniapp小程序位置信息配置

uniapp 小程序获取当前位置信息报错 报错信息: getLocation:fail the api need to be declared in the requiredPrivateInfos field in app.json/ext.json 需要在manifest.json配置文件中进行配置:...

《基于 Vue 组件库 的 Webpack5 配置》1.模式 Mode 和 vue-loader

一定要配置 模式 Mode,这里有个小知识点,环境变量 process.env.NODE_ENV module.exports {mode: production,// process.env.NODE_ENV 或 development, }一定要配置 vue-loader Vue Loader v15 现在需要配合一个 webpack 插件才能正确使用; …...

01.sqlite3学习——数据库概述

目录 重点概述总结 数据库标准介绍 什么是数据库? 数据库是如何存储数据的? 数据库是如何管理数据的? 数据库系统结构 常见关系型数据库管理系统 关系型数据库相关知识点 数据库与文件存储数据对比 重点概述总结 数据库可以理解为操…...

视频集中存储/云存储平台EasyCVR国标GB28181协议接入的报文交互数据包分析

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。视频汇聚融合管理…...

容器技术,1. Docker,2. Kubernetes(K8s):

目录 容器技术 1. Docker: 2. Kubernetes(K8s): Docker和Kubernetes 容器的主要应用场景有哪些? 容器技术 有效的将单个操作系统的资源划分到孤立的组中,以便更好的在孤立的组之间平衡有冲突的资源使…...

Jtti :sql server怎么备份数据库?

在 SQL Server 中备份数据库是一项重要的操作,它可以确保你的数据在意外情况下得以恢复。以下是在 SQL Server 中备份数据库的基本步骤: 使用 SQL Server Management Studio (SSMS) 进行备份: 打开 SQL Server Management Studio(SSMS)并连接…...

Stable Diffusion 系列教程 | 打破模型壁垒

目录 1.模型基本分类 1.1 CheckPoint 大模型/底模型/主模型 1.2 VAE美化模型/变分自编码器 1.3 HyperNetwork 超网络 1.4 embeddings(/Textual Inversion) 嵌入式向量 1.5 loRa 低秩适应模型 2. 下载途径和渠道 2.1 C站 2.1.1 如何筛选到自己需…...

Cypress 做 e2e 测试,如何在获得某个 checkbox 后先判断它是否被 check 然后再更改它的状态?

比如如果这个 checkbox 已经被 check 了,就不做操作,否则将它 check。 我们假设这个 checkbox 的 data-testid 属性是 VendorCodeCheckbox-0-test-id。Cypress 的代码如下: cy.getByTestId(VendorCodeCheckbox-0-test-id).shadow().find([r…...

基于PIC单片机温度-脉搏-DS18B20温度-液晶12864显示(proteus仿真+源程序)

一、系统方案 1、上电初始化液晶第一行显示脉搏,第二行显示温度,第三行显示模式,第四行显示强度;按下K1按键可以选择模式,催眼模式或治疗模式。 2、治疗模块下,可以通过K2、K3修改强度。 二、硬件设计 原理…...

【C++进阶(一)】STL大法以及string的使用

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习C   🔝🔝 STL标准库 1. 前言2. STL库的版本以及缺陷3. ST…...

leetcode做题笔记99. 恢复二叉搜索树

给你二叉搜索树的根节点 root ,该树中的 恰好 两个节点的值被错误地交换。请在不改变其结构的情况下,恢复这棵树 。 思路一:模拟题意 int midOrder(struct TreeNode **pre, struct TreeNode **err1, struct TreeNode **err2, struct TreeNo…...

24 | 紧跟时代步伐:微服务模式下API测试要怎么做?

微服务架构(Microservice Architecture) 微服务是一种架构风格。在微服务架构下,一个大型复杂软件系统不再由一个单体组成,而是由一系列相互独立的微服务组成。其中,各个微服务运行在自己的进程中,开发和部…...

【论文阅读】POIROT:关联攻击行为与内核审计记录以寻找网络威胁(CCS-2019)

POIROT: Aligning Attack Behavior with Kernel Audit Records for Cyber Threat Hunting CCS-2019 伊利诺伊大学芝加哥分校、密歇根大学迪尔伯恩分校 Milajerdi S M, Eshete B, Gjomemo R, et al. Poirot: Aligning attack behavior with kernel audit records for cyber thre…...

K8S cluster with multi-masters on Azure VM

拓扑参考: 在 Azure VM 实例上部署 KubeSphere 基础模板 需要修改 IP 地址和 VM Image的可以在模板中修改。 {"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#","contentVersion": &q…...

初阶c语言:趣味扫雷游戏

目录 前言 制作菜单 构建游戏选择框架 实现游戏功能 模块化编程:查看前节三子棋的内容 初始化雷区 ​编辑 优化棋盘 随机埋入地雷 点击后的决策 实现此功能代码 game();的安排 前言 《扫雷》是一款大众类的益智小游戏&…...

JVM——内存模型

1.java内存模型 1.1 原子性 1.2 问题分析 这里与局部变量自增不同,局部变量调用iinc是在局部变量表槽位上进行自增。 静态变量是在操作数栈自增。 这里的主内存和工作内存时再JMM里的说法。 因为操作系统是时间片切换的多个线程轮流使用CPU. 1.3解决方法 JMM中…...

java八股文面试[JVM]——元空间

JAVA8为什么要增加元空间 为什么要移除永久代? 知识来源: 【2023年面试】JVM8为什么要增加元空间_哔哩哔哩_bilibili...

科技云报道:云计算下半场,公有云市场生变,私有云风景独好

科技云报道原创。 大数据、云计算、人工智能,组成了恢弘的万亿级科技市场。这三个领域,无论远观近观,都如此性感和魅力,让一代又一代创业者为之杀伐攻略。 然而高手过招往往一瞬之间便已胜负知晓,云计算市场的巨幕甫…...

Oracle 如何给大表添加带有默认值的字段

一、讲故事 你是否遇到过开发人员添加字段,导致数据库锁表问题? 但是令开发疑惑的事,他们添加字段,有的时候很快,有的时候很慢? 为什么呢? 询问得知,**加的慢时候是带上了default默…...

记录Taro大坑2丢失api无法启动

现象 解决方案 看了很多。很多说要改成一致的版本号。其实没什么用。 正确方案 再新建一个模板跑起来对比config的配置,以及package.json发现关闭预编译即可。预编译导致api丢失...

Java-Maven-解决maven deploy时报 401 Reason Phrase Unauthorized 错误

Java-Maven-解决maven deploy时报 401 Reason Phrase Unauthorized 错误 环境 Java JDK 1.8Maven 3.3.9 引言 项目需要打成jar包上传到私服,供其它项目引用。此时需要执行 mvn clean deploy 命令,执行过程中报 401 错误。 解决401错误 报错信息 执…...

【数据结构】 栈(Stack)的应用场景

文章目录 🌏前言🍀改变元素的序列🚩场景一📌解析: 🚩场景二📌解析: 🎍将递归转化为循环🌳[括号匹配](https://leetcode.cn/problems/valid-parentheses/)&…...

人力资源小程序的设计原则与实现方法

随着移动互联网的快速发展,小程序成为了各行各业推广和服务的新利器。对于人力资源行业来说,开发一款定制化的小程序不仅可以提升服务效率,还可以增强品牌形象和用户粘性。那么,如何定制开发人力资源类的小程序呢?下面…...

检查Javascript对象数组中是否存在对象值,如果没有向数组添加新对象

需求: 如果我有以下对象数组: [ { id: 1, username: fred }, { id: 2, username: bill }, { id: 2, username: ted } ]有没有办法循环遍历数组,以检查特定的用户名值是否已经存在,如果它什么都不做,但是如果它没有用…...

UG\NX二次开发 使用录制功能录制操作记录时,如何设置默认的开发语言?

文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,C\C,Qt-CSDN博客 简介: NX二次开发使用BlockUI设计对话框时,如何设置默认的代码语言? 效果: 方法: 依次打开“文件”->“实用…...

【业务功能篇83】微服务SpringCloud-ElasticSearch-Kibanan-docke安装-应用层实战

五、ElasticSearch应用 1.ES 的Java API两种方式 Elasticsearch 的API 分为 REST Client API(http请求形式)以及 transportClient API两种。相比来说transportClient API效率更高,transportClient 是通过Elasticsearch内部RPC的形式进行请求…...

VBJSON报错:缺少:语句结束

项目中使用JSON库VBJSON时报错: 编译错误:缺少:语句结束 cJSONScript和cStringBuilder报相同的错误,都在第一行: VERSION 1.0 CLASS 研究了半天没啥结果,之前使用这个库的时候没有什么问题,所以判定是当前…...

Docker安装ES+kibana8.9.1

参考:基于Docker安装Elasticsearch【保姆级教程、内含图解】_docker elasticsearch_Acloasia的博客-CSDN博客 创建网络 docker network create es-net 基于Docker安装Elasticsearch 拉取镜像 docker pull elasticsearch:8.9.1 挂载文件 mkdir -p /usr/local/e…...

12. Oracle中case when详解

格式: case expression when condition_01 then result_01 when condition_02 then result_02 ...... when condition_n then result_n else result_default end 表达式expression符合条件condition_01,则返回…...

【电路设计】220V AC转低压DC电路概述

前言 最近因项目需要,电路板上要加上一个交流220V转低压直流,比如12V或者5V这种。一般来说,比较常见也比较简单的做法是使用一个变压器将220V AC进行降压,比如降到22V AC,但是很遗憾的是,支持220V的变压器一般体积很大,而板子留给电源部分的面积又非常有限,所以不得不研…...

网络地址转换NAT-动态NAT的使用范围和配置-思科EI,华为数通

网络地址转换NAT-动态NAT的使用范围和配置 什么是动态NAT? 使用公有地址池,并以先到先得的原则分配这些地址。当具有私有 IP 地址的主机请求访问 Internet 时,动态 NAT 从地址池中选择一个未被其它主机占用的 IP 地址一对一的转化。当数据会话…...

远程连接虚拟机中ubuntu报错:Network error:Connection refused

ping检测一下虚拟机 可以ping通,说明主机是没问题 #检查ssh是否安装: ps -e |grep ssh发现ssh没有安装 #安装openssh-server sudo apt-get install openssh-server#启动ssh service ssh startps -e |grep ssh检查一下防火墙 #防火墙状态查看 sudo ufw…...

快速排序三种思路详解!

一、快速排序的介绍 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中 的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,…...

【二叉树入门指南】链式结构的实现

【二叉树入门指南】链式结构的实现 一、前置说明二、二叉树的遍历2.1前序遍历2.2中序遍历2.3 后序遍历 三、以前序遍历为例,递归图解四、层序遍历五、节点个数以及高度等5.1 二叉树节点个数5.2二叉树叶子节点个数5.3 二叉树第k层节点个数5.4 二叉树查找值为x的节点5…...

【位运算】算法实战

文章目录 一、算法原理常见的位运算总结 二、算法实战1. leetcode面试题01.01. 判断字符是否唯一2. leetcode268 丢失的数字3. leetcode371 两整数之和4. leetcode004 只出现一次的数字II5. leetcode面试题17.19. 消失的两个数字 三、总结 一、算法原理 计算机中的数据都以二进…...

C++构建系统

收集C构建系统(2023): 跟我一起写Makefile (PDF重制版)CMake tutorialConan, software package manager for C and C developersvcpkg-repovcpkgGoogle Bazel Build System { Fast, Correct } — Choose twoGN gn_quick_start当前Chromium构建系统 GYP Generate You…...

“深入探索JVM内部机制:理解Java虚拟机的运行原理“

标题:深入探索JVM内部机制:理解Java虚拟机的运行原理 摘要:本篇博客将深入探索Java虚拟机(JVM)的内部机制,帮助读者理解JVM的运行原理。我们将介绍JVM的组成结构,包括类加载器、运行时数据区域…...

java八股文面试[JVM]——双亲委派模型

1.当AppClassLoader去加载一个class时,它首先不会自己去尝试加载这个类,而是把类加载请求委托给父加载器ExtClassLoader去完成。 2.当ExtClassLoader去加载一个class时,它首先也不会去尝试加载这个类,而是把类加载请求委托给父加载…...

NLP与大模型主题全国师资培训班落地,飞桨持续赋能AI人才培养

为了推动大模型及人工智能相关专业人员的培养,8月11日-8月13日,由中国计算机学会主办、机械工业出版社、北京航空航天大学、百度飞桨联合承办 “CCF群星计划之文心高校行- NLP与大模型”主题师资培训班(以下简称培训班)在北京天信…...

Jupyter Notebook 配置根目录

注:本文是在 Windows 10 上配置 Jupyter Notebook 打开的默认根目录,Linux 同。 步骤一:创建 Jupyter Notebook 配置文件 使用以下命令创建 Jupyter Notebook 配置文件(如果尚未创建): jupyter notebook …...

算法 位运算

文章目录 一、&&#xff08;按位与&#xff09;运算符二、|&#xff08;按位或&#xff09;运算符三、^&#xff08;异或&#xff09;运算符四、~&#xff08;取反&#xff09;运算符五、<<&#xff08;左移&#xff09;运算符六、>>&#xff08;右移&#xff…...

Linux 虚拟机常用命令

一、文件/文件夹管理 1. ls命令 就是 list 的缩写&#xff0c;通过 ls 命令不仅可以查看 linux 文件夹包含的文件&#xff0c;而且可以查看文件权限(包括目录、文件夹、文件权限)查看目录信息等等。 ls -a 列出目录所有文件&#xff0c;包含以.开始的隐藏文件ls -A 列出除.…...

解决抖音semi-ui的Input无法获取到onChange事件

最近在使用semi-ui框架的Input实现一个上传文件功能时遇到了坑&#xff0c;就是无法获取到onChange事件&#xff0c;通过console查看只是拿到了一个文件名。但若是把<Input>换成原生的<input>&#xff0c;就可以正常获取到事件。仔细看了下官方文档&#xff0c;发现…...

免费的png打包plist工具CppTextu,一款把若干资源图片拼接为一张大图的免费工具

经常做游戏打包贴图的都知道&#xff0c;要把图片打包为一张或多张大图&#xff0c;要使用打包工具TexturePacker。 TexturePacker官方版可以直接导入PSD、SWF、PNG、BMP等常见的图片格式&#xff0c;主要用于网页、游戏和动画的制作&#xff0c;它可以将多个小图片汇聚成一个…...

深层次分析字符数组和字符串的区别是什么?

前言 &#xff08;1&#xff09;休闲时刻刷B站&#xff0c;看到一个卖课的&#xff0c;发视频问&#xff0c;char arr1[]{‘H’,‘E’,‘L’,‘L’,‘O’};和char arr2[]“HELLO”;区别是什么。 &#xff08;2&#xff09;看那个卖课博主一顿分析&#xff0c;最后成功得出&…...

Redis 的主从复制、哨兵模式、集群脑裂

主从复制 主从复制是 Redis 高可用服务最基础的保证&#xff0c;将一台 Redis 主服务器&#xff0c;同步数据到多台 Redis 从服务器上&#xff0c;即一主多从的模式&#xff0c;且主从服务器之间采用的是「读写分离」的方式。 主服务器可以进行读写操作&#xff0c;当发生写操…...

Pycharm通过SSH配置centos上Spark环境

直接在shell进行pyspark进行编程&#xff0c;程序没有办法写得太长&#xff0c;而且我们希望能够实现一个及时给出结果的编程环境&#xff0c;可以使用pycharm连接centos上的spark&#xff0c;进行本地编程&#xff0c;同步到centos系统中运行程序&#xff0c;并把结果返回pych…...

leetcode做题笔记98. 验证二叉搜索树

给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 思路一&#xff1a;递归 …...

C# 中Lambda中的的匿名函数

/// <summary>/// 根据设备号&#xff0c;获取故障列表/// </summary>/// <param name"scanCode">主键</param>/// <returns></returns>[HttpGet]public async Task<IActionResult> GetItemPageList(string scanCode){//v…...