2026a

# subplot


在平铺位置创建坐标区

函数库: TyPlot

# 语法

subplot(m,n,p)
subplot(m,n,p,ax)
subplot(___,Key=Value)
ax = subplot()
subplot(ax)

# 说明

subplot(m,n,p) 将当前图窗划分为 m×n 网格,并在 p 指定的位置创建坐标区。Syslab 按行号对子图位置进行编号。第一个子图是第一行的第一列,第二个子图是第一行的第二列,依此类推。如果指定的位置已存在坐标区,则此命令会将该坐标区设为当前坐标区。示例


subplot(m,n,p,ax) 将现有坐标区 ax 转换为同一图窗中的子图。示例


subplot(___,Key=Value) 使用一个或多个名称-值对组参数修改坐标区属性。在所有其他输入参数之后设置坐标区属性。


ax=subplot() 创建一个 Axes 对象、PolarAxes 对象。以后可以使用 ax 修改坐标区。示例


subplot(ax) 将 ax 指定的坐标区设为父图窗的当前坐标区。如果父图窗尚不是当前图窗,此选项不会使父图窗成为当前图窗。示例

# 示例

上部和下部子图

创建带有两个堆叠子图的图窗。在每个子图上绘制一条正弦波。

using TyPlot
subplot(2, 1, 1);
x = LinRange(0, 10, 100);
y1 = sin.(x);
plot(x, y1)

subplot(2, 1, 2);
y2 = sin.(5 * x);
plot(x, y2)
子图的象限

创建一个分为四个子图的图窗。在每个子图上绘制一条正弦波并为每个子图指定标题。

using TyPlot
subplot(2, 2, 1)
x = LinRange(0, 10, 100);
y1 = sin.(x);
plot(x, y1)
title("Subplot 1: sin(x)")

subplot(2, 2, 2)
y2 = sin.(2 * x);
plot(x, y2)
title("Subplot 2: sin(2x)")

subplot(2, 2, 3)
y3 = sin.(4 * x);
plot(x, y3)
title("Subplot 3: sin(4x)")

subplot(2, 2, 4)
y4 = sin.(8 * x);
plot(x, y4)
title("Subplot 4: sin(8x)")
大小不同的子图

创建一个包含三个子图的图窗。在图窗的上半部分创建两个子图,并在图窗的下半部分创建第三个子图。在每个子图上添加标题。

using TyPlot
x = LinRange(-3.8, 3.8, 100);
y_cos = cos.(x);
y_poly = 1 .- x .^ 2 ./ 2 .+ x .^ 4 ./ 24;

subplot(2,2,1);
plot(x,y_cos);
title("Subplot 1: Cosine")

subplot(2,2,2);
plot(x,y_poly,"#00FF00");
title("Subplot 2: Polynomial")
xlim([-4,4])
ylim([-1,3])

subplot(2,2,[3,4]);
plot(x,y_cos,"b",x,y_poly,"#00FF00");
title("Subplot 3 and 4: Both")
将子图替换为空坐标区

创建一个包含四个随机数据针状图的图窗。然后将第二个子图替换为空坐标区。

using TyPlot
data_array = [
    0.8147 0.9058 0.1270 0.9134 0.6324 0.0975 0.2785 0.5469 0.9575 0.9649
    0.1576 0.9706 0.9572 0.4854 0.8003 0.1419 0.4218 0.9157 0.7922 0.9595
    0.6557 0.0357 0.8491 0.9340 0.6787 0.7577 0.7431 0.3922 0.6555 0.1712
    0.7060 0.0318 0.2769 0.0462 0.0971 0.8235 0.6948 0.3171 0.9502 0.0344
]

for k in 1:4
    data = data_array[k,:]
    subplot(2,2,k)
    stem(data)
end
ax2=subplot(2,2,2)
cla(ax2)
自定义位置上的子图

创建包含两个未与网格位置对齐的子图的图窗。为每个子图指定一个自定义位置。

using TyPlot
pos1 = [0.1,0.3,0.3,0.3];
subplot(position=pos1)
y = [
    16     2     3    13
    5    11    10     8
    9     7     6    12
    4    14    15     1
]

plot(y)
title("First Subplot")

pos2 = [0.5,0.15,0.4,0.7];
subplot(position=pos2)
bar(y)
title("Second Subplot")
创建包含极坐标区的子图

创建包含两个极坐标区的图窗。在上部子图中创建极坐标线图,在下部子图中创建极坐标散点图。

using TyPlot
figure()
ax1 = subplot(2, 1, 1; projection="polar");
theta = LinRange(0, 2 * pi, 50);
rho = sin.(theta) .* cos.(theta);
polarplot(ax1, theta, rho; rlim=(0, 0.5))

ax2 = subplot(2, 1, 2; projection="polar");
polarplot(ax2, theta, rho, "o"; rlim=(0, 0.5))
创建后修改坐标区属性

创建带有两个子图的图窗。将 Axes 对象赋给变量 ax1 和 ax2。将 Axes 对象指定为绘图函数的输入,以确保绘图函数在特定的子图中进行绘制。

using TyPlot
Z = peaks();
Z = Z[3]

ax1 = subplot(2,1,1);
plot(ax1,Z[1:20,:])

ax2 = subplot(2,1,2);
plot(ax2,Z)

通过设置 Axes 对象的属性来修改坐标区。更改上部子图的字体大小和下部子图的线宽。某些绘图函数可设置坐标区属性。先执行绘图函数,然后指定坐标区属性以免覆盖现有坐标区属性的设置。使用圆点表示法设置属性。

ax1.tick_params(labelsize=15)

ax2.tick_params(which = "major", width = 2)
ax2.spines["top"].set_linewidth(2)
ax2.spines["bottom"].set_linewidth(2)
ax2.spines["left"].set_linewidth(2)
ax2.spines["right"].set_linewidth(2)
plt_update()
使子图成为当前坐标区

创建一个包含多个子图的图窗。将 Axes 对象存储在向量 ax 中。然后使第二个子图成为当前坐标区。创建一个线图并更改第二个子图的坐标轴范围。默认情况下,图形函数作用于当前坐标区。

using TyPlot
ax = []
for k in 1:4
    push!(ax, subplot(2, 2, k))
end

subplot(ax[2])
x = LinRange(1, 50, 100);
y = sin.(x);
plot(x, y; color=[0.1, 0.5, 0.1])
title("Second Subplot")
axis([0, 50, -1, 1])
将现有坐标区转换为子图

创建一个线图。然后转换坐标区,使其成为图窗的下部子图。subplot 函数使用原始坐标区所在的图窗。

using TyPlot
x = LinRange(1, 10, 100);
y = sin.(x);
plot(x, y)
title("Sine Plot")
ax = gca()
subplot(2,1,2,ax)

# 输入参数

m - 网格行数
1 (默认) | 正整数

网格行数,指定为正整数。

n - 网格列数
1 (默认) | 正整数

网格列数,指定为正整数。

p - 新坐标区的网格位置
标量 | 向量

新坐标区的网格位置,指定为标量或正整数向量。

  • 如果 p 是正整数标量,则 subplot 在网格位置 p 处创建一个子图;
  • 如果 p 是正整数向量,则 subplot 新建一个跨 p 中列出的网格位置的子图。

示例: subplot(2,3,1) 在位置 1 处创建一个子图。

示例: subplot(2,3,[2,5]) 创建跨位置 2 和 5 的子图。

示例: subplot(2,3,[2,6]) 创建跨位置 2、3、5 和 6 的子图。

ax - 要设为当前坐标区
Axes 对象 | PolarAxes 对象

要设为当前坐标区,指定为 Axes 对象、PolarAxes 对象。

要在子图位置创建空的极坐标区,请将 ax 指定为 polaraxes 或 geoaxes 函数。例如,subplot(2,1,2,polaraxes)。

# 名称-值对组参数

指定可选的 Key=Value 对组参数。Key 为参数名称,Value 为对应的值。您可采用任意顺序指定多个名称-值对组参数,如 Key1=Value1,...,KeyN=ValueN 所示。

示例: subplot(m,n,p,projection="polar")

某些绘图函数会覆盖属性设置。请考虑在绘图后设置坐标区属性。您可以设置的属性取决于坐标区的类型:

  • 有关笛卡尔坐标区的信息,请参阅 axes 属性
facecolor - 标记填充颜色
"none" (默认) | RGB 三元组 | 十六进制颜色代码 | "r" | "g" | "b" |

填充颜色,指定为 "auto"、RGB 三元组、十六进制颜色代码、颜色名称或短名称。默认值 "none" 表示没有填充颜色。

对于自定义颜色,请指定 RGB 三元组或十六进制颜色代码。

  • RGB 三元组是包含三个元素的行向量,其元素分别指定颜色中红、绿、蓝分量的强度。强度值必须位于 [0,1] 范围内,例如 [0.4, 0.6, 0.7];
  • 十六进制颜色代码是字符向量或字符串标量,以井号 (#) 开头,后跟三个或六个十六进制数字,范围可以是 0 到 F。 这些值不区分大小写。因此,颜色代码 "#FF8800" 与 "#ff8800"、"#F80" 与 "#f80" 是等效的。

此外,还可以按名称指定一些常见的颜色。下表列出了命名颜色选项、等效 RGB 三元组和十六进制颜色代码。

颜色名称 短名称 RGB 三元组 十六进制颜色代码 外观
"red" "r" [1, 0, 0] "#FF0000"
"green" 不适用 [0, 0.5019607843137255, 0] "#008000"
不适用 "g" [0, 0.5, 0] "#007F00"
不适用 不适用 [0, 1, 0] "#00FF00"
"blue" "b" [0, 0, 1] "#0000FF"
"cyan" 不适用 [0, 1, 1] "#00FFFF"
不适用 "c" [0, 0.75, 0.75] "#00BFBF"
"magenta" 不适用 [1, 0, 1] "#FF00FF"
不适用 "m" [0.75, 0, 0.75] "#BF00BF"
"yellow" 不适用 [1, 1, 0] "#FFFF00"
不适用 "y" [0.75, 0.75, 0] "#BFBF00"
"black" "k" [0, 0, 0] "#000000"
"white" "w" [1, 1, 1] "#FFFFFF"
"none" 不适用 不适用 不适用 无颜色

以下是 Syslab 在许多类型的绘图中使用的默认颜色的 RGB 三元组和十六进制颜色代码。

RGB 三元组 十六进制颜色代码 外观
[0, 0.4470, 0.7410] "#0072BD"
[0.8500, 0.3250, 0.0980] "#D95319"
[0.9290, 0.6940, 0.1250] "#EDB120"
[0.4940, 0.1840, 0.5560] "#7E2F8E"
[0.4660, 0.6740, 0.1880] "#77AC30"
[0.3010, 0.7450, 0.9330] "#4DBEEE"
[0.6350, 0.0780, 0.1840] "#A2142F"
position - 新坐标区的自定义位置
四元素向量

新坐标区的自定义位置,指定为 [left, bottom, width, height] 形式的四元素向量。

  • left 和 bottom 元素指定子图的左下角相对于图窗的左下角的位置;
  • width 和 height 元素指定子图维度。

指定介于 0 和 1 之间的归一化值(基于图窗内界)。

提示

使用脚本创建子图时,在发出 drawnow 命令或 Syslab 返回到等待用户命令之前,Syslab 不会最终确定 position 属性值。在脚本刷新绘图或退出之前,子图的 position 属性值会受到变化的影响。

示例: subplot(position=[0.1, 0.1, 0.45, 0.45])

projection - 新坐标区的投影方式
nothing 导致"直线"投影 | "polar" | "3d"。

投影方式为"polar"会创建一个极坐标区,为"3d"时会创建一个三维坐标区

示例: subplot(m,n,p,projection="polar")

# 提示

  • 要清除图窗的内容,请使用 clf。例如,您可以在创建新子图布局之前清除图窗中的现有子图布局;
  • 要叠加坐标区,请改用 plt_axes 命令。subplot 函数会删除与新坐标区重叠的现有坐标区。例如, subplot(position=[.35, .35, .3, .3]) 会删除所有底层坐标区,但 plt_axes(position=[.35, .35, .3, .3]) 会将新坐标区置于图窗的中部而不删除底层坐标区;
  • subplot(111) 是一个例外,其行为与 subplot(1,1,1) 不同。出于向后兼容的原因,subplot(111) 是子图的一种特殊情况,它不立即创建坐标区,而是设置图窗,以便接下来的图形命令执行 clf。接下来的图形命令将删除所有图窗子级,并在默认位置创建新的坐标区。subplot(111) 不返回 Axes 对象,如果代码指定了返回参数,将会发生错误。

# 另请参阅

# 函数

plt_axes | cla | figure | gca

# 属性

axes 属性 | polaraxes 属性