直方图小时日(连续箱)

时间:2015-07-10 09:42:44

标签: matlab histogram

我在下图中生成直方图(在x轴上有一天中的几小时)。 知道如何围绕最高价值中心吗?在这种情况下,我想把右边的部分放在第一个箱子的左侧......

时间是一个包含12天时间戳(1分钟分辨率)的酒窖。

Time{1,1}='00:00:00';
Time{2,1}='00:01:00';
...
Time{1000,1}='16:39:00';
...
Time{17280,1}='23:59:00'

如果主体正在睡觉0,则睡眠是一个包含1的向量。

sleeping(1,1)=1;
sleeping(2,1)=1;
...
sleeping(1000,1)=0;
...
sleeping(17280,1)=1;



    figure
    hist(datenum(Time(sleeping==1)),24)
    datetick

enter image description here

1 个答案:

答案 0 :(得分:0)

首先,使用hist返回直方图的值(vals)和二进制位(bins):

[vals, bins] = hist(datenum(Time(sleeping==1)),24);

然后,找到实际最大值的位置,以使直方图相对于最大值居中:

[val, idx] = max(vals);

然后,获取直方图中心的位置(如果使用12 - bin直方图,则应为24。然后,估计将直方图的中心移动到绘图中心所需的移位量。

centerPos = round(length(bins)/2);
shiftSize = centerPos - idx;

在找到shiftSize之后,我们可以有三种情况:a)向左移动,在这种情况下移位会更大。我按照以下方式处理:

if shiftSize < 0    % move to the left w.r.t. center
    shiftSize = length(bins) - shiftSize;
end

此外,b)如果转移是在右侧,则无需更新shiftSize。然后,c)shiftSize为零,这意味着不需要移位。在最后两种情况下,无需更改shiftSize

在a)和b)的情况下,我们现在执行循环移位(如@Luis Mendo建议的那样):

if shiftSize    % if it is 0 it means that it is already centered
    nvals = circshift(vals, shiftSize, 2);
    nbins = circshift(bins, shiftSize, 2);
end

最后,我们绘制并获得当前轴进行调整。

figure, bar(bins, nvals); ax = gca;

现在,您确保24小时内都有所有垃圾箱。

ax.XTick = bins; 

请注意,如果你执行ax.XTick = nbins,它会给你一个错误,因为xTick必须单调递增。最后,您可以使移位的x轴标签发生变化:

ax.XTickLabel = datestr(nbins, 'HH:MM');

以下是您提供的示例的完整代码

Time{1,1}='00:00:00';
Time{2,1}='00:01:00';
Time{1000,1}='16:39:00';
Time{17280,1}='23:59:00';

sleeping(1,1)=1;
sleeping(2,1)=1;
sleeping(1000,1)=0;
sleeping(17280,1)=1;

[vals, bins] = hist(datenum(Time(sleeping==1)),24);

% get the maximum
[val, idx] = max(vals);

% circularly shift to center around the maximum
centerPos = round(length(bins)/2);
shiftSize = centerPos - idx;
if shiftSize < 0    % move to the left w.r.t. center
    shiftSize = length(bins) - shiftSize;
end

if shiftSize    % if it is 0 it means that it is already centered
    nvals = circshift(vals, shiftSize, 2);
    nbins = circshift(bins, shiftSize, 2);
end

figure, bar(bins,nvals); ax = gca;
ax.XTick = bins; 
ax.XTickLabel = datestr(nbins, 'HH:MM');

这给了我以下情节:

Centered along the max :)

如果您有疑问,请告诉我。