【问题标题】:Matlab - concentration vs distance plot (2D)Matlab - 浓度与距离图(2D)
【发布时间】:2016-08-09 05:45:15
【问题描述】:

我有几组数据。每个集合都是一个数字列表,它是一个粒子从 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轴(浓度处处非零)

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

谢谢你

一些粗略的数据

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 集为零。我要处理数千个,所以数据集太大了。

谢谢

【问题讨论】:

  • 你能给你想象的一个直观的(粗略的)例子吗?还有一些足以创建它的最小数据样本?
  • 嗨,EBH;我已经编辑了原始帖子以包含我正在尝试做的事情的草图。在这种情况下,有 20 个粒子。在时间 T0,所有粒子都在 y = 0;因此 y = 0 处的浓度为 100%。在无穷远处,浓度应该(几乎)处处相等,是一条直线。我将建模一批时间,但在一张图上只绘制 3 或 4 次。希望对您有所帮助,谢谢

标签: matlab plot graph bins


【解决方案1】:

嗯,基本上,你只是错过了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)

这将为您提供(使用示例数据):

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

编辑

如果您想要连续线而不是 bin,您必须首先通过 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)

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

【讨论】:

  • 太棒了;谢谢。我在玩直方图;但我正在尝试像我画的草图那样简单的线图。这可能吗?谢谢。
  • 嗨,这更像它!谢谢!曲线的原始性质是因为每个数据集只有三个 bin 吗?例如,如果一个数据集有 1000 个数据点,我可以增加 bin 的数量并进行最佳拟合吗?感谢您的帮助,非常感谢。
  • 是的。 histcounts 默认为您的数据找到“最佳”分箱,但您可以指定任意数量的分箱 nbinshistcounts(Y(r,:),nbins)
  • 感谢 EBH;明天我会用一些大数据集来完成这个。非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-17
  • 1970-01-01
  • 1970-01-01
  • 2014-03-09
  • 2016-08-29
  • 1970-01-01
相关资源
最近更新 更多