如何创建极性阶梯图?

时间:2017-05-12 13:18:43

标签: matlab plot polar-coordinates

我想创建一个极地阶梯图。例如,让我们说我想要创建一个图表,该图表可以显示每个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

如何在极坐标图中显示从中心点到周边的值显示温度,而轨道上的点显示时间(通常作为时钟)?

2 个答案:

答案 0 :(得分:0)

以下代码假设钟面上有12小时。

摘要:

  1. 使用基本算术计算钟面上的角度。
  2. 翻转并旋转90度以获得真正的钟面。您可以将XTicks更改为实际时钟数。
  3. 使用stairs生成阶梯图所需的数据,然后使用polar将其绘制在极坐标图中。
  4. 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版本......

对于R2016a或更高版本:

您可以使用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'});

以下是情节:

enter image description here

对于R2016a之前的版本:

在没有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'});

以下是情节:

enter image description here