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学习资料》免费赠送🆓!(安全链接,放心点击)

如有侵权,请联系删除。

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

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

相关文章

《vue3实战》在created生命周期中运用slice()方法结合element plus组件实现电影评价系统的分页

目录 前言 电影评价系统的分页是什么?它具体的作用体现在哪些方面? 一、slice的含义、语法和作用以及created的作用 slice是什么?slice有什么语法?slice的作用体现在哪些方面? created生命周期的作用:…

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…

云计算存储类型

一、共享存储模式 NAS: ①一种专门用于存储和共享文件的设备,它通过网络连接到计算机或其他设备, 提供了一个中心化的存储解决方案 ②存储网络使用IP网络 ,数据存储共享基于文件 ③本质上为:NFS和CIFS文件共享服务器 ④提供的不是一个磁盘块…

python使用 flask+vue 制作前后端分离图书信息管理系统

目录标题 前言制作前后端分离图书信息管理系统的思路:素材代码效果展示 后端部分接口部分前端部分尾语 前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 哈喽兄弟们,今天咱们来用Python实现一个前后端分离的图书信息管理系统。 制作前后端分离图书信…

【IEEE会议】2023年第三届IEEE数字化社会与智能系统国际学术会议(DSInS 2023)

2023年第三届IEEE数字化社会与智能系统国际学术会议(DSInS 2023) 2023 3rd International Conference on Digital Society and Intelligent Systems 由西南交通大学主办,悉尼科技大学、四川大学、中南大学社会计算研究中心、西南财经大学、武汉理工大学…

React 18 用 State 响应输入

参考文章 用 State 响应输入 React 控制 UI 的方式是声明式的。不必直接控制 UI 的各个部分,只需要声明组件可以处于的不同状态,并根据用户的输入在它们之间切换。这与设计师对 UI 的思考方式很相似。 声明式 UI 与命令式 UI 的比较 当设计 UI 交互时…

《存储IO路径》专题:数据魔法师DMA

初识DMA 大家好,今天我要给大家介绍一位在计算机世界中不可或缺的魔法师——DMA(Direct Memory Access)。让我们一起揭开这位魔法师的神秘面纱,看看它是如何让数据在内存之间自由穿梭的。 DMA这位魔法师可是大有来头。在现代计算机系统中,CPU、内存和各种设备之间需要进…

线性代数的学习和整理4: 求逆矩阵的多种方法汇总

目录 原始问题:如何求逆矩阵? 1 EXCEL里,直接可以用黑盒表内公式 minverse() 数组公式求A- 2 非线性代数方法:解方程组的方法 3 增广矩阵的方法 4 用行列式的方法计算(未验证) 5 A-1/|A|*A* &…

redis持久化机制 事务详解

目录 前言: 持久化机制 RDB(Redis DataBase) 手动触发 save bgsave 自动触发 RDB特点 AOF(append only file) 缓冲区刷新策略 重写机制 aof重写流程 混合持久化 事务 事务操作命令 WATCH WATCH实现原…

【Hello Algorithm】堆和堆排序

本篇博客简介: 讲解堆和堆排序相关算法 堆和堆排序 堆堆的概念堆的性质堆的表示形式堆的增加删除堆的最大值 堆排序堆排序思路时间复杂度为N的建堆方法已知一个近乎有序的数组 使用最佳排序方法排序 堆 堆的概念 这里注意!!! 这…

UG\NX二次开发 使用BlockUI设计对话框时,如何设置默认的开发语言?

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

【WSN无线传感器网络恶意节点】使用 MATLAB 进行无线传感器网络部署研究

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

React 全栈体系(三)

第二章 React面向组件编程 四、组件三大核心属性3: refs与事件处理 1. 效果 需求: 自定义组件, 功能说明如下: 点击按钮, 提示第一个输入框中的值当第2个输入框失去焦点时, 提示这个输入框中的值 2. 理解 组件内的标签可以定义ref属性来标识自己 3. 编码 3.1 字符串形式…

Gradle 如何配置全局 mavenCentral()

我们都知道 Gradle 会使用 Maven 的中央仓库。 在 Gradle 的配置文件中,通常有一个 mavenCentral() 如果我们想把 mavenCentral() 的仓库地址全局替换掉别的仓库地址的话。 我们可以在 C:\Users\yhu\.gradle 目录下创建一个 init.gradle 文件。 文件中的代码为&a…

中国移动秋招攻略,网申测评和面试

中国移动秋招简介 按照往年的惯例来看,移动会在每年的8月份发布相关秋招信息,紧接着考生并进行网申,面试的时间跨度也非常的长,大概是9~12月份。整个招聘流程,包括投递简历网申,笔试测评,面试录…

在项目中快速搭建机器学习的流程

在软件开发领域,机器学习框架发挥着关键作用,为开发人员提供强大的人工智能工具、库和算法,以有效地利用机器学习的潜力。从本质上讲,机器学习使计算机能够从数据中学习并做出预测或决策,而无需明确编程。 机器学习框…

idea 对JavaScript进行debug调试

文章目录 1.新增 JavaScript Debug 配置2.配置访问地址3.访问url. 打断点测试 前言 : 工作中接手别人的前端代码没有注释,看浏览器的network或者console切来切去,很麻烦,可以试试idea自带的javscript debug功能。 1.新增 JavaScript Debug 配…

芯科科技推出专为Amazon Sidewalk优化的全新片上系统和开发工具,加速Sidewalk网络采用

芯科科技为Sidewalk开发提供专家级支持 中国,北京 - 2023年8月22日 – 致力于以安全、智能无线连接技术,建立更互联世界的全球领导厂商Silicon Labs(亦称“芯科科技”,NASDAQ:SLAB)今日在其一年一度的第四…

微信支付

文档地址:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter9_1 封装的工具类 package com.qf.fmall.utils;import cn.hutool.core.util.XmlUtil; import cn.hutool.http.HttpRequest; import org.apache.shiro.crypto.hash.Md5Hash;import java.util.…

情人节特别篇:用c++弹奏音乐“海阔天空”与“孤勇者”

W...Y的主页 💕 代码库分享 😊 目录 孤勇者 海阔天空 今天是2023年8月22日七夕情人节,但是对我来说就是再普通不过的日子。我相信有很多人期待这一天的到来,和自己的对象出去享受快乐时光。但是我只有一个人独孤的度过短暂的时…