Matlab 为矩阵的每一列制作直方图,但不包含零元素

Matlab 为矩阵的每一列制作直方图,但不包含零元素,matlab,histogram,matlab-figure,Matlab,Histogram,Matlab Figure,我正在模拟盒子里的粒子。当粒子离开盒子时,其动能变为零(时间>t逃逸)。所以我想做一个关于Wkinet(它是nP=粒子数,ntM=时间步长的函数)如何随时间演化的柱状图,但我不想考虑每列的零值。是否有办法对其进行编码,以便找到最佳的垃圾箱数量 这就是我尝试过的: nbins = 1000; for j = 1:ntM/5 Wkinet(Wkinet==0) = NaN; y = Wkinet(:,j).*erg2eV; end histfit(y,nbins) 一旦掌握了语法,

我正在模拟盒子里的粒子。当粒子离开盒子时,其动能变为零(时间>t逃逸)。所以我想做一个关于Wkinet(它是nP=粒子数,ntM=时间步长的函数)如何随时间演化的柱状图,但我不想考虑每列的零值。是否有办法对其进行编码,以便找到最佳的垃圾箱数量

这就是我尝试过的:

nbins = 1000;
for j = 1:ntM/5
    Wkinet(Wkinet==0) = NaN;
    y = Wkinet(:,j).*erg2eV;
end
histfit(y,nbins)

一旦掌握了语法,逻辑索引通常是相当快速和直观的

myTolerance=1e-7; % in erg units.
nbins=1000;
for j=1:ntM/5
    %Wkinet(Wkinet==0)=NaN;
    % y=Wkinet(:,j).*erg2eV; % An extra assigment is costly and probably not needed.
    H = histfit(Wkinet(abs(Wkinet(:,j))>myTolerance, j) * erg2ev, nbins);
    % Select from column j all rows in column j whose absolute values are greater than the tolerance. 
    % Assumption; erg2ev is just a scalar, otherwise select its entries with erg2ev(abs(Wkinet(:,j))>myTolerance)
    H(1).delete; Remove bins, only keep the fit.
    set(gca, 'YScale', 'log'); % Make logarithmic Y
    set(gca, 'XScale', 'log'); % Make logarithmic X
    pause
end
如果需要明确限制轴,请使用

xlim([lowerBound upperBound]); ylim(etc...
。。。或者,有时使用轴命令进行精确控制是有帮助的,例如:

ax=axis; ax(3)=min( 8ax(3) maxAllowedY]); axis(ax);
“暂停”(供交互使用)可替换为打印命令,以将打印保存到磁盘。例如

print(sprintf('My_plot_%02d',j),'-dpng');
或保存图形:

savefig(sprintf('My_fig_%02d',j));
如果您确定绘图的数量小于,比如说16,那么可以在循环中放置一个子绘图命令。将暂停替换为

subplot(4,4,j);
最后说明;如果您的目的是绘制拟合到非零数据的正态分布,则使用histfit函数替换histfit函数可能会获得更好的结果

myFit = fitdist(Wkinet(Wkinet(:,j)>myTolerance, j) * erg2ev), 'Normal');
maxEv = max(Wkinet(Wkinet(:,j)>myTolerance, j) * erg2ev);
myX   = [myTolerance; maxEv/100; maxEv]; % Alter for different plot X-axis
myY   = pdf(myFit, myX);
plot(myX, myY);

我检查了一下,fitdist和histdist之间存在差异,可能是由于bin离散化造成的。

为什么不制作一个包含零的直方图,然后删除该bin?我该怎么做?还有一个问题是,它只显示最终j的最后一个直方图,我如何解决这个问题,并使它在一个图中显示所有直方图?提前感谢您不要覆盖每个循环迭代的
y
。您能解释一下我是如何做到的吗?谢谢!你能不能帮我把图画成这样…我的意思是只显示拟合,而不是显示条,在y轴上是非零化的,在x轴上有相同的限制我在最初的问题中添加了图片@ERIkP将更新如何删除绘图、如何重新缩放到日志轴以及如何限制比例。不清楚您在PDF绘图上追求的是哪种规格化。可能您可以检查H(2)的YData以进行进一步操作。在
fitdist
函数中添加了一个注释,这可能更准确地说明您正在执行的操作。非常感谢!虽然第二个不起作用(它有一个不平衡的句子,你想用myY表示pdf吗?。我关于y轴的意思是,我想显示百分比,从0到1@ErikP@nikos,是的,pdf是我的意思,编辑过。虽然没有看到不平衡的地方。我不确定你想要的百分比是多少。如果它是最大密度的%,你可以按div缩放与max(myY)一起使用。