我在下图中生成直方图(在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
答案 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');
这给了我以下情节:
如果您有疑问,请告诉我。