【问题标题】:Histogram of multiple dataset with different dimension in MatlabMatlab中不同维度的多个数据集的直方图
【发布时间】:2020-12-24 17:04:09
【问题描述】:

我可以在直方图中绘制多个具有相同维度的图

x = rand(1000,3);
hist(x);

但我无法绘制多个不同维度的图。

x1 = rand(1100,1);
x2 = rand(1000,1);
x3 = rand(900,1);
x = [x1 x2 x3]
hist(x)

我收到以下错误

Error using horzcat
Dimensions of arrays being concatenated are not consistent.

请有人指出我解决问题的正确方向。

【问题讨论】:

    标签: matlab histogram


    【解决方案1】:

    问题确实是你不能添加大小不匹配的变量。

    这是一个适合您的补丁工作: 神奇的是使您的代码匹配的 Nan 变量

    % its bad habits but:
    x1 = rand(1100,1);
    x2 = rand(1000,1);
    x3 = rand(900,1);
    
    % make em' all the same size
    max_size = max([length(x1),length(x2),length(x3)]);
    
    % add in the ending nan 
    x1 = [x1; nan(max_size-length(x1), 1)];
    x2 = [x2; nan(max_size-length(x2), 1)];
    x3 = [x3; nan(max_size-length(x3), 1)];
    
    % plot em' bad
    x = [x1 x2 x3];
    figure;
    hist(x)
    

    它现在工作得很好! (但你知道它有点像弗兰肯斯坦的杰作 :-)

    【讨论】:

    • 太棒了,很好地使用NaN(不是数字)术语。
    • 太棒了!我无法以这种方式弄清楚 NaN 的使用。
    • @user158881 如果你不介意我问你为什么提到“%它的坏习惯但是:”。我是 MATLAB 新手,所以无法弄清楚背后的原因。
    • 只吃阳离子。如果您在不同 Vars 的大小之间存在重大差异,您可能会丢失其中一个直方图。有时它有助于在直方图中使用 ("normalization" , "distribution") 对图进行归一化
    • 因为 NaN 是个棘手的朋友。例如,如果您绘制一条线并且数据周围有一些 NaN,它将“破坏”您的线,而不是忽略这些值(这是我所期望的并且被证明是错误的)。无论如何,请始终检查 MATLAB 对您的 NaN 做了什么。我更喜欢避免使用它们,但它们有时很有用。
    【解决方案2】:

    三柱直方图(3 个数据集)

    您可以使用 histogram() 函数并检索每个直方图的 .binCounts 并以一种 10 x 3 数组的方式将它们连接起来。通过在这个 10 x 3 数组上调用 bar(),您将获得一个类似的分箱图,该图显示了 3 个数据集的直方图,分箱显示为三条。使用histogram() 函数也是一个好主意,因为MATLAB 不再推荐使用hist()

    x1 = rand(1100,1);
    x2 = rand(1000,1);
    x3 = rand(900,1);
    
    h1 = histogram(x1);
    Counts_1 = h1.BinCounts;
    h2 = histogram(x2);
    Counts_2 = h2.BinCounts;
    h3 = histogram(x3);
    Counts_3 = h3.BinCounts;
    
    Bin_Edges = h3.BinEdges;
    Bin_Width = h3.BinWidth;
    Bin_Centres = Bin_Edges(1:end-1) + Bin_Width/2;
    
    Counts = [Counts_1.' Counts_2.' Counts_3.'];
    bar(Counts);
    title("Triple Bar Histogram");
    xlabel("Bin Centres"); ylabel("Count");
    set(gca,'xticklabel',Bin_Centres);
    

    使用 MATLAB R2019b 运行

    【讨论】:

    • 感谢您的回答。我尝试了所有四种方法;他们正在创建一个单列或单行的数组。这确实给了我一个直方图,但它是所有三个变量的混合,即 x1、x2 和 x3。我无法区分数据
    • 您正在寻找 3 个不同的直方图?您是否需要在单独的子图上使用它们?
    • 我在原帖中添加了情节,我正在寻找类似的东西
    • 在我的答案顶部添加了执行此操作的代码。
    • 这是完美的,感谢您的回答。我正在考虑用一些负值填充较小的矩阵,然后不在图上显示该值。但是您的解决方案更优雅。
    猜你喜欢
    • 2014-10-02
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-14
    • 2016-03-10
    • 2013-01-25
    相关资源
    最近更新 更多