我想创建一个极地阶梯图。例如,让我们说我想要创建一个图表,该图表可以显示每个15分钟时间步长的温控器温度设定点(如下面的数据)和相应的温度:
time Therm 1 Therm 2
23 8 8
23:15 14.75 11.165
23:30 21.5 14.330
23:45 28.25 17.495
24:00:00 35 20.660
0:15:00 41.75 23.825
00:30 48.5 26.990
00:45 30.155
01:00 33.320
01:15 36.485
01:30 39.650
01:45 42.815
02:00 45.980
02:15 49.145
02:30 52.310
02:45 55.475
03:00 58.640
03:15 61.805
如何在极坐标图中显示从中心点到周边的值显示温度,而轨道上的点显示时间(通常作为时钟)?
答案 0 :(得分:0)
以下代码假设钟面上有12小时。
摘要:
stairs
生成阶梯图所需的数据,然后使用polar
将其绘制在极坐标图中。 Data = [
23,00 , 8 , 8 ;
23,15 ,14.75 ,11.165;
23,30 ,21.5 ,14.330;
23,45 ,28.25 ,17.495;
24,00 ,35 ,20.660;
00,15 ,41.75 ,23.825;
00,30 ,48.5 ,26.990;
00,45 ,NaN ,30.155;
01,00 ,NaN ,33.320;
01,15 ,NaN ,36.485;
01,30 ,NaN ,39.650;
01,45 ,NaN ,42.815;
02,00 ,NaN ,45.980;
02,15 ,NaN ,49.145;
02,30 ,NaN ,52.310;
02,45 ,NaN ,55.475;
03,00 ,NaN ,58.640;
03,15 ,NaN ,61.805;];
hours = Data(:,1);
minutes = Data(:,2);
T1 = Data(:,3);
T2 = Data(:,4);
theta = mod(hours+minutes/60,12)/12*2*pi;
theta = pi/2 - theta;
[xb2,yb2] = stairs(theta,T2);
[xb1,yb1] = stairs(theta,T1);
polar(xb2,yb2)
hold on
polar(xb1,yb1)
答案 1 :(得分:0)
首先,我们将问题中的样本恒温器数据作为18×2矩阵开始:
data = [8.0000 14.7500 21.5000 28.2500 35.0000 41.7500 48.5000 nan(1, 11); ...
8.0000 11.1650 14.3300 17.4950 20.6600 23.8250 26.9900 30.1550 33.3200 ...
36.4850 39.6500 42.8150 45.9800 49.1450 52.3100 55.4750 58.6400 61.8050].';
您希望定义您在钟面上显示的小时数,您可以通过设置将用于以后所有计算的值来执行此操作:
nHours = 12; % Or 24 will work too
以正确的格式获取时间数据将取决于您的开始。如果您从timeData
中存储的18 x 1 datetime
向量开始,请执行以下操作:
tData = mod(timeData.Hour+timeData.Minute/60, nHours);
或者您可以从头开始生成矢量:
tData = mod(23+(0:15:255).'./60, nHours);
您需要复制值,以便绘图产生阶梯效应。您可以使用函数stairs
复制tData
并生成索引向量以复制data
矩阵的行:
[tData, index] = stairs(tData, 1:numel(tData));
data = data(index, :);
现在,所有数据的格式都是正确的,生成极坐标图的最佳方法取决于您运行的MATLAB版本......
您可以使用polarplot
绘制数据,相应地修改轴设置,然后添加legend:
p = polarplot(2.*pi.*tData./nHours, data);
set(gca, 'ThetaDir', 'clockwise', ...
'ThetaZeroLocation', 'top', ...
'ThetaTick', 360*(0:(nHours-1))./nHours, ...
'ThetaTickLabel', cellstr(num2str((0:(nHours-1)).', '%02d:00')));
legend(p, {'Therm 1', 'Therm 2'});
以下是情节:
在没有polarplot
功能的版本中,必须使用(现已弃用)函数polar
。它创造的情节众所周知难以修改(因此它现在有效地过时),但我们可以非常接近再现以下情节:
polar(2.*pi.*repmat(tData, [1 size(data, 2)])./nHours, data);
set(gca, 'XDir', 'reverse', 'CameraUpVector', [1 0 0]);
hText = findall(0, 'Type', 'text');
labelIndex = cellfun(@(s) ~isempty(s), regexp(get(hText, 'String'), '^\S+$'));
strValues = get(hText(labelIndex), 'String');
strValues = cellstr(num2str(nHours.*str2double(strValues)./360, '%02d:00'));
set(hText(labelIndex), {'String'}, strValues);
legend({'Therm 1', 'Therm 2'});
以下是情节: