Matlab - 浓度与距离图(2D)

Matlab - concentration vs distance plot (2D)

我有几组数据。每组都是一个数字列表,它是粒子从 0 开始移动的距离。每个集合都与有限时间相关联,因此集合 1 是 T=0 时的距离;集合 2 是 T=1 处的距离,依此类推。每组大小为粒子总数,每组大小相同

我想绘制浓度与距离线。

比如有1000个粒子(集合的大小);在时间 T=0 时,绘图将只是一条直线 x=0,因为所有粒子都在 0(该集合包含 1000 个零)。所以 x=0 处的浓度 =100%,所有其他距离处的浓度均为 0%

在 T=1 和 T=2 等等,距离会增加(通常)所以我可能有这样的集合:(只是一个例子)

T1 = (1.1,2.2,3.0,1.2,3.2,2.3,1.4...) 等 T2 = (2.9,3.2,2.6,4.5,4.3,1.4,5.8...) 等

很可能每组中的每个数字在该组中都是唯一的

目标是绘制多个图(我最终可以将它们绘制在一张图上),在 y 轴上显示浓度,在 x 轴上显示距离。我想随着 T 增加 T0、T1、T2,那么绘图将变平,直到各处的浓度大致相同。

x 轴(距离)有一个固定的最大值,每个图都相同。因此,例如,一些集合将有一条曲线在 y 轴(浓度)上以较低的 x(距离)值达到零,但随着时间的增加,我设想一条几乎平坦的线,该线不穿过x轴(浓度处处非零)

我已经用直方图试过了,但它并没有真正给出我想要的结果。我想要一个线图,但必须尝试将距离放入常识大小的容器中。

谢谢W

一些粗略的数据

Y1 = 1.0e-09 * [0.3358, 0.3316, 0.3312, 0.3223, 0.2888, 0.2789, 0.2702,...
    0.2114, 0.1919, 0.1743, 0.1738, 0.1702, 0.0599, 0.0003, 0, 0, 0, 0, 0, 0];

Y2 = 1.0e-08 * [0.4566, 0.4130, 0.3439, 0.3160, 0.3138, 0.2507, 0.2483,...
    0.1714, 0.1371, 0.1039, 0.0918, 0.0636, 0.0502, 0.0399, 0.0350, 0.0182,...
    0.0010, 0, 0, 0];

Y3 = 1.0e-07 * [0.2698, 0.2671, 0.2358, 0.2250, 0.2232, 0.1836, 0.1784,...
    0.1690, 0.1616, 0.1567, 0.1104, 0.0949, 0.0834, 0.0798, 0.0479, 0.0296,...
    0.0197, 0.0188, 0.0173, 0.0029];

这些数据集仅包含 20 个粒子的距离。 Y0 集合为零。我将处理数千个,所以数据集会太大。

谢谢

嗯,基本上,您只是错过了 hold 命令。但首先,将所有数据放在一个矩阵中,如下所示:

Y = [1.0e-09 * [0.3358, 0.3316, 0.3312, 0.3223, 0.2888, 0.2789, 0.2702,...
    0.2114, 0.1919, 0.1743, 0.1738, 0.1702, 0.0599, 0.0003, 0, 0, 0, 0, 0, 0];
    1.0e-08 * [0.4566, 0.4130, 0.3439, 0.3160, 0.3138, 0.2507, 0.2483,...
    0.1714, 0.1371, 0.1039, 0.0918, 0.0636, 0.0502, 0.0399, 0.0350, 0.0182,...
    0.0010, 0, 0, 0];
    1.0e-07 * [0.2698, 0.2671, 0.2358, 0.2250, 0.2232, 0.1836, 0.1784,...
    0.1690, 0.1616, 0.1567, 0.1104, 0.0949, 0.0834, 0.0798, 0.0479, 0.0296,...
    0.0197, 0.0188, 0.0173, 0.0029]];

然后你需要分别绘制每个时间步长,并使用hold on将它们粘贴在相同的轴上:

hold on
for r = size(Y,1):-1:1
    histogram(Y(r,:));
end
hold off
T_names = [repmat('T',size(Y,1),1) num2str((size(Y,1):-1:1).')];
legend(T_names)

这会给你(使用示例数据):

请注意,在循环中我向后迭代行 - 这只是为了让较窄的直方图绘制在较宽的直方图上,这样您就可以清楚地看到它们。

编辑

如果你想要连续的线,而不是箱子,你必须首先通过 histcounts 获得直方图值,然后将它们绘制成一条线:

hold on
for r = 1:size(Y,1)
    [H,E] = histcounts(Y(r,:));
    plot(E,[H(1) H])
end
hold off
T_names = [repmat('T',size(Y,1),1) num2str((1:size(Y,1)).')];
legend(T_names)

虽然你的小示例数据看起来并不那么令人印象深刻: