matplotlib从起点出发(10)_Tutorial_10_Layout

news2024/12/23 16:20:50

使用受约束的绘图干净整洁地将图形合适排列。

受约束的布局会自动调整子图,以便刻度标签、图例和颜色条等装饰不会重叠,同时仍保留用户请求的逻辑布局。

受约束布局类似于“紧密布局”,但它要更灵活。它处理放置在多个轴上的Axes(放置颜色条)嵌套布局(子图)和跨越行或列的Axes(子图拼接),努力将Axes中的脊对齐在同一行或同一列中。此外,压缩布局将尝试将固定纵横比Axes移动得更近。本文档介绍了这些功能,并在最后讨论了一些实现的细节。

在将任何Axes添加到图窗之前,通常需要激活受约束的布局,有两种方法可以做到这一点。

  • 使用相应的参数进行子绘图、图形的子图拼接,例如:
plt.subplots(layout="constrained")
  • 通过rcParams激活它,例如:
plt.rcParams['figure.constrained_layout.use'] = True

以下各节将详细介绍这些内容。

注意
调用plt.tight_layout()会关闭掉受约束布局!

1. 简单的例子

在matplotlib中,Axes(包括子图)的位置以归一化的图形坐标指定。轴标签或标题(有时甚至是刻度标签)可能会超出图窗区域,从而遭到剪裁

import matplotlib.pyplot as plt
import numpy as np

import matplotlib.colors as mcolors
import matplotlib.gridspec as gridspec

plt.rcParams['savefig.facecolor'] = "0.8"
plt.rcParams['figure.figsize'] = 4.5, 4.
plt.rcParams['figure.max_open_warning'] = 50


def example_plot(ax, fontsize=12, hide_labels=False):
    ax.plot([1, 2])

    ax.locator_params(nbins=3)
    if hide_labels:
        ax.set_xticklabels([])
        ax.set_yticklabels([])
    else:
        ax.set_xlabel('x-label', fontsize=fontsize)
        ax.set_ylabel('y-label', fontsize=fontsize)
        ax.set_title('Title', fontsize=fontsize)

fig, ax = plt.subplots(layout=None)
example_plot(ax, fontsize=24)

在这里插入图片描述

为了避免遭到这种问题,需要调整图像Axes的位置。对于子图,可以通过使用Figure.subplots_adjust调整子图参数来手动完成,但是,使用layout="constrained"关键字参数指定图形将自动进行调整。

fig, ax = plt.subplots(layout="constrained")
example_plot(ax, fontsize=24)

在这里插入图片描述

当有多幅子图需要绘制时,经常会发现它们之间出现互相遮盖的问题。

fig, axs = plt.subplots(2, 2, layout=None)
for ax in axs.flat:
    example_plot(ax)

在这里插入图片描述

在对plt.subplots的调用中指定layout="constrained"会使得布局受到适当的约束。

fig, axs = plt.subplots(2, 2, layout="constrained")
for ax in axs.flat:
    example_plot(ax)

在这里插入图片描述

2. 颜色条

如果使用Figure.colorbar创建颜色条,则需要为其腾出空间。受约束的布局会自动执行此操作。请注意,如果指定use_gridspec=True,它将被忽略,因为此选项用于通过tight_layout来改进布局。

注意:
对于pcolormesh关键字参数(pc_kwargs),我们使用字典来保持本文档中调用的一致性。

arr = np.arange(100).reshape((10, 10))
norm = mcolors.Normalize(vmin=0., vmax=100.)
# 参看上面的注意,下面的设置可以保持样式的一致性:
pc_kwargs = {'rasterized': True, 'cmap': 'viridis', 'norm': norm}
fig, ax = plt.subplots(figsize=(4, 4), layout="constrained")
im = ax.pcolormesh(arr, **pc_kwargs)
fig.colorbar(im, ax=ax, shrink=0.6)

在这里插入图片描述

如果将Axes(或其他可迭代容器)列表指定到colorbar的ax参数,则受约束的布局将从指定的Axis轴中占用空间。

fig, axs = plt.subplots(2, 2, figsize=(4, 4), layout="constrained")
for ax in axs.flat:
    im = ax.pcolormesh(arr, **pc_kwargs)
fig.colorbar(im, ax=axs, shrink=0.6)

在这里插入图片描述

如果从Axes网格内指定Axes列表,则颜色条将适当地窃取空间,并留出间隙,但所有子图的大小仍将相同。

fig, axs = plt.subplots(3, 3, figsize=(4, 4), layout="constrained")
for ax in axs.flat:
    im = ax.pcolormesh(arr, **pc_kwargs)
fig.colorbar(im, ax=axs[1:, 1], shrink=0.8)
fig.colorbar(im, ax=axs[:, -1], shrink=0.6)

在这里插入图片描述

3. 总标题

受约束的布局也可以为总标题腾出空间。

fig, axs = plt.subplots(2, 2, figsize=(4, 4), layout="constrained")
for ax in axs.flat:
    im = ax.pcolormesh(arr, **pc_kwargs)
fig.colorbar(im, ax=axs, shrink=0.6)
fig.suptitle('Big Suptitle')

在这里插入图片描述

4. 图例

图像可以放在其父轴之外,Constrained layout旨在为Axes.legend()处理此问题。但是,受约束的布局还不能处理通过Figure.legend()创建的图例。

fig, ax = plt.subplots(layout="constrained")
ax.plot(np.arange(10), label='This is a plot')
ax.legend(loc='center left', bbox_to_anchor=(0.8, 0.5))

在这里插入图片描述

但是,这将从子图布局中窃取空间:

fig, axs = plt.subplots(1, 2, figsize=(4, 2), layout="constrained")
axs[0].plot(np.arange(10))
axs[1].plot(np.arange(10), label='This is a plot')
axs[1].legend(loc='center left', bbox_to_anchor=(0.8, 0.5))

在这里插入图片描述

为了让图例或其他的artist对象不从子布局中窃取空间,我们可以让leg.set_in_layout(False)。当然,这可能意味着图例最终会被裁剪,但如果随后使用fig.savefig('outname.png',bbox_inches='tight')调用图,则图例会很有用。但是请注意,必须再次切换图例的get_in_layout状态才能使保存的文件正常工作,如果我们希望受约束的布局在打印前调整Axes的大小,则必须手动触发绘制。

fig, axs = plt.subplots(1, 2, figsize=(4, 2), layout="constrained")

axs[0].plot(np.arange(10))
axs[1].plot(np.arange(10), label='This is a plot')
leg = axs[1].legend(loc='center left', bbox_to_anchor=(0.8, 0.5))
leg.set_in_layout(False)
# trigger a draw so that constrained layout is executed once
# before we turn it off when printing....
fig.canvas.draw()
# we want the legend included in the bbox_inches='tight' calcs.
leg.set_in_layout(True)
# we don't want the layout to change at this point.
fig.set_layout_engine('none')
try:
    fig.savefig('../../../doc/_static/constrained_layout_1b.png',
                bbox_inches='tight', dpi=100)
except FileNotFoundError:
    # this allows the script to keep going if run interactively and
    # the directory above doesn't exist
    pass

在这里插入图片描述

保存的文件如下所示:
在这里插入图片描述

5. 填充和空间

Axes之间的填充在水平方向上由w_padwspace控制,垂直方向由h_padhspace控制。这些可以通过设置进行编辑。w/h_pad是Axes周围的最小空间,以英寸为单位:

fig, axs = plt.subplots(2, 2, layout="constrained")
for ax in axs.flat:
    example_plot(ax, hide_labels=True)
fig.get_layout_engine().set(w_pad=4 / 72, h_pad=4 / 72, hspace=0,
                            wspace=0)

在这里插入图片描述

子图之间的间距由wspace和hspace进一步设置。这些值被指定为整个子图组大小的一小部分。如果这些值小于w_padh_pad,则改用固定焊盘。请注意,在下面的环境中,边缘的空间与上面的空间没有变化,但子图之间的空间却发生了变化。

fig, axs = plt.subplots(2, 2, layout="constrained")
for ax in axs.flat:
    example_plot(ax, hide_labels=True)
fig.get_layout_engine().set(w_pad=4 / 72, h_pad=4 / 72, hspace=0.2,
                            wspace=0.2)

在这里插入图片描述

如果有两列以上,则wspace在它们之间共享,因此这里wspace一分为二,每列之间的wspace为0.1:

fig, axs = plt.subplots(2, 3, layout="constrained")
for ax in axs.flat:
    example_plot(ax, hide_labels=True)
fig.get_layout_engine().set(w_pad=4 / 72, h_pad=4 / 72, hspace=0.2,
                            wspace=0.2)

在这里插入图片描述

GridSpecs还具有可选的hspace和wspace关键字参数,这些参数将用于代替受约束布局设置的填充:

fig, axs = plt.subplots(2, 2, layout="constrained",
                        gridspec_kw={'wspace': 0.3, 'hspace': 0.2})
for ax in axs.flat:
    example_plot(ax, hide_labels=True)
# this has no effect because the space set in the gridspec trumps the
# space set in *constrained layout*.
fig.get_layout_engine().set(w_pad=4 / 72, h_pad=4 / 72, hspace=0.0,
                            wspace=0.0)

在这里插入图片描述

带有颜色条的空间

颜色条放置在与其父项的距离填充上,其中填充是父项宽度的一小部分。然后,下一个子图的间距由w/hspace给出。

fig, axs = plt.subplots(2, 2, layout="constrained")
pads = [0, 0.05, 0.1, 0.2]
for pad, ax in zip(pads, axs.flat):
    pc = ax.pcolormesh(arr, **pc_kwargs)
    fig.colorbar(pc, ax=ax, shrink=0.6, pad=pad)
    ax.set_xticklabels([])
    ax.set_yticklabels([])
    ax.set_title(f'pad: {pad}')
fig.get_layout_engine().set(w_pad=2 / 72, h_pad=2 / 72, hspace=0.2,
                            wspace=0.2)

在这里插入图片描述

6. rcParams

可以在脚本或matplotlibrc文件中设置五个rcParams。它们都具有前缀figure.constrained_layout

  • use: 是否使用受约束的布局。默认值为False
  • w_pad,h_pad: 围绕Axes对象进行填充。表示英寸的浮点数。默认值为3./72.英寸(3pts);
  • wspace,hspace:子图组之间的间距。浮点数表示要分隔的子图宽度的一小部分。默认值为0.02。
plt.rcParams['figure.constrained_layout.use'] = True
fig, axs = plt.subplots(2, 2, figsize=(3, 3))
for ax in axs.flat:
    example_plot(ax)

在这里插入图片描述

7. 使用GridSpec

约束布局旨在与subplots()subplot_mosaic()或带有add_subplot()GridSpec()一起使用。

注意到这些是跟在layout="constrained"

plt.rcParams['figure.constrained_layout.use'] = False
fig = plt.figure(layout="constrained")

gs1 = gridspec.GridSpec(2, 1, figure=fig)
ax1 = fig.add_subplot(gs1[0])
ax2 = fig.add_subplot(gs1[1])

example_plot(ax1)
example_plot(ax2)

在这里插入图片描述

可以进行更复杂的网格规范布局。请清廉,这里我们使用便利函数add_gridspecsubgridspec

fig = plt.figure(layout="constrained")

gs0 = fig.add_gridspec(1, 2)

gs1 = gs0[0].subgridspec(2, 1)
ax1 = fig.add_subplot(gs1[0])
ax2 = fig.add_subplot(gs1[1])

example_plot(ax1)
example_plot(ax2)

gs2 = gs0[1].subgridspec(3, 1)

for ss in gs2:
    ax = fig.add_subplot(ss)
    example_plot(ax)
    ax.set_title("")
    ax.set_xlabel("")

ax.set_xlabel("x-label", fontsize=12)

在这里插入图片描述

请注意,在上面的列中,左列和右列的垂直范围不同。如果我们希望两个网格的顶部和底部对齐,那么它们需要位于同一个网格规范中。我们还需要使这个数字变大,以便Axes不会折叠到零高度:

fig = plt.figure(figsize=(4, 6), layout="constrained")

gs0 = fig.add_gridspec(6, 2)

ax1 = fig.add_subplot(gs0[:3, 0])
ax2 = fig.add_subplot(gs0[3:, 0])

example_plot(ax1)
example_plot(ax2)

ax = fig.add_subplot(gs0[0:2, 1])
example_plot(ax, hide_labels=True)
ax = fig.add_subplot(gs0[2:4, 1])
example_plot(ax, hide_labels=True)
ax = fig.add_subplot(gs0[4:, 1])
example_plot(ax, hide_labels=True)
fig.suptitle('Overlapping Gridspecs')

在这里插入图片描述

此示例使用两个gridspec使颜色条仅与一组pcolor相关。请注意,由于这个原因,左边的列比右边的两列宽。当然,如果你希望子图的大小相同,则只需要一个网格规范。请注意,使用子图可以达到相同的效果。

fig = plt.figure(layout="constrained")
gs0 = fig.add_gridspec(1, 2, figure=fig, width_ratios=[1, 2])
gs_left = gs0[0].subgridspec(2, 1)
gs_right = gs0[1].subgridspec(2, 2)

for gs in gs_left:
    ax = fig.add_subplot(gs)
    example_plot(ax)
axs = []
for gs in gs_right:
    ax = fig.add_subplot(gs)
    pcm = ax.pcolormesh(arr, **pc_kwargs)
    ax.set_xlabel('x-label')
    ax.set_ylabel('y-label')
    ax.set_title('title')
    axs += [ax]
fig.suptitle('Nested plots using subgridspec')
fig.colorbar(pcm, ax=axs)

在这里插入图片描述

Matplotlib现在不再使用subgridspecs,而是提供了子图形,这些子图形也适用于受约束的布局:

fig = plt.figure(layout="constrained")
sfigs = fig.subfigures(1, 2, width_ratios=[1, 2])

axs_left = sfigs[0].subplots(2, 1)
for ax in axs_left.flat:
    example_plot(ax)

axs_right = sfigs[1].subplots(2, 2)
for ax in axs_right.flat:
    pcm = ax.pcolormesh(arr, **pc_kwargs)
    ax.set_xlabel('x-label')
    ax.set_ylabel('y-label')
    ax.set_title('title')
fig.colorbar(pcm, ax=axs_right)
fig.suptitle('Nested plots using subfigures')

在这里插入图片描述

8. 手动设置Axes位置

手动设置Axes位置可能是有充分理由的。手动调用set_position将设置Axes,因此受约束的布局不再对其产生影响。(请注意,受约束的布局仍会为移动的Axes留出空间)。

fig, axs = plt.subplots(1, 2, layout="constrained")
example_plot(axs[0], fontsize=12)
axs[1].set_position([0.2, 0.2, 0.4, 0.4])

在这里插入图片描述

9. 固定纵横比的网格:压缩布局

受约束的布局在Axes的原始位置网格上运行。但是,当轴具有固定的纵横比时,一侧通常会变短,并在缩短的方向上留下较大的间隙。在下图中,Axes是正方形的,但图形很宽,因此存在水平间隙:

fig, axs = plt.subplots(2, 2, figsize=(5, 3),
                        sharex=True, sharey=True, layout="constrained")
for ax in axs.flat:
    ax.imshow(arr)
fig.suptitle("fixed-aspect plots, layout='constrained'")

在这里插入图片描述

解决这个问题的一个明显方法是使图形大小更方形,但是,缩小差距完全需要反复试验。对于简单的轴网格,我们可以使用layout="compressed"为我们完成这项工作:

fig, axs = plt.subplots(2, 2, figsize=(5, 3),
                        sharex=True, sharey=True, layout='compressed')
for ax in axs.flat:
    ax.imshow(arr)
fig.suptitle("fixed-aspect plots, layout='compressed'")

在这里插入图片描述

10. 手动关闭受约束的布局

受约束的布局通常会调整图形每次绘制时的Axes位置。如果要获取受约束布局提供的间距,但不对其进行更新,请执行初始绘制,然后调用fig.set_layout_engine('none')。这对于刻度标签可能更改长度的动画可能很有用。

请注意,对于使用工具栏的后端,ZOOM和PAN GUI事件的约束布处于关闭状态。这样可以防止Axes在缩放和平移期间改变位置。

11. 限制

不兼容的功能

受约束的布局将适用于pyplot.subplot,但前提是每次调用的行数和列数相同。原因是,如果几何形状不同且布局受约束,则每次调用pyplot.subplot都会创建一个新的GridSpec实例。因此,以下工作正常:

fig = plt.figure(layout="constrained")

ax1 = plt.subplot(2, 2, 1)
ax2 = plt.subplot(2, 2, 3)
# third Axes that spans both rows in second column:
ax3 = plt.subplot(2, 2, (2, 4))

example_plot(ax1)
example_plot(ax2)
example_plot(ax3)
plt.suptitle('Homogenous nrows, ncols')

在这里插入图片描述

但以下情况会导致布局不佳:

fig = plt.figure(layout="constrained")

ax1 = plt.subplot(2, 2, 1)
ax2 = plt.subplot(2, 2, 3)
ax3 = plt.subplot(1, 2, 2)

example_plot(ax1)
example_plot(ax2)
example_plot(ax3)
plt.suptitle('Mixed nrows, ncols')

在这里插入图片描述

类似地,subplot2gird的工作限制与nrows和ncols无法更改以使布局看起来不错相同的限制。

fig = plt.figure(layout="constrained")

ax1 = plt.subplot2grid((3, 3), (0, 0))
ax2 = plt.subplot2grid((3, 3), (0, 1), colspan=2)
ax3 = plt.subplot2grid((3, 3), (1, 0), colspan=2, rowspan=2)
ax4 = plt.subplot2grid((3, 3), (1, 2), rowspan=2)

example_plot(ax1)
example_plot(ax2)
example_plot(ax3)
example_plot(ax4)
fig.suptitle('subplot2grid')

在这里插入图片描述

其他注意事项

  • 受约束的布局仅考虑刻度标签、轴标签、标题和图例。因此,其他artist对象可能会被剪裁,也可能重叠。
  • 它假定刻度标签、轴标签和标题所需的额外空间与轴的原始位置无关。这通常是正确的,但在极少数情况下并非如此。
  • 后端处理呈现字体的方式存在细微差异,因此结果不会在像素上完全相同。
  • 如果artist对象使用的坐标区坐标超出了坐标区边界,则在添加到坐标区时,将导致布局异常。通过使用add_artist()将artist对象直接添加到图中,可以避免这种情况。有关示例,请参阅ConnectionPatch。

12. 调试bug

受约束的布局可能会以某种意想不到的方式失败。由于它使用约束求解器,因此求解器可以找到数学上正确的解决方案,但这些解决方案根本不是用户想要的。通常的故障模式是所有尺寸都折叠到其最小允许值。如果发生这种情况,则有两个原因之一:

  1. 没有足够的空间来容纳你请求绘制的元素;
  2. 有一个错误-在这种情况下,在以下位置打开一个issue:matplotlib/matplotlib#issues.

如果有错误,请报告一个独立的示例,不需要外部数据或依赖项(numpy除外)。

13. 关于算法的注意事项

约束的算法相对简单,但由于我们可以布置图形的复杂方式,因此具有一定的复杂性。

Matplotlib中的布局是通过GridSpec类使用gridspec执行的。网格规范是将图形逻辑划分为行和列,这些行和列中轴的相对宽度由width_ratios和height_ratios设置。

在受约束的布局中,每个gridspec都会获得一个与之关联的layoutgrid。layoutgrid每列都有一系列左右变量,每行都有bottom和top变量,此外,它还有左、右、下和上各边的边距。在每一行中,下边距和上边距被加宽,直到容纳该行中的所有修饰器。同样,对于列和左边距/右边距。

简单例证:一个Axes

对于单个Axes,布局是直接的。对于由一列和一行组成的图窗,有一个父layoutgird,对于包含轴的gridspec,有一个子layoutgrid,同样由一行和一列组成。Axes的每一侧都有空间用于“装饰”。在代码中,这是通过do_constrained_layout()中的条目完成的,例如:

gridspec._layoutgrid[0, 0].edit_margin_min('left',
      -bbox.x0 + pos.x0 + w_pad)

其中bbox是Axes的紧密边界框,并定位其位置。请注意四个边距如何包含Axes装饰。

from matplotlib._layoutgrid import plot_children

fig, ax = plt.subplots(layout="constrained")
example_plot(ax, fontsize=24)
plot_children(fig)

在这里插入图片描述

简单例证:两个Axes

当有多个Axes时,它们的布局以简单的方式绑定。在此示例中,左Axes的修饰比右Axes大得多,但它们共享一个底部边距,该边距足够大以容纳较大的xlabel。与共享的上边距相同。左边距和右边距不共享,因此允许不同。

fig, ax = plt.subplots(1, 2, layout="constrained")
example_plot(ax[0], fontsize=32)
example_plot(ax[1], fontsize=8)
plot_children(fig)

在这里插入图片描述

两个Axes和颜色条

颜色条只是扩展父layoutgrid单元格边距的另一个项目:

fig, ax = plt.subplots(1, 2, layout="constrained")
im = ax[0].pcolormesh(arr, **pc_kwargs)
fig.colorbar(im, ax=ax[0], shrink=0.6)
im = ax[1].pcolormesh(arr, **pc_kwargs)
plot_children(fig)

在这里插入图片描述

与GridSpec关联的颜色条

如果颜色条属于网格的多个单元格,则它为每个单元格创建更大的边距:

fig, axs = plt.subplots(2, 2, layout="constrained")
for ax in axs.flat:
    im = ax.pcolormesh(arr, **pc_kwargs)
fig.colorbar(im, ax=axs, shrink=0.6)
plot_children(fig)

在这里插入图片描述

尺寸不均匀的Axes

有两种方法可以使Axes在GridSpec布局中具有不均匀的大小,一种是指定它们跨GridSpecs行或列,另一种是指定宽度和高度比率。

这里使用第一种方法。请注意,中间的上边距和下边距不受左侧列的影响。这是算法有意识的决定,并导致两个右手轴有相同的高度,但不是左手轴高度的1/2。这与gridspec在没有受约束布局的情况下的工作方式是一致的。

fig = plt.figure(layout="constrained")
gs = gridspec.GridSpec(2, 2, figure=fig)
ax = fig.add_subplot(gs[:, 0])
im = ax.pcolormesh(arr, **pc_kwargs)
ax = fig.add_subplot(gs[0, 1])
im = ax.pcolormesh(arr, **pc_kwargs)
ax = fig.add_subplot(gs[1, 1])
im = ax.pcolormesh(arr, **pc_kwargs)
plot_children(fig)

在这里插入图片描述

需要调整的一个情况是,如果边距没有任何artist对象限制其宽度。在下面的例子中,第0列的右边距和第3列的左边距没有边距artist对象来设置其宽度,因此我们取有artist的边距宽度的最大宽度。这使得所有Axes都具有相同的大小:

fig = plt.figure(layout="constrained")
gs = fig.add_gridspec(2, 4)
ax00 = fig.add_subplot(gs[0, 0:2])
ax01 = fig.add_subplot(gs[0, 2:])
ax10 = fig.add_subplot(gs[1, 1:3])
example_plot(ax10, fontsize=14)
plot_children(fig)
plt.show()

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

python 命令行界面的用户交互

背景 说一千,道一万,程序是为用户服务的,所以在程序运行过程,与用户交互以获取用户的信息输入和决策确认,是无法避免的编程需要考虑和解决的需求。 一个简单的demo 如下的程序中,程序需要生成一个新的 i…

图片批量归类:告别混乱,实现高效文件管理

在日常生活中,我们经常需要处理大量的图片文件。这些图片可能来自于不同的设备、不同的目录,甚至不同的存储介质。随着时间的推移,这些图片文件会越来越多,管理起来也会越来越困难。如何高效地整理这些图片文件,告别混…

初步利用Ansible实现批量服务器自动化管理

1.Ansible介绍 Ansible是一款开源的自动化运维工具, 在2012年由Michael DeHaan创建, 现在由Red Hat维护。Ansible是基于Python开发的,采用YAML语言编写自动化脚本playbook, 可以在Linux、Unix等系统上运行, 通过SSH协议管理节点, 无需在被管理节点安装agent。Ansible以其简单、…

MySQL 数据库安全性练习题

数据库安全性 一、实验目的 (1)熟悉通过MySQL对数据进行安全性控制 二、实验环境 Windows 11 MySQL Navicat 三、实验内容 今有以下两个关系模式: 职工(职工号,姓名,年龄,职务,工…

11.3递归建二叉树,二叉树函数规范化输入输出,一些二叉树性质,求叶子结点与树的高度

建树 ,递归建树 输入为 建立树 递归 函数参数表为引用或指针 void Creat(BiTree *T){char ch;scanf("%c",&ch);if(ch#){*TNULL;}else{*T(BiTree)malloc(sizeof(BiTNode));(*T)->datach;Creat(&(*T)->nextleft);Creat(&(*T)->nex…

标签识别中的数据泄露:关键分析

一、介绍 在数据驱动的决策时代,收集、处理和分析数据的过程在从医疗保健到金融,从营销到研究的各个领域都发挥着举足轻重的作用。数据分析的基本步骤之一是正确识别数据集中的标签或类别。然而,这项看似简单的任务可能充满挑战,尤…

springboot苍穹外卖实战:八、开发小程序准备工作+入门案例+小程序微信用户登录流程+商品浏览

开发小程序准备工作 官方网址:https://mp.weixin.qq.com/cgi-bin/wx?token&langzh_CN 1、微信小程序注册 注册地址:https://mp.weixin.qq.com/wxopen/waregister?actionstep1 2、 完善小程序信息 登录小程序后台:https://mp.weixin.…

前端框架Vue学习 ——(三)Vue生命周期

生命周期:指一个对象从创建到销毁的整个过程。 生命周期的八个阶段:每触发一个生命周期事件,会自动执行一个生命周期方法(钩子) mounted:挂载完成,Vue 初始化成功,HTML 页面渲染成功…

Linux学习第33天:Linux INPUT 子系统实验(二):Linux 自带按键驱动程序的使用

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 本节笔记主要内容是学会如何使用Linux自带的按键驱动程序。 一、自带按键驱动程序源码简析 配置选项路径如下: -> Device Drivers ->…

内存学习(3):DRAM的基础存储结构(存储层级、读写过程,刷新与暂存)

1 DRAM背景简介 DRAM,全称为 Dynamic Random Access Memory ,中文名是“动态随机存取存储器”。所谓“动态”是和“静态”相对应的,芯片世界里还有一种 SRAM 静态随机存取存储器的存在。 笼统地说,DRAM 的结构比 SRAM 更简单&am…

UE5——源码阅读——2

这个是非常大的作用域,当程序离开这个东西,就会把它释放掉,设置了一个作用域把当前线程标记为主线程 插入了一个默认的Main,这个东西其实是标记点,这个标记是在UE内部有个性能分析工具可以看到这个标记点,主要是确定位…

【java学习—十三】处理流之三:标准输入输出流(3)

文章目录 1. 相关概念2. 举例与练习2.1. 举例2.2. 练习 1. 相关概念 System.in 和 System.out 分别代表了系统标准的输入和输出设备,默认输入设备是键盘,输出设备是显示器。     System.in 的类型是 InputStream     System.out 的类型是 PrintS…

SpringMvc从菜鸟到大拿完成蜕变

SpringMvc从菜鸟到大拿完成蜕 介绍 Why springmvc Servlet缺点: servlet中的service:方法一次只能处理一类请求;单拿用户表来说,得需要创建五个Servlet;在url中输入的是urlpattern;默认只访问service方法;如何减少Servlet的个数呢? 增加了一个method参数;其他人有可能会喜欢…

腾讯云CVM S5服务器优惠价格表,买一年送3个月

腾讯云服务器CVM标准型S5有活动,CVM 2核2G S5优惠价280.8元一年自带1M带宽,15个月313.2元、2核4G配置748.2元15个月、4核8G配置1437.24元15个月、8核16G优惠价3048.48元15个月,公网带宽可选1M、3M、5M或10M,腾讯云服务器网txyfwq.…

【算法练习Day39】单词拆分多重背包的介绍

​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯长路漫漫浩浩,万事皆有期待 文章目录 单词拆分多重背包总结&…

[BUUCTF NewStar 2023] week5 Crypto/pwn

最后一周几个有难度的题 Crypto last_signin 也是个板子题,不过有些人存的板子没到,所以感觉有难度,毕竟这板子也不是咱自己能写出来的。 给了部分p, p是1024位给了922-101位差两头。 from Crypto.Util.number import * flag b?e 655…

Winform 实现俄罗斯方块游戏(一)

第一步,先用GDI绘制小正方形方块,其它形状的用这个方块合成 如何绘制一个方块?先绘制两个正方形,如下: 然后四周用梯形填充,内部颜色用渐变,这样更有立体感,下篇介绍如何实现。

D-link未授权访问以及远程代码执行

随便输入一个错误密码,会跳转到页面: /page/login/login.html?errorfail继续访问有效页面漏洞url: /Admin.shtml然后访问管理页面去更改管理密码 直接构造payload访问漏洞url: /cgi-bin/execute_cmd.cgi?cmdid执行命令&#…

2023年11月5日网规考试备忘

早上题目回忆: pki体系 ipsec,交换安全(流量抑制) aohdlc bob metclaf —ethernet pon tcp三次握手 OSPF lsa?交换机组ospf配置问题,ping网关可通,AB不通 raid6 300G*8 网络利用率 停等协议10…

腾讯云CVM S5服务器4核8G配置性能测评和优惠价格表

腾讯云4核8G服务器CVM标准型S5实例性能测评,包括CPU型号、内存、系统盘、CVM实例规格性能测评,腾讯云4核8G租用优惠价格表,腾讯云服务器网txyfwq.com分享腾讯云4核8G服务器CVM S5性能测评和优惠价格表: 腾讯云4核8G服务器CVM S5性…