{"id":11287,"date":"2020-02-14T09:00:14","date_gmt":"2020-02-14T14:00:14","guid":{"rendered":"https:\/\/blogs.mathworks.com\/pick\/?p=11287"},"modified":"2020-02-14T09:01:09","modified_gmt":"2020-02-14T14:01:09","slug":"spider-plot-iii-custom-charts-authoring","status":"publish","type":"post","link":"https:\/\/blogs.mathworks.com\/pick\/2020\/02\/14\/spider-plot-iii-custom-charts-authoring\/","title":{"rendered":"Spider Plot III &#8211; Custom Charts (Authoring)"},"content":{"rendered":"<p><a href=\"http:\/\/www.mathworks.com\/matlabcentral\/profile\/authors\/3208495\">Sean<\/a>&#8216;s pick this week is <a href=\"http:\/\/www.mathworks.com\/matlabcentral\/fileexchange\/59561\"><tt>spider_plot<\/tt><\/a> by <a href=\"http:\/\/www.mathworks.com\/matlabcentral\/profile\/authors\/3279387\">Moses<\/a>.<\/p>\n<p><a href=\"https:\/\/blogs.mathworks.com\/pick\/?p=11124\">Last week<\/a>, we looked at the custom chart I created.\u00a0 This week, we&#8217;ll look at authoring it.<\/p>\n<h3>Contents<\/h3>\n<div>\n<ul>\n<li><a href=\"#7\">Authoring the Custom Chart<\/a><\/li>\n<li><a href=\"#8\">Full Custom Chart<\/a><\/li>\n<li><a href=\"#9\">Comments<\/a><\/li>\n<\/ul>\n<\/div>\n<h3>Authoring the Custom Chart<a name=\"7\"><\/a><\/h3>\n<p>Now let&#8217;s look at the steps to author the custom SpiderChart.<\/p>\n<p>First we need a class that inherits from <tt>matlab.graphics.chartcontainer.ChartContainer<\/tt>.<\/p>\n<pre style=\"background: #F9F7F3; padding: 10px; border: 1px solid #c8c8c8;\"><span style=\"color: #0000ff;\">classdef<\/span> SpiderChart &lt; matlab.graphics.chartcontainer.ChartContainer &amp; <span style=\"color: #0000ff;\">...<\/span>\r\n      matlab.graphics.chartcontainer.mixin.Legend<\/pre>\n<p>It needs a public property for everything we want our end users to be able to set or get. You&#8217;ll notice defaults and validation are done on the property level.<\/p>\n<pre style=\"background: #F9F7F3; padding: 10px; border: 1px solid #c8c8c8;\"><span style=\"color: #0000ff;\">properties<\/span> (SetObservable)\r\n   P {mustBeNumeric}\r\n   AxesInterval(1,1) double {mustBeInteger} = 3 <span style=\"color: #228b22;\">% Number of axes grid lines<\/span>\r\n   AxesPrecision = 1 <span style=\"color: #228b22;\">% Tick precision<\/span>\r\n   AxesLimits = [] <span style=\"color: #228b22;\">% Axes limits<\/span>\r\n   FillOption matlab.lang.OnOffSwitchState = <span style=\"color: #a020f0;\">'off'<\/span> <span style=\"color: #228b22;\">% Whether to shade data<\/span>\r\n   FillTransparency(1,1) double {mustBeGreaterThanOrEqual(FillTransparency,0),mustBeLessThanOrEqual(FillTransparency,1)} <span style=\"color: #228b22;\">% Shading alpha<\/span>\r\n   Color(:,3) double {mustBeGreaterThanOrEqual(Color,0),mustBeLessThanOrEqual(Color,1)} = get(groot,<span style=\"color: #a020f0;\">'defaultAxesColorOrder'<\/span>) <span style=\"color: #228b22;\">% Color order<\/span>\r\n   LineStyle {mustBeMember(LineStyle,{'-','--',':','-.','none'})} = <span style=\"color: #a020f0;\">'-'<\/span> <span style=\"color: #228b22;\">% Data line style<\/span>\r\n   LineWidth(1,1) double {mustBePositive} = 2 <span style=\"color: #228b22;\">% Data line width<\/span>\r\n   Marker {mustBeMember(Marker,{'+','o','*','.','x','square','s','diamond','d','v','^','&gt;','&lt;','pentagram','p','hexagram','h','none'})} = <span style=\"color: #a020f0;\">'o'<\/span> <span style=\"color: #228b22;\">% Data marker<\/span>\r\n   MarkerSize(1,1) double {mustBePositive} = 8 <span style=\"color: #228b22;\">% Data marker size<\/span>\r\n   LabelFontSize(1,1) double {mustBePositive} = 10 <span style=\"color: #228b22;\">% Label font size<\/span>\r\n   TickFontSize(1,1) double {mustBePositive} = 10 <span style=\"color: #228b22;\">% Tick font size<\/span>\r\n   AxesLabels = <span style=\"color: #a020f0;\">\"Label \"<\/span> + (1:100); <span style=\"color: #228b22;\">% Axes labels<\/span>\r\n   DataLabels = <span style=\"color: #a020f0;\">\"Data \"<\/span> + (1:100); <span style=\"color: #228b22;\">% Data labels<\/span>\r\n<span style=\"color: #0000ff;\">end<\/span><\/pre>\n<p>We also need properties for the underlying graphics object that our chart will create, adjust, or destroy as necessary. These can&#8217;t be saved or replicated so they&#8217;ll be <i>Transient<\/i> and <i>NonCopyable<\/i>.<\/p>\n<pre style=\"background: #F9F7F3; padding: 10px; border: 1px solid #c8c8c8;\"><span style=\"color: #0000ff;\">properties<\/span> (Access = private, Transient, NonCopyable)\r\n    ThetaAxesLines = gobjects(0)\r\n    RhoAxesLines = gobjects(0)\r\n    DataLines = gobjects(0)\r\n    LabelObjects = gobjects(0)\r\n    FillPatches = gobjects(0)\r\n    AxesTextLabels = gobjects(0)\r\n    AxesTickLabels = gobjects(0)\r\n    DoWholeUpdate = true\r\n    AxesValues\r\n<span style=\"color: #0000ff;\">end<\/span><\/pre>\n<p>Then we need a constructor. I want my class to have both normal syntaxes for a chart, i.e.:<\/p>\n<pre style=\"background: #F9F7F3; padding: 10px; border: 1px solid #c8c8c8;\">SpiderChart(data)\r\nSpiderChart(data, <span style=\"color: #a020f0;\">'Name'<\/span>, value, <span style=\"color: #0000ff;\">...<\/span><span style=\"color: #228b22;\">)<\/span>\r\nSpiderChart(parent, ____)<\/pre>\n<p>so I&#8217;ll handle this in the constructor.<\/p>\n<pre style=\"background: #F9F7F3; padding: 10px; border: 1px solid #c8c8c8;\"><span style=\"color: #228b22;\">% Constructor<\/span>\r\n<span style=\"color: #0000ff;\">function<\/span> obj = SpiderChart(parentOrP, varargin)\r\n    narginchk(1, inf);\r\n    <span style=\"color: #0000ff;\">if<\/span> isa(parentOrP, <span style=\"color: #a020f0;\">'matlab.graphics.Graphics'<\/span>)\r\n    <span style=\"color: #228b22;\">% SpiderPlot(parent, P, 'name', value)<\/span>\r\n       in = [{parentOrP, <span style=\"color: #a020f0;\">'P'<\/span>}, varargin];\r\n    <span style=\"color: #0000ff;\">else<\/span>\r\n       <span style=\"color: #228b22;\">% SpiderPlot(P, 'name', value)<\/span>\r\n       in = [{<span style=\"color: #a020f0;\">'P'<\/span>, parentOrP} varargin];\r\n    <span style=\"color: #0000ff;\">end<\/span>\r\n    <span style=\"color: #228b22;\">% Construct<\/span>\r\n    obj@matlab.graphics.chartcontainer.ChartContainer(in{:});\r\n<span style=\"color: #0000ff;\">end<\/span><\/pre>\n<p>With a custom chart, we need to have a <tt>setup<\/tt> and <tt>update<\/tt> method. The setup runs once when the chart is constructed and update any time a property is changed and a <tt>drawnow<\/tt> called.<\/p>\n<p>There are two properties (<i>P<\/i>, <i>AxesInterval<\/i>) that when changed could require adjusting the total number of graphics objects needed (i.e. could require creating or deleting objects in an update). Because of this, the only thing I&#8217;ll do in <tt>setup<\/tt> is set the axes properties. The update will deal with graphics object creation.<\/p>\n<pre style=\"background: #F9F7F3; padding: 10px; border: 1px solid #c8c8c8;\"><span style=\"color: #0000ff;\">function<\/span> setup(obj)\r\n<span style=\"color: #228b22;\">% Configure axes<\/span>\r\nax = getAxes(obj);\r\nhold(ax, <span style=\"color: #a020f0;\">'on'<\/span>)\r\naxis(ax, <span style=\"color: #a020f0;\">'square'<\/span>)\r\naxis(ax, <span style=\"color: #a020f0;\">'off'<\/span>)\r\n<span style=\"color: #0000ff;\">end<\/span><\/pre>\n<p>The decision of whether to destroy and recreate objects is based on a <i>DoWholeUpdate<\/i> property that is adjusted in the setters for the aforementioned properties. It also defaults to true so on first run, everything is created.<\/p>\n<pre style=\"background: #F9F7F3; padding: 10px; border: 1px solid #c8c8c8;\"><span style=\"color: #228b22;\">%Update implementation<\/span>\r\n<span style=\"color: #0000ff;\">function<\/span> update(obj)\r\n    <span style=\"color: #0000ff;\">if<\/span> obj.DoWholeUpdate\r\n        <span style=\"color: #228b22;\">% Only reset and reinitialize if P or AxesInterval changed<\/span>\r\n        resetStoredGraphicsObjects(obj);\r\n        initializeEverything(obj)\r\n        obj.DoWholeUpdate = false;\r\n    <span style=\"color: #0000ff;\">end<\/span>\r\n    adjustAppearances(obj);\r\n<span style=\"color: #0000ff;\">end<\/span><\/pre>\n<p>These are the setters that toggle updating everything.<\/p>\n<pre style=\"background: #F9F7F3; padding: 10px; border: 1px solid #c8c8c8;\"><span style=\"color: #0000ff;\">function<\/span> set.P(obj, val)\r\n    obj.P = val;\r\n    obj.DoWholeUpdate = true;\r\n<span style=\"color: #0000ff;\">end<\/span><\/pre>\n<pre style=\"background: #F9F7F3; padding: 10px; border: 1px solid #c8c8c8;\"><span style=\"color: #0000ff;\">function<\/span> set.AxesInterval(obj, val)\r\n    obj.AxesInterval = val;\r\n    obj.DoWholeUpdate = true;\r\n<span style=\"color: #0000ff;\">end<\/span><\/pre>\n<p>From the <tt>update<\/tt> method, you can see there are three main algorithmic parts: <tt>resetStoredGraphicsObjects<\/tt>, <tt>initializeEverything<\/tt>, and <tt>adjustAppearances<\/tt>.<\/p>\n<p>The reset step deletes old graphics objects and reinitializes the properties to empty graphics placeholders.<\/p>\n<pre style=\"background: #F9F7F3; padding: 10px; border: 1px solid #c8c8c8;\"><span style=\"color: #0000ff;\">function<\/span> resetStoredGraphicsObjects(obj)\r\n<span style=\"color: #228b22;\">% Delete old objects<\/span>\r\ndelete(obj.ThetaAxesLines)\r\ndelete(obj.RhoAxesLines)\r\ndelete(obj.DataLines)\r\ndelete(obj.LabelObjects)\r\ndelete(obj.FillPatches)\r\ndelete(obj.AxesTextLabels)\r\ndelete(obj.AxesTickLabels)\r\n\r\n<span style=\"color: #228b22;\">% Preallocate new ones as empties<\/span>\r\nobj.ThetaAxesLines = gobjects(0);\r\nobj.RhoAxesLines = gobjects(0);\r\nobj.DataLines = gobjects(0);\r\nobj.LabelObjects = gobjects(0);\r\nobj.FillPatches = gobjects(0);\r\nobj.AxesTextLabels = gobjects(0);\r\nobj.AxesTickLabels = gobjects(0);\r\nobj.AxesValues = [];\r\n<span style=\"color: #0000ff;\">end<\/span><\/pre>\n<p>Next, we initialize new objects where the number of objects is based on the size of <i>P<\/i> and the <i>AxesInterval<\/i>. All of them are initialized invisible with no data associated to them. This is the biggest change I had to make from the original code &#8211; I.e. rather than creating objects and not retaining their handles, I need to create them without setting their customizable properties, store the handles, and then adjust those properties later.<\/p>\n<pre style=\"background: #F9F7F3; padding: 10px; border: 1px solid #c8c8c8;\"><span style=\"color: #0000ff;\">function<\/span> initializeEverything(obj)\r\n<span style=\"color: #228b22;\">% Initialize data children<\/span>\r\nax = getAxes(obj);\r\n<span style=\"color: #0000ff;\">for<\/span> ii = obj.NumDataGroups:-1:1\r\n    obj.FillPatches(ii) = patch(nan, nan, nan, <span style=\"color: #a020f0;\">'EdgeColor'<\/span>, <span style=\"color: #a020f0;\">'none'<\/span>, <span style=\"color: #a020f0;\">'HandleVisibility'<\/span>, <span style=\"color: #a020f0;\">'off'<\/span>, <span style=\"color: #a020f0;\">'Parent'<\/span>, ax);\r\n    obj.DataLines(ii) = line(nan, nan, <span style=\"color: #a020f0;\">'Parent'<\/span>, ax);\r\n<span style=\"color: #0000ff;\">end<\/span>\r\n\r\n<span style=\"color: #228b22;\">% Plot colors<\/span>\r\ngrey = [0.5, 0.5, 0.5];\r\n\r\n<span style=\"color: #228b22;\">% Polar increments<\/span>\r\ntheta_increment = 2*pi\/obj.NumDataPoints;\r\nrho_increment = 1\/(obj.AxesInterval+1);\r\n\r\n<span style=\"color: #228b22;\">%%% Scale Data %%%<\/span>\r\n<span style=\"color: #228b22;\">% Pre-allocation<\/span>\r\nP_scaled = zeros(size(obj.P));\r\naxes_range = zeros(3, obj.NumDataPoints);\r\n\r\n<span style=\"color: #228b22;\">% Iterate through number of data points<\/span>\r\n<span style=\"color: #0000ff;\">for<\/span> ii = 1:obj.NumDataPoints\r\n    <span style=\"color: #228b22;\">% Group of points<\/span>\r\n    group_points = obj.P(:, ii);\r\n    \r\n    <span style=\"color: #228b22;\">% Automatically the range of each group<\/span>\r\n    min_value = min(group_points);\r\n    max_value = max(group_points);\r\n    rangeii = max_value - min_value;\r\n    \r\n    <span style=\"color: #228b22;\">% Check if axes_limits is empty<\/span>\r\n    <span style=\"color: #0000ff;\">if<\/span> isempty(obj.AxesLimits)\r\n        <span style=\"color: #228b22;\">% Scale points to range from [rho_increment, 1]<\/span>\r\n        P_scaled(:, ii) = ((group_points - min_value) \/ rangeii) * (1 - rho_increment) + rho_increment;\r\n    <span style=\"color: #0000ff;\">else<\/span>\r\n        <span style=\"color: #228b22;\">% Manually set the range of each group<\/span>\r\n        min_value = obj.AxesLimits(1, ii);\r\n        max_value = obj.AxesLimits(2, ii);\r\n        rangeii = max_value - min_value;\r\n        \r\n        <span style=\"color: #228b22;\">% Check if the axes limits are within range of points<\/span>\r\n        <span style=\"color: #0000ff;\">if<\/span> min_value &gt; min(group_points) || max_value &lt; max(group_points)\r\n            error(<span style=\"color: #a020f0;\">'Error: Please ensure the manually specified axes limits are within range of the data points.'<\/span>);\r\n        <span style=\"color: #0000ff;\">end<\/span>\r\n        \r\n        <span style=\"color: #228b22;\">% Scale points to range from [rho_increment, 1]<\/span>\r\n        P_scaled(:, ii) = ((group_points - min_value) \/ rangeii) * (1 - rho_increment) + rho_increment;\r\n    <span style=\"color: #0000ff;\">end<\/span>\r\n    \r\n    <span style=\"color: #228b22;\">% Store to array<\/span>\r\n    axes_range(:, ii) = [min_value; max_value; rangeii];\r\n<span style=\"color: #0000ff;\">end<\/span>\r\n\r\n<span style=\"color: #228b22;\">%%% Polar Axes %%%<\/span>\r\n<span style=\"color: #228b22;\">% Polar coordinates<\/span>\r\nrho = 0:rho_increment:1;\r\ntheta = 0:theta_increment:2*pi;\r\n\r\n<span style=\"color: #228b22;\">% Iterate through each theta<\/span>\r\n<span style=\"color: #0000ff;\">for<\/span> ii = (length(theta)-1):-1:1\r\n    <span style=\"color: #228b22;\">% Convert polar to cartesian coordinates<\/span>\r\n    [x_axes, y_axes] = pol2cart(theta(ii), rho);\r\n    \r\n    <span style=\"color: #228b22;\">% Plot<\/span>\r\n    obj.ThetaAxesLines(ii) = line(ax, x_axes, y_axes, <span style=\"color: #a020f0;\">'LineWidth'<\/span>, 1.5, <span style=\"color: #0000ff;\">...<\/span>\r\n        <span style=\"color: #a020f0;\">'Color'<\/span>, grey, <span style=\"color: #a020f0;\">'HandleVisibility'<\/span>, <span style=\"color: #a020f0;\">'off'<\/span>);\r\n    \r\n    min_value = axes_range(1, ii);\r\n    rangeii = axes_range(3, ii);\r\n    \r\n    <span style=\"color: #228b22;\">% Iterate through points on isocurve<\/span>\r\n    <span style=\"color: #0000ff;\">for<\/span> jj = length(rho):-1:2\r\n        <span style=\"color: #228b22;\">% Axes increment value<\/span>\r\n        axes_value = min_value + (rangeii\/obj.AxesInterval) * (jj-2);\r\n        \r\n        <span style=\"color: #228b22;\">% Display axes text<\/span>\r\n        obj.AxesValues(ii, jj-1) = axes_value;\r\n        obj.AxesTickLabels(ii, jj-1) = text(ax, x_axes(jj), y_axes(jj), <span style=\"color: #a020f0;\">''<\/span>, <span style=\"color: #0000ff;\">...<\/span>\r\n            <span style=\"color: #a020f0;\">'Units'<\/span>, <span style=\"color: #a020f0;\">'Data'<\/span>, <span style=\"color: #0000ff;\">...<\/span>\r\n            <span style=\"color: #a020f0;\">'Color'<\/span>, <span style=\"color: #a020f0;\">'k'<\/span>, <span style=\"color: #0000ff;\">...<\/span>\r\n            <span style=\"color: #a020f0;\">'HorizontalAlignment'<\/span>, <span style=\"color: #a020f0;\">'center'<\/span>, <span style=\"color: #0000ff;\">...<\/span>\r\n            <span style=\"color: #a020f0;\">'VerticalAlignment'<\/span>, <span style=\"color: #a020f0;\">'middle'<\/span>, <span style=\"color: #0000ff;\">...<\/span>\r\n            <span style=\"color: #a020f0;\">'Visible'<\/span>, <span style=\"color: #a020f0;\">'off'<\/span>);\r\n    <span style=\"color: #0000ff;\">end<\/span>\r\n<span style=\"color: #0000ff;\">end<\/span>\r\n\r\n<span style=\"color: #228b22;\">% Iterate through each rho<\/span>\r\n<span style=\"color: #0000ff;\">for<\/span> ii = length(rho):-1:2\r\n    <span style=\"color: #228b22;\">% Convert polar to cartesian coordinates<\/span>\r\n    [x_axes, y_axes] = pol2cart(theta, rho(ii));\r\n    \r\n    <span style=\"color: #228b22;\">% Plot<\/span>\r\n    obj.RhoAxesLines(ii-1) = line(ax, x_axes, y_axes, <span style=\"color: #a020f0;\">'Color'<\/span>, grey, <span style=\"color: #a020f0;\">'HandleVisibility'<\/span>, <span style=\"color: #a020f0;\">'off'<\/span>);\r\n<span style=\"color: #0000ff;\">end<\/span>\r\n\r\n<span style=\"color: #228b22;\">%%% Plot %%%<\/span>\r\n<span style=\"color: #228b22;\">% Iterate through number of data groups<\/span>\r\n<span style=\"color: #0000ff;\">for<\/span> ii = obj.NumDataGroups:-1:1\r\n    <span style=\"color: #228b22;\">% Convert polar to cartesian coordinates<\/span>\r\n    [x_points, y_points] = pol2cart(theta(1:end-1), P_scaled(ii, :));\r\n    \r\n    <span style=\"color: #228b22;\">% Make points circular<\/span>\r\n    x_circular = [x_points, x_points(1)];\r\n    y_circular = [y_points, y_points(1)];\r\n    \r\n    <span style=\"color: #228b22;\">% Plot data points<\/span>\r\n    obj.DataLines(ii).XData = x_circular;\r\n    obj.DataLines(ii).YData = y_circular;\r\n    \r\n    <span style=\"color: #228b22;\">% Check if fill option is toggled on<\/span>\r\n    obj.FillPatches(ii).XData = x_circular;\r\n    obj.FillPatches(ii).YData = y_circular;\r\n    \r\n<span style=\"color: #0000ff;\">end<\/span>\r\n\r\n<span style=\"color: #228b22;\">%%% Labels %%%<\/span>\r\n<span style=\"color: #228b22;\">% Iterate through number of data points<\/span>\r\n<span style=\"color: #0000ff;\">for<\/span> ii = 1:obj.NumDataPoints\r\n    <span style=\"color: #228b22;\">% Angle of point in radians<\/span>\r\n    [horz_align, vert_align, x_pos, y_pos] = getQuadrantPosition(theta(ii));\r\n    \r\n    <span style=\"color: #228b22;\">% Display text label<\/span>\r\n    obj.AxesTextLabels(ii) = text(ax, x_axes(ii)+x_pos, y_axes(ii)+y_pos, <span style=\"color: #a020f0;\">''<\/span>, <span style=\"color: #0000ff;\">...<\/span>\r\n        <span style=\"color: #a020f0;\">'Units'<\/span>, <span style=\"color: #a020f0;\">'Data'<\/span>, <span style=\"color: #0000ff;\">...<\/span>\r\n        <span style=\"color: #a020f0;\">'HorizontalAlignment'<\/span>, horz_align, <span style=\"color: #0000ff;\">...<\/span>\r\n        <span style=\"color: #a020f0;\">'VerticalAlihggnment'<\/span>, vert_align, <span style=\"color: #0000ff;\">...<\/span>\r\n        <span style=\"color: #a020f0;\">'EdgeColor'<\/span>, <span style=\"color: #a020f0;\">'k'<\/span>, <span style=\"color: #0000ff;\">...<\/span>\r\n        <span style=\"color: #a020f0;\">'BackgroundColor'<\/span>, <span style=\"color: #a020f0;\">'w'<\/span>, <span style=\"color: #0000ff;\">...<\/span>\r\n        <span style=\"color: #a020f0;\">'Visible'<\/span>, <span style=\"color: #a020f0;\">'off'<\/span>);\r\n<span style=\"color: #0000ff;\">end<\/span>\r\n\r\n<span style=\"color: #0000ff;\">end<\/span>\r\n<\/pre>\n<p>And then finally, adjust the appearances based on the properties. This fires any time any of the properties are changed. It updates the properties of the underlying graphics objects to implement the change.<\/p>\n<pre style=\"background: #F9F7F3; padding: 10px; border: 1px solid #c8c8c8;\"><span style=\"color: #0000ff;\">function<\/span> adjustAppearances(obj)\r\n\r\n<span style=\"color: #228b22;\">% Repeat colors as necessary<\/span>\r\nrepeat_colors = fix(obj.NumDataPoints\/size(obj.Color, 1))+1;\r\ncolors = repmat(obj.Color, repeat_colors, 1);\r\n\r\n<span style=\"color: #228b22;\">% Patches<\/span>\r\n<span style=\"color: #0000ff;\">for<\/span> ii = 1:numel(obj.FillPatches)\r\n    <span style=\"color: #0000ff;\">if<\/span> obj.FillOption\r\n        obj.FillPatches(ii).FaceColor = colors(ii, :);\r\n        obj.FillPatches(ii).FaceAlpha = obj.FillTransparency;\r\n    <span style=\"color: #0000ff;\">else<\/span>\r\n        obj.FillPatches(ii).FaceColor = <span style=\"color: #a020f0;\">'none'<\/span>;\r\n    <span style=\"color: #0000ff;\">end<\/span>\r\n<span style=\"color: #0000ff;\">end<\/span>\r\n\r\n<span style=\"color: #228b22;\">% Data appearances<\/span>\r\n<span style=\"color: #0000ff;\">for<\/span> ii = 1:numel(obj.DataLines)\r\n    obj.DataLines(ii).LineStyle = obj.LineStyle;\r\n    obj.DataLines(ii).Marker =  obj.Marker;\r\n    obj.DataLines(ii).Color = colors(ii, :);\r\n    obj.DataLines(ii).LineWidth = obj.LineWidth;\r\n    obj.DataLines(ii).MarkerSize = obj.MarkerSize;\r\n    obj.DataLines(ii).MarkerFaceColor = colors(ii, :);\r\n    obj.DataLines(ii).DisplayName = obj.DataLabels(ii);\r\n<span style=\"color: #0000ff;\">end<\/span>\r\n\r\n<span style=\"color: #0000ff;\">if<\/span> isequal(obj.AxesLabels, <span style=\"color: #a020f0;\">'none'<\/span>)\r\n    set(obj.AxesTextLabels, <span style=\"color: #a020f0;\">'Visible'<\/span>, <span style=\"color: #a020f0;\">'off'<\/span>)\r\n<span style=\"color: #0000ff;\">else<\/span>\r\n    set(obj.AxesTextLabels, <span style=\"color: #a020f0;\">'Visible'<\/span>, <span style=\"color: #a020f0;\">'on'<\/span>)\r\n    <span style=\"color: #228b22;\">% Iterate through number of data points<\/span>\r\n    <span style=\"color: #0000ff;\">for<\/span> ii = 1:obj.NumDataPoints\r\n        <span style=\"color: #228b22;\">% Display text label<\/span>\r\n        obj.AxesTextLabels(ii).String = obj.AxesLabels{ii};\r\n        obj.AxesTextLabels(ii).FontSize = obj.LabelFontSize;\r\n    <span style=\"color: #0000ff;\">end<\/span>\r\n<span style=\"color: #0000ff;\">end<\/span>\r\n\r\n<span style=\"color: #0000ff;\">if<\/span> isequal(obj.AxesPrecision, <span style=\"color: #a020f0;\">'none'<\/span>)\r\n    set(obj.AxesTickLabels, <span style=\"color: #a020f0;\">'Visible'<\/span>, <span style=\"color: #a020f0;\">'off'<\/span>)\r\n<span style=\"color: #0000ff;\">else<\/span>\r\n    set(obj.AxesTickLabels, <span style=\"color: #a020f0;\">'Visible'<\/span>, <span style=\"color: #a020f0;\">'on'<\/span>)\r\n    <span style=\"color: #228b22;\">% Traverse to update precision<\/span>\r\n    <span style=\"color: #0000ff;\">for<\/span> ii = 1:numel(obj.AxesValues)\r\n        text_str = sprintf(sprintf(<span style=\"color: #a020f0;\">'%%.%if'<\/span>, obj.AxesPrecision), obj.AxesValues(ii));\r\n        obj.AxesTickLabels(ii).String = text_str;\r\n        obj.AxesTickLabels(ii).FontSize = obj.TickFontSize;\r\n    <span style=\"color: #0000ff;\">end<\/span>\r\n<span style=\"color: #0000ff;\">end<\/span>\r\n\r\n<span style=\"color: #0000ff;\">end<\/span>\r\n<\/pre>\n<h3>Full Custom Chart<a name=\"8\"><\/a><\/h3>\n<p>Obviously, it took some effort, design, and a lot of refactoring to turn this into a custom chart and there are still further improvements that could be made (e.g. not updating everything, but one property at a time). If you want to play with it yourself, here is the full <tt>SpiderChart.m<\/tt> class definition file. I took the liberty to make a couple enhancements to Moses&#8217; original, e.g. separating label fontsize and tick fontsize and making things work with string arrays.<\/p>\n<pre style=\"background: #F9F7F3; padding: 10px; border: 1px solid #c8c8c8;\"><span style=\"color: #0000ff;\">classdef<\/span> SpiderChart &lt; matlab.graphics.chartcontainer.ChartContainer &amp; <span style=\"color: #0000ff;\">...<\/span>\r\n        matlab.graphics.chartcontainer.mixin.Legend\r\n<span style=\"color: #228b22;\">%spider_plot Create a spider or radar plot with individual axes.<\/span>\r\n<span style=\"color: #228b22;\">%<\/span>\r\n<span style=\"color: #228b22;\">% Syntax:<\/span>\r\n<span style=\"color: #228b22;\">%   SpiderChart(PData)<\/span>\r\n<span style=\"color: #228b22;\">%   SpiderChart(PData, Name, Value, ...)<\/span>\r\n<span style=\"color: #228b22;\">%   SpiderChart(parent, ___)<\/span>\r\n<span style=\"color: #228b22;\">%<\/span>\r\n<span style=\"color: #228b22;\">% Input Arguments:<\/span>\r\n<span style=\"color: #228b22;\">%   (Required)<\/span>\r\n<span style=\"color: #228b22;\">%   PData            - The data points used to plot the spider chart. The<\/span>\r\n<span style=\"color: #228b22;\">%                      rows are the groups of data and the columns are the<\/span>\r\n<span style=\"color: #228b22;\">%                      data points. The axes labels and axes limits are<\/span>\r\n<span style=\"color: #228b22;\">%                      automatically generated if not specified.<\/span>\r\n<span style=\"color: #228b22;\">%                      [vector | matrix]<\/span>\r\n<span style=\"color: #228b22;\">%<\/span>\r\n<span style=\"color: #228b22;\">% Name-Value Pair Arguments:<\/span>\r\n<span style=\"color: #228b22;\">%   (Optional)<\/span>\r\n<span style=\"color: #228b22;\">%   AxesLabels       - Used to specify the label each of the axes.<\/span>\r\n<span style=\"color: #228b22;\">%                      [auto-generated (default) | cell of strings | 'none']<\/span>\r\n<span style=\"color: #228b22;\">%<\/span>\r\n<span style=\"color: #228b22;\">%   AxesInterval     - Used to change the number of intervals displayed<\/span>\r\n<span style=\"color: #228b22;\">%                      between the webs.<\/span>\r\n<span style=\"color: #228b22;\">%                      [3 (default) | integer]<\/span>\r\n<span style=\"color: #228b22;\">%<\/span>\r\n<span style=\"color: #228b22;\">%   AxesPrecision    - Used to change the precision level on the value<\/span>\r\n<span style=\"color: #228b22;\">%                      displayed on the axes. Enter in 'none' to remove<\/span>\r\n<span style=\"color: #228b22;\">%                      axes text.<\/span>\r\n<span style=\"color: #228b22;\">%                      [1 (default) | integer | 'none']<\/span>\r\n<span style=\"color: #228b22;\">%<\/span>\r\n<span style=\"color: #228b22;\">%   AxesLimits       - Used to manually set the axes limits. A matrix of<\/span>\r\n<span style=\"color: #228b22;\">%                      2 x size(P, 2). The top row is the minimum axes<\/span>\r\n<span style=\"color: #228b22;\">%                      limits and the bottow row is the maximum axes limits.<\/span>\r\n<span style=\"color: #228b22;\">%                      [auto-scaled (default) | matrix]<\/span>\r\n<span style=\"color: #228b22;\">%<\/span>\r\n<span style=\"color: #228b22;\">%   DataLabels       - Labels for data to be used in legend.  String vector<\/span>\r\n<span style=\"color: #228b22;\">%                      with number of elements size(PData, 1).<\/span>\r\n<span style=\"color: #228b22;\">%<\/span>\r\n<span style=\"color: #228b22;\">%   FillOption       - Used to toggle color fill option.<\/span>\r\n<span style=\"color: #228b22;\">%                      ['off' (default) | 'on']<\/span>\r\n<span style=\"color: #228b22;\">%<\/span>\r\n<span style=\"color: #228b22;\">%   FillTransparency - Used to set color fill transparency.<\/span>\r\n<span style=\"color: #228b22;\">%                      [0.1 (default) | scalar in range (0, 1)]<\/span>\r\n<span style=\"color: #228b22;\">%<\/span>\r\n<span style=\"color: #228b22;\">%   Color            - Used to specify the line color, specified as an RGB<\/span>\r\n<span style=\"color: #228b22;\">%                      triplet. The intensities must be in the range (0, 1).<\/span>\r\n<span style=\"color: #228b22;\">%                      [MATLAB colors (default) | RGB triplet]<\/span>\r\n<span style=\"color: #228b22;\">%<\/span>\r\n<span style=\"color: #228b22;\">%   LineStyle        - Used to change the line style of the plots.<\/span>\r\n<span style=\"color: #228b22;\">%                      ['-' (default) | '--' | ':' | '-.' | 'none']<\/span>\r\n<span style=\"color: #228b22;\">%<\/span>\r\n<span style=\"color: #228b22;\">%   LineWidth        - Used to change the line width, where 1 point is <\/span>\r\n<span style=\"color: #228b22;\">%                      1\/72 of an inch.<\/span>\r\n<span style=\"color: #228b22;\">%                      [0.5 (default) | positive value]<\/span>\r\n<span style=\"color: #228b22;\">%<\/span>\r\n<span style=\"color: #228b22;\">%   Marker           - Used to change the marker symbol of the plots.<\/span>\r\n<span style=\"color: #228b22;\">%                      ['o' (default) | 'none' | '*' | 's' | 'd' | ...]<\/span>\r\n<span style=\"color: #228b22;\">%<\/span>\r\n<span style=\"color: #228b22;\">%   MarkerSize       - Used to change the marker size, where 1 point is<\/span>\r\n<span style=\"color: #228b22;\">%                      1\/72 of an inch.<\/span>\r\n<span style=\"color: #228b22;\">%                      [8 (default) | positive value]<\/span>\r\n<span style=\"color: #228b22;\">%<\/span>\r\n<span style=\"color: #228b22;\">%   LabelFontSize    - Used to change the font size of the labels and<\/span>\r\n<span style=\"color: #228b22;\">%                      values displayed on the axes.<\/span>\r\n<span style=\"color: #228b22;\">%                      [10 (default) | scalar value greater than zero]<\/span>\r\n<span style=\"color: #228b22;\">%<\/span>\r\n<span style=\"color: #228b22;\">%   TickFontSize     - Used to change the font size of the values displayed <\/span>\r\n<span style=\"color: #228b22;\">%                      on the axes. [10 (default) | scalar value greater than zero]<\/span>\r\n<span style=\"color: #228b22;\">%<\/span>\r\n<span style=\"color: #228b22;\">%% Examples:<\/span>\r\n<span style=\"color: #228b22;\">%%   <\/span>\r\n<span style=\"color: #228b22;\">% Example 1: Minimal number of arguments. All non-specified, optional<\/span>\r\n<span style=\"color: #228b22;\">% arguments are set to their default values. Axes labels and limits are<\/span>\r\n<span style=\"color: #228b22;\">% automatically generated and set.<\/span>\r\n<span style=\"color: #228b22;\">% <\/span>\r\n<span style=\"color: #228b22;\">% D1 = [5 3 9 1 2];   % Initialize data points<\/span>\r\n<span style=\"color: #228b22;\">% D2 = [5 8 7 2 9];<\/span>\r\n<span style=\"color: #228b22;\">% D3 = [8 2 1 4 6];<\/span>\r\n<span style=\"color: #228b22;\">% P = [D1; D2; D3];<\/span>\r\n<span style=\"color: #228b22;\">% SpiderChart(P, 'DataLabels', \"D\" + (1:3));<\/span>\r\n<span style=\"color: #228b22;\">% legend show<\/span>\r\n<span style=\"color: #228b22;\">%%<\/span>\r\n<span style=\"color: #228b22;\">% Example 2: Manually setting the axes limits. All non-specified, optional<\/span>\r\n<span style=\"color: #228b22;\">% arguments are set to their default values.<\/span>\r\n<span style=\"color: #228b22;\">% <\/span>\r\n<span style=\"color: #228b22;\">% axes_limits = [1, 2, 1, 1, 1; 10, 8, 9, 5, 10]; % Axes limits [min axes limits; max axes limits]<\/span>\r\n<span style=\"color: #228b22;\">% SpiderChart(P, 'AxesLimits', axes_limits);<\/span>\r\n<span style=\"color: #228b22;\">% <\/span>\r\n<span style=\"color: #228b22;\">%%  <\/span>\r\n<span style=\"color: #228b22;\">% Example 3: Set fill option on. The fill transparency can be adjusted.<\/span>\r\n<span style=\"color: #228b22;\">% <\/span>\r\n<span style=\"color: #228b22;\">% axes_labels = {'S1', 'S2', 'S3', 'S4', 'S5'}; % Axes properties<\/span>\r\n<span style=\"color: #228b22;\">% axes_interval = 2;<\/span>\r\n<span style=\"color: #228b22;\">% fill_option = 'on';<\/span>\r\n<span style=\"color: #228b22;\">% fill_transparency = 0.1;<\/span>\r\n<span style=\"color: #228b22;\">% SpiderChart(P,...<\/span>\r\n<span style=\"color: #228b22;\">%     'AxesLabels', axes_labels,...<\/span>\r\n<span style=\"color: #228b22;\">%     'AxesInterval', axes_interval,...<\/span>\r\n<span style=\"color: #228b22;\">%     'FillOption', fill_option,...<\/span>\r\n<span style=\"color: #228b22;\">%     'FillTransparency', fill_transparency);<\/span>\r\n<span style=\"color: #228b22;\">% <\/span>\r\n<span style=\"color: #228b22;\">%%<\/span>\r\n<span style=\"color: #228b22;\">% Example 4: Maximum number of arguments.<\/span>\r\n<span style=\"color: #228b22;\">% <\/span>\r\n<span style=\"color: #228b22;\">% axes_labels = {'S1', 'S2', 'S3', 'S4', 'S5'}; % Axes properties<\/span>\r\n<span style=\"color: #228b22;\">% axes_interval = 4;<\/span>\r\n<span style=\"color: #228b22;\">% axes_precision = 'none';<\/span>\r\n<span style=\"color: #228b22;\">% axes_limits = [1, 2, 1, 1, 1; 10, 8, 9, 5, 10];<\/span>\r\n<span style=\"color: #228b22;\">% fill_option = 'on';<\/span>\r\n<span style=\"color: #228b22;\">% fill_transparency = 0.2;<\/span>\r\n<span style=\"color: #228b22;\">% colors = [1, 0, 0; 0, 1, 0; 0, 0, 1];<\/span>\r\n<span style=\"color: #228b22;\">% line_style = '--';<\/span>\r\n<span style=\"color: #228b22;\">% line_width = 3;<\/span>\r\n<span style=\"color: #228b22;\">% marker_type = 'd';<\/span>\r\n<span style=\"color: #228b22;\">% marker_size = 10;<\/span>\r\n<span style=\"color: #228b22;\">% label_font_size = 12;<\/span>\r\n<span style=\"color: #228b22;\">% tick_font_size = 8;<\/span>\r\n<span style=\"color: #228b22;\">% data_labels = [\"Hello\" \"World\" \"Happy 2020\"];<\/span>\r\n<span style=\"color: #228b22;\">% SpiderChart(P,...<\/span>\r\n<span style=\"color: #228b22;\">%     'AxesLabels', axes_labels,...<\/span>\r\n<span style=\"color: #228b22;\">%     'AxesInterval', axes_interval,...<\/span>\r\n<span style=\"color: #228b22;\">%     'AxesPrecision', axes_precision,...<\/span>\r\n<span style=\"color: #228b22;\">%     'AxesLimits', axes_limits,...<\/span>\r\n<span style=\"color: #228b22;\">%     'FillOption', fill_option,...<\/span>\r\n<span style=\"color: #228b22;\">%     'FillTransparency', fill_transparency,...<\/span>\r\n<span style=\"color: #228b22;\">%     'Color', colors,...<\/span>\r\n<span style=\"color: #228b22;\">%     'LineStyle', line_style,...<\/span>\r\n<span style=\"color: #228b22;\">%     'LineWidth', line_width,...<\/span>\r\n<span style=\"color: #228b22;\">%     'Marker', marker_type,...<\/span>\r\n<span style=\"color: #228b22;\">%     'MarkerSize', marker_size,...<\/span>\r\n<span style=\"color: #228b22;\">%     'LabelFontSize', label_font_size, ...<\/span>\r\n<span style=\"color: #228b22;\">%     'TickFontSize', tick_font_size, ...<\/span>\r\n<span style=\"color: #228b22;\">%     'DataLabels', data_labels)<\/span>\r\n<span style=\"color: #228b22;\">% legend show<\/span>\r\n\r\n    <span style=\"color: #0000ff;\">properties<\/span> (SetObservable)\r\n        P {mustBeNumeric}\r\n        AxesInterval(1,1) double {mustBeInteger} = 3 <span style=\"color: #228b22;\">% Number of axes grid lines<\/span>\r\n        AxesPrecision = 1 <span style=\"color: #228b22;\">% Tick precision<\/span>\r\n        AxesLimits = [] <span style=\"color: #228b22;\">% Axes limits<\/span>\r\n        FillOption matlab.lang.OnOffSwitchState = <span style=\"color: #a020f0;\">'off'<\/span> <span style=\"color: #228b22;\">% Whether to shade data<\/span>\r\n        FillTransparency(1,1) double {mustBeGreaterThanOrEqual(FillTransparency,0),mustBeLessThanOrEqual(FillTransparency,1)} <span style=\"color: #228b22;\">% Shading alpha<\/span>\r\n        Color(:,3) double {mustBeGreaterThanOrEqual(Color,0),mustBeLessThanOrEqual(Color,1)} = get(groot,<span style=\"color: #a020f0;\">'defaultAxesColorOrder'<\/span>) <span style=\"color: #228b22;\">% Color order<\/span>\r\n        LineStyle {mustBeMember(LineStyle,{'-','--',':','-.','none'})} = <span style=\"color: #a020f0;\">'-'<\/span> <span style=\"color: #228b22;\">% Data line style<\/span>\r\n        LineWidth(1,1) double {mustBePositive} = 2 <span style=\"color: #228b22;\">% Data line width<\/span>\r\n        Marker {mustBeMember(Marker,{'+','o','*','.','x','square','s','diamond','d','v','^','&gt;','&lt;','pentagram','p','hexagram','h','none'})} = <span style=\"color: #a020f0;\">'o'<\/span> <span style=\"color: #228b22;\">% Data marker<\/span>\r\n        MarkerSize(1,1) double {mustBePositive} = 8 <span style=\"color: #228b22;\">% Data marker size<\/span>\r\n        LabelFontSize(1,1) double {mustBePositive} = 10 <span style=\"color: #228b22;\">% Label font size<\/span>\r\n        TickFontSize(1,1) double {mustBePositive} = 10 <span style=\"color: #228b22;\">% Tick font size<\/span>\r\n        AxesLabels = <span style=\"color: #a020f0;\">\"Label \"<\/span> + (1:100); <span style=\"color: #228b22;\">% Axes labels<\/span>\r\n        DataLabels = <span style=\"color: #a020f0;\">\"Data \"<\/span> + (1:100); <span style=\"color: #228b22;\">% Data labels<\/span>\r\n    <span style=\"color: #0000ff;\">end<\/span>\r\n    \r\n    <span style=\"color: #0000ff;\">properties<\/span> (Access = private, Transient, NonCopyable)\r\n        ThetaAxesLines = gobjects(0)\r\n        RhoAxesLines = gobjects(0)\r\n        DataLines = gobjects(0)\r\n        LabelObjects = gobjects(0)\r\n        FillPatches = gobjects(0)\r\n        AxesTextLabels = gobjects(0)\r\n        AxesTickLabels = gobjects(0)\r\n        DoWholeUpdate = true\r\n        AxesValues\r\n    <span style=\"color: #0000ff;\">end<\/span>\r\n    \r\n    <span style=\"color: #0000ff;\">properties<\/span> (Dependent, Access = protected, Hidden)\r\n        NumDataGroups\r\n        NumDataPoints\r\n    <span style=\"color: #0000ff;\">end<\/span>    \r\n    \r\n    <span style=\"color: #0000ff;\">methods<\/span>\r\n        <span style=\"color: #228b22;\">% Constructor<\/span>\r\n        <span style=\"color: #0000ff;\">function<\/span> obj = SpiderChart(parentOrP, varargin)\r\n            narginchk(1, inf);\r\n            <span style=\"color: #0000ff;\">if<\/span> isa(parentOrP, <span style=\"color: #a020f0;\">'matlab.graphics.Graphics'<\/span>)\r\n                <span style=\"color: #228b22;\">% SpiderPlot(parent, P, 'name', value)<\/span>\r\n                in = [{parentOrP, <span style=\"color: #a020f0;\">'P'<\/span>}, varargin];\r\n            <span style=\"color: #0000ff;\">else<\/span>\r\n                <span style=\"color: #228b22;\">% SpiderPlot(P, 'name', value)                <\/span>\r\n                in = [{<span style=\"color: #a020f0;\">'P'<\/span>, parentOrP} varargin];\r\n            <span style=\"color: #0000ff;\">end<\/span>\r\n            \r\n            <span style=\"color: #228b22;\">% Construct<\/span>\r\n            obj@matlab.graphics.chartcontainer.ChartContainer(in{:});\r\n\r\n        <span style=\"color: #0000ff;\">end<\/span>\r\n        \r\n<span style=\"color: #228b22;\">        %% Getters<\/span>\r\n        <span style=\"color: #0000ff;\">function<\/span> numpts = get.NumDataPoints(obj)\r\n            numpts = size(obj.P, 2);\r\n            \r\n        <span style=\"color: #0000ff;\">end<\/span>\r\n        \r\n        <span style=\"color: #0000ff;\">function<\/span> numpts = get.NumDataGroups(obj)\r\n            numpts = size(obj.P, 1);\r\n            \r\n        <span style=\"color: #0000ff;\">end<\/span>\r\n        \r\n<span style=\"color: #228b22;\">        %% Setters<\/span>\r\n        <span style=\"color: #228b22;\">% Okay to set DoWholeUpdate property in setters.<\/span>\r\n        <span style=\"color: #228b22;\">%#ok&lt;*MCSUP&gt;<\/span>\r\n        \r\n        <span style=\"color: #0000ff;\">function<\/span> set.P(obj, val)\r\n            obj.P = val;\r\n            obj.DoWholeUpdate = true;\r\n            \r\n        <span style=\"color: #0000ff;\">end<\/span>\r\n        \r\n        <span style=\"color: #0000ff;\">function<\/span> set.AxesInterval(obj, val)\r\n            obj.AxesInterval = val;\r\n            obj.DoWholeUpdate = true;\r\n            \r\n        <span style=\"color: #0000ff;\">end<\/span>\r\n        \r\n    <span style=\"color: #0000ff;\">end<\/span>\r\n    \r\n    <span style=\"color: #0000ff;\">methods<\/span> (Access = protected)\r\n        <span style=\"color: #228b22;\">% Setup implementation<\/span>\r\n        <span style=\"color: #0000ff;\">function<\/span> setup(obj)\r\n            <span style=\"color: #228b22;\">% Configure axes<\/span>\r\n            ax = getAxes(obj);\r\n            hold(ax, <span style=\"color: #a020f0;\">'on'<\/span>)\r\n            axis(ax, <span style=\"color: #a020f0;\">'square'<\/span>)\r\n            axis(ax, <span style=\"color: #a020f0;\">'off'<\/span>)\r\n            \r\n        <span style=\"color: #0000ff;\">end<\/span>\r\n        \r\n        <span style=\"color: #228b22;\">% Update implementation<\/span>\r\n        <span style=\"color: #0000ff;\">function<\/span> update(obj)            \r\n            <span style=\"color: #0000ff;\">if<\/span> obj.DoWholeUpdate                \r\n                <span style=\"color: #228b22;\">% Only reset and reinitialize if P or AxesInterval changed                <\/span>\r\n                resetStoredGraphicsObjects(obj);                                           \r\n                initializeEverything(obj)            \r\n                obj.DoWholeUpdate = false;\r\n            <span style=\"color: #0000ff;\">end<\/span>\r\n            adjustAppearances(obj);      \r\n            \r\n        <span style=\"color: #0000ff;\">end<\/span>\r\n        \r\n        <span style=\"color: #228b22;\">% Adjust existing graphics objects<\/span>\r\n        <span style=\"color: #0000ff;\">function<\/span> adjustAppearances(obj)\r\n            \r\n            <span style=\"color: #228b22;\">% Repeat colors as necessary<\/span>\r\n            repeat_colors = fix(obj.NumDataPoints\/size(obj.Color, 1))+1;\r\n            colors = repmat(obj.Color, repeat_colors, 1);\r\n            \r\n            <span style=\"color: #228b22;\">% Patches<\/span>\r\n            <span style=\"color: #0000ff;\">for<\/span> ii = 1:numel(obj.FillPatches)\r\n                <span style=\"color: #0000ff;\">if<\/span> obj.FillOption\r\n                    obj.FillPatches(ii).FaceColor = colors(ii, :);\r\n                    obj.FillPatches(ii).FaceAlpha = obj.FillTransparency;\r\n                <span style=\"color: #0000ff;\">else<\/span> \r\n                    obj.FillPatches(ii).FaceColor = <span style=\"color: #a020f0;\">'none'<\/span>;\r\n                <span style=\"color: #0000ff;\">end<\/span>\r\n            <span style=\"color: #0000ff;\">end<\/span>\r\n            \r\n            <span style=\"color: #228b22;\">% Data appearances<\/span>\r\n            <span style=\"color: #0000ff;\">for<\/span> ii = 1:numel(obj.DataLines)\r\n                obj.DataLines(ii).LineStyle = obj.LineStyle;\r\n                obj.DataLines(ii).Marker =  obj.Marker;\r\n                obj.DataLines(ii).Color = colors(ii, :);\r\n                obj.DataLines(ii).LineWidth = obj.LineWidth;\r\n                obj.DataLines(ii).MarkerSize = obj.MarkerSize;\r\n                obj.DataLines(ii).MarkerFaceColor = colors(ii, :);\r\n                obj.DataLines(ii).DisplayName = obj.DataLabels(ii);\r\n            <span style=\"color: #0000ff;\">end<\/span>\r\n            \r\n            <span style=\"color: #0000ff;\">if<\/span> isequal(obj.AxesLabels, <span style=\"color: #a020f0;\">'none'<\/span>)\r\n                set(obj.AxesTextLabels, <span style=\"color: #a020f0;\">'Visible'<\/span>, <span style=\"color: #a020f0;\">'off'<\/span>)\r\n            <span style=\"color: #0000ff;\">else<\/span>\r\n                set(obj.AxesTextLabels, <span style=\"color: #a020f0;\">'Visible'<\/span>, <span style=\"color: #a020f0;\">'on'<\/span>)\r\n                <span style=\"color: #228b22;\">% Iterate through number of data points<\/span>\r\n                <span style=\"color: #0000ff;\">for<\/span> ii = 1:obj.NumDataPoints\r\n                    <span style=\"color: #228b22;\">% Display text label<\/span>\r\n                    obj.AxesTextLabels(ii).String = obj.AxesLabels{ii};\r\n                    obj.AxesTextLabels(ii).FontSize = obj.LabelFontSize;\r\n                <span style=\"color: #0000ff;\">end<\/span>                \r\n            <span style=\"color: #0000ff;\">end<\/span>\r\n            \r\n            <span style=\"color: #0000ff;\">if<\/span> isequal(obj.AxesPrecision, <span style=\"color: #a020f0;\">'none'<\/span>)\r\n                set(obj.AxesTickLabels, <span style=\"color: #a020f0;\">'Visible'<\/span>, <span style=\"color: #a020f0;\">'off'<\/span>)\r\n            <span style=\"color: #0000ff;\">else<\/span>\r\n                set(obj.AxesTickLabels, <span style=\"color: #a020f0;\">'Visible'<\/span>, <span style=\"color: #a020f0;\">'on'<\/span>)                \r\n                <span style=\"color: #228b22;\">% Traverse to update precision<\/span>\r\n                <span style=\"color: #0000ff;\">for<\/span> ii = 1:numel(obj.AxesValues)\r\n                    text_str = sprintf(sprintf(<span style=\"color: #a020f0;\">'%%.%if'<\/span>, obj.AxesPrecision), obj.AxesValues(ii));\r\n                    obj.AxesTickLabels(ii).String = text_str;\r\n                    obj.AxesTickLabels(ii).FontSize = obj.TickFontSize;\r\n                <span style=\"color: #0000ff;\">end<\/span>\r\n            <span style=\"color: #0000ff;\">end<\/span>            \r\n            \r\n        <span style=\"color: #0000ff;\">end<\/span>\r\n        \r\n        <span style=\"color: #228b22;\">% Initialize and preconfigure graphics objects<\/span>\r\n        <span style=\"color: #0000ff;\">function<\/span> initializeEverything(obj)\r\n            <span style=\"color: #228b22;\">% Initialize data children<\/span>\r\n            ax = getAxes(obj);\r\n            <span style=\"color: #0000ff;\">for<\/span> ii = obj.NumDataGroups:-1:1\r\n                obj.FillPatches(ii) = patch(nan, nan, nan, <span style=\"color: #a020f0;\">'EdgeColor'<\/span>, <span style=\"color: #a020f0;\">'none'<\/span>, <span style=\"color: #a020f0;\">'HandleVisibility'<\/span>, <span style=\"color: #a020f0;\">'off'<\/span>, <span style=\"color: #a020f0;\">'Parent'<\/span>, ax);\r\n                obj.DataLines(ii) = line(nan, nan, <span style=\"color: #a020f0;\">'Parent'<\/span>, ax);\r\n            <span style=\"color: #0000ff;\">end<\/span>\r\n            \r\n            <span style=\"color: #228b22;\">% Plot colors<\/span>\r\n            grey = [0.5, 0.5, 0.5];\r\n            \r\n            <span style=\"color: #228b22;\">% Polar increments<\/span>\r\n            theta_increment = 2*pi\/obj.NumDataPoints;\r\n            rho_increment = 1\/(obj.AxesInterval+1);\r\n            \r\n            <span style=\"color: #228b22;\">%%% Scale Data %%%<\/span>\r\n            <span style=\"color: #228b22;\">% Pre-allocation<\/span>\r\n            P_scaled = zeros(size(obj.P));\r\n            axes_range = zeros(3, obj.NumDataPoints);\r\n            \r\n            <span style=\"color: #228b22;\">% Iterate through number of data points<\/span>\r\n            <span style=\"color: #0000ff;\">for<\/span> ii = 1:obj.NumDataPoints\r\n                <span style=\"color: #228b22;\">% Group of points<\/span>\r\n                group_points = obj.P(:, ii);\r\n                \r\n                <span style=\"color: #228b22;\">% Automatically the range of each group<\/span>\r\n                min_value = min(group_points);\r\n                max_value = max(group_points);\r\n                rangeii = max_value - min_value;\r\n                \r\n                <span style=\"color: #228b22;\">% Check if axes_limits is empty<\/span>\r\n                <span style=\"color: #0000ff;\">if<\/span> isempty(obj.AxesLimits)\r\n                    <span style=\"color: #228b22;\">% Scale points to range from [rho_increment, 1]<\/span>\r\n                    P_scaled(:, ii) = ((group_points - min_value) \/ rangeii) * (1 - rho_increment) + rho_increment;\r\n                <span style=\"color: #0000ff;\">else<\/span>\r\n                    <span style=\"color: #228b22;\">% Manually set the range of each group<\/span>\r\n                    min_value = obj.AxesLimits(1, ii);\r\n                    max_value = obj.AxesLimits(2, ii);\r\n                    rangeii = max_value - min_value;\r\n                    \r\n                    <span style=\"color: #228b22;\">% Check if the axes limits are within range of points<\/span>\r\n                    <span style=\"color: #0000ff;\">if<\/span> min_value &gt; min(group_points) || max_value &lt; max(group_points)\r\n                        error(<span style=\"color: #a020f0;\">'Error: Please ensure the manually specified axes limits are within range of the data points.'<\/span>);\r\n                    <span style=\"color: #0000ff;\">end<\/span>\r\n                    \r\n                    <span style=\"color: #228b22;\">% Scale points to range from [rho_increment, 1]<\/span>\r\n                    P_scaled(:, ii) = ((group_points - min_value) \/ rangeii) * (1 - rho_increment) + rho_increment;\r\n                <span style=\"color: #0000ff;\">end<\/span>\r\n                \r\n                <span style=\"color: #228b22;\">% Store to array<\/span>\r\n                axes_range(:, ii) = [min_value; max_value; rangeii];\r\n            <span style=\"color: #0000ff;\">end<\/span>\r\n            \r\n            <span style=\"color: #228b22;\">%%% Polar Axes %%%<\/span>\r\n            <span style=\"color: #228b22;\">% Polar coordinates<\/span>\r\n            rho = 0:rho_increment:1;\r\n            theta = 0:theta_increment:2*pi;\r\n            \r\n            <span style=\"color: #228b22;\">% Iterate through each theta<\/span>\r\n            <span style=\"color: #0000ff;\">for<\/span> ii = (length(theta)-1):-1:1\r\n                <span style=\"color: #228b22;\">% Convert polar to cartesian coordinates<\/span>\r\n                [x_axes, y_axes] = pol2cart(theta(ii), rho);\r\n                \r\n                <span style=\"color: #228b22;\">% Plot<\/span>\r\n                obj.ThetaAxesLines(ii) = line(ax, x_axes, y_axes, <span style=\"color: #a020f0;\">'LineWidth'<\/span>, 1.5, <span style=\"color: #0000ff;\">...<\/span>\r\n                    <span style=\"color: #a020f0;\">'Color'<\/span>, grey, <span style=\"color: #a020f0;\">'HandleVisibility'<\/span>, <span style=\"color: #a020f0;\">'off'<\/span>);\r\n                \r\n                min_value = axes_range(1, ii);\r\n                rangeii = axes_range(3, ii);\r\n                \r\n                <span style=\"color: #228b22;\">% Iterate through points on isocurve<\/span>\r\n                <span style=\"color: #0000ff;\">for<\/span> jj = length(rho):-1:2\r\n                    <span style=\"color: #228b22;\">% Axes increment value                    <\/span>\r\n                    axes_value = min_value + (rangeii\/obj.AxesInterval) * (jj-2);\r\n                    \r\n                    <span style=\"color: #228b22;\">% Display axes text<\/span>\r\n                    obj.AxesValues(ii, jj-1) = axes_value;\r\n                    obj.AxesTickLabels(ii, jj-1) = text(ax, x_axes(jj), y_axes(jj), <span style=\"color: #a020f0;\">''<\/span>, <span style=\"color: #0000ff;\">...<\/span>\r\n                        <span style=\"color: #a020f0;\">'Units'<\/span>, <span style=\"color: #a020f0;\">'Data'<\/span>, <span style=\"color: #0000ff;\">...<\/span>\r\n                        <span style=\"color: #a020f0;\">'Color'<\/span>, <span style=\"color: #a020f0;\">'k'<\/span>, <span style=\"color: #0000ff;\">...<\/span>\r\n                        <span style=\"color: #a020f0;\">'HorizontalAlignment'<\/span>, <span style=\"color: #a020f0;\">'center'<\/span>, <span style=\"color: #0000ff;\">...<\/span>\r\n                        <span style=\"color: #a020f0;\">'VerticalAlignment'<\/span>, <span style=\"color: #a020f0;\">'middle'<\/span>, <span style=\"color: #0000ff;\">...<\/span>\r\n                        <span style=\"color: #a020f0;\">'Visible'<\/span>, <span style=\"color: #a020f0;\">'off'<\/span>);\r\n                <span style=\"color: #0000ff;\">end<\/span>\r\n            <span style=\"color: #0000ff;\">end<\/span>\r\n            \r\n            <span style=\"color: #228b22;\">% Iterate through each rho<\/span>\r\n            <span style=\"color: #0000ff;\">for<\/span> ii = length(rho):-1:2\r\n                <span style=\"color: #228b22;\">% Convert polar to cartesian coordinates<\/span>\r\n                [x_axes, y_axes] = pol2cart(theta, rho(ii));\r\n                \r\n                <span style=\"color: #228b22;\">% Plot<\/span>\r\n                obj.RhoAxesLines(ii-1) = line(ax, x_axes, y_axes, <span style=\"color: #a020f0;\">'Color'<\/span>, grey, <span style=\"color: #a020f0;\">'HandleVisibility'<\/span>, <span style=\"color: #a020f0;\">'off'<\/span>);\r\n            <span style=\"color: #0000ff;\">end<\/span>\r\n            \r\n            <span style=\"color: #228b22;\">%%% Plot %%%<\/span>\r\n            <span style=\"color: #228b22;\">% Iterate through number of data groups<\/span>\r\n            <span style=\"color: #0000ff;\">for<\/span> ii = obj.NumDataGroups:-1:1\r\n                <span style=\"color: #228b22;\">% Convert polar to cartesian coordinates<\/span>\r\n                [x_points, y_points] = pol2cart(theta(1:end-1), P_scaled(ii, :));\r\n                \r\n                <span style=\"color: #228b22;\">% Make points circular<\/span>\r\n                x_circular = [x_points, x_points(1)];\r\n                y_circular = [y_points, y_points(1)];\r\n                \r\n                <span style=\"color: #228b22;\">% Plot data points<\/span>\r\n                obj.DataLines(ii).XData = x_circular;\r\n                obj.DataLines(ii).YData = y_circular;\r\n                \r\n                <span style=\"color: #228b22;\">% Check if fill option is toggled on<\/span>\r\n                obj.FillPatches(ii).XData = x_circular;\r\n                obj.FillPatches(ii).YData = y_circular;\r\n\r\n            <span style=\"color: #0000ff;\">end<\/span>\r\n            \r\n            <span style=\"color: #228b22;\">%%% Labels %%%<\/span>\r\n            <span style=\"color: #228b22;\">% Iterate through number of data points<\/span>\r\n            <span style=\"color: #0000ff;\">for<\/span> ii = 1:obj.NumDataPoints\r\n                <span style=\"color: #228b22;\">% Angle of point in radians<\/span>\r\n                [horz_align, vert_align, x_pos, y_pos] = getQuadrantPosition(theta(ii));\r\n                \r\n                <span style=\"color: #228b22;\">% Display text label<\/span>\r\n                obj.AxesTextLabels(ii) = text(ax, x_axes(ii)+x_pos, y_axes(ii)+y_pos, <span style=\"color: #a020f0;\">''<\/span>, <span style=\"color: #0000ff;\">...<\/span>\r\n                    <span style=\"color: #a020f0;\">'Units'<\/span>, <span style=\"color: #a020f0;\">'Data'<\/span>, <span style=\"color: #0000ff;\">...<\/span>\r\n                    <span style=\"color: #a020f0;\">'HorizontalAlignment'<\/span>, horz_align, <span style=\"color: #0000ff;\">...<\/span>\r\n                    <span style=\"color: #a020f0;\">'VerticalAlignment'<\/span>, vert_align, <span style=\"color: #0000ff;\">...<\/span>\r\n                    <span style=\"color: #a020f0;\">'EdgeColor'<\/span>, <span style=\"color: #a020f0;\">'k'<\/span>, <span style=\"color: #0000ff;\">...<\/span>\r\n                    <span style=\"color: #a020f0;\">'BackgroundColor'<\/span>, <span style=\"color: #a020f0;\">'w'<\/span>, <span style=\"color: #0000ff;\">...<\/span>\r\n                    <span style=\"color: #a020f0;\">'Visible'<\/span>, <span style=\"color: #a020f0;\">'off'<\/span>);\r\n            <span style=\"color: #0000ff;\">end<\/span>\r\n            \r\n        <span style=\"color: #0000ff;\">end<\/span>\r\n        \r\n        <span style=\"color: #228b22;\">% Delete graphics objects and reset properties before reinitializing<\/span>\r\n        <span style=\"color: #0000ff;\">function<\/span> resetStoredGraphicsObjects(obj)\r\n            <span style=\"color: #228b22;\">% Delete old objects<\/span>\r\n            delete(obj.ThetaAxesLines)\r\n            delete(obj.RhoAxesLines)\r\n            delete(obj.DataLines)\r\n            delete(obj.LabelObjects)\r\n            delete(obj.FillPatches)\r\n            delete(obj.AxesTextLabels)\r\n            delete(obj.AxesTickLabels)                \r\n            \r\n            <span style=\"color: #228b22;\">% Preallocate new ones as empties<\/span>\r\n            obj.ThetaAxesLines = gobjects(0);\r\n            obj.RhoAxesLines = gobjects(0);\r\n            obj.DataLines = gobjects(0);\r\n            obj.LabelObjects = gobjects(0);\r\n            obj.FillPatches = gobjects(0);\r\n            obj.AxesTextLabels = gobjects(0);\r\n            obj.AxesTickLabels = gobjects(0);\r\n            obj.AxesValues = [];\r\n        <span style=\"color: #0000ff;\">end<\/span>\r\n        \r\n    <span style=\"color: #0000ff;\">end<\/span>\r\n    \r\n<span style=\"color: #0000ff;\">end<\/span>\r\n\r\n<span style=\"color: #0000ff;\">function<\/span> [horz_align, vert_align, x_pos, y_pos] = getQuadrantPosition(theta_point)\r\n\r\n<span style=\"color: #228b22;\">% Find out which quadrant the point is in<\/span>\r\n<span style=\"color: #0000ff;\">if<\/span> theta_point == 0\r\n    quadrant = 0;\r\n<span style=\"color: #0000ff;\">elseif<\/span> theta_point == pi\/2\r\n    quadrant = 1.5;\r\n<span style=\"color: #0000ff;\">elseif<\/span> theta_point == pi\r\n    quadrant = 2.5;\r\n<span style=\"color: #0000ff;\">elseif<\/span> theta_point == 3*pi\/2\r\n    quadrant = 3.5;\r\n<span style=\"color: #0000ff;\">elseif<\/span> theta_point == 2*pi\r\n    quadrant = 0;\r\n<span style=\"color: #0000ff;\">elseif<\/span> theta_point &gt; 0 &amp;&amp; theta_point &lt; pi\/2\r\n    quadrant = 1;\r\n<span style=\"color: #0000ff;\">elseif<\/span> theta_point &gt; pi\/2 &amp;&amp; theta_point &lt; pi\r\n    quadrant = 2;\r\n<span style=\"color: #0000ff;\">elseif<\/span> theta_point &gt; pi &amp;&amp; theta_point &lt; 3*pi\/2\r\n    quadrant = 3;\r\n<span style=\"color: #0000ff;\">elseif<\/span> theta_point &gt; 3*pi\/2 &amp;&amp; theta_point &lt; 2*pi\r\n    quadrant = 4;\r\n<span style=\"color: #0000ff;\">end<\/span>\r\n\r\n<span style=\"color: #228b22;\">% Adjust label alignment depending on quadrant<\/span>\r\n<span style=\"color: #228b22;\">% Shift axis label<\/span>\r\nshift_pos = 0.13;\r\n<span style=\"color: #0000ff;\">switch<\/span> quadrant\r\n    <span style=\"color: #0000ff;\">case<\/span> 0\r\n        horz_align = <span style=\"color: #a020f0;\">'left'<\/span>;\r\n        vert_align = <span style=\"color: #a020f0;\">'middle'<\/span>;\r\n        x_pos = shift_pos;\r\n        y_pos = 0;\r\n    <span style=\"color: #0000ff;\">case<\/span> 1\r\n        horz_align = <span style=\"color: #a020f0;\">'left'<\/span>;\r\n        vert_align = <span style=\"color: #a020f0;\">'bottom'<\/span>;\r\n        x_pos = shift_pos;\r\n        y_pos = shift_pos;\r\n    <span style=\"color: #0000ff;\">case<\/span> 1.5\r\n        horz_align = <span style=\"color: #a020f0;\">'center'<\/span>;\r\n        vert_align = <span style=\"color: #a020f0;\">'bottom'<\/span>;\r\n        x_pos = 0;\r\n        y_pos = shift_pos;\r\n    <span style=\"color: #0000ff;\">case<\/span> 2\r\n        horz_align = <span style=\"color: #a020f0;\">'right'<\/span>;\r\n        vert_align = <span style=\"color: #a020f0;\">'bottom'<\/span>;\r\n        x_pos = -shift_pos;\r\n        y_pos = shift_pos;\r\n    <span style=\"color: #0000ff;\">case<\/span> 2.5\r\n        horz_align = <span style=\"color: #a020f0;\">'right'<\/span>;\r\n        vert_align = <span style=\"color: #a020f0;\">'middle'<\/span>;\r\n        x_pos = -shift_pos;\r\n        y_pos = 0;\r\n    <span style=\"color: #0000ff;\">case<\/span> 3\r\n        horz_align = <span style=\"color: #a020f0;\">'right'<\/span>;\r\n        vert_align = <span style=\"color: #a020f0;\">'top'<\/span>;\r\n        x_pos = -shift_pos;\r\n        y_pos = -shift_pos;\r\n    <span style=\"color: #0000ff;\">case<\/span> 3.5\r\n        horz_align = <span style=\"color: #a020f0;\">'center'<\/span>;\r\n        vert_align = <span style=\"color: #a020f0;\">'top'<\/span>;\r\n        x_pos = 0;\r\n        y_pos = -shift_pos;\r\n    <span style=\"color: #0000ff;\">case<\/span> 4\r\n        horz_align = <span style=\"color: #a020f0;\">'left'<\/span>;\r\n        vert_align = <span style=\"color: #a020f0;\">'top'<\/span>;\r\n        x_pos = shift_pos;\r\n        y_pos = -shift_pos;\r\n<span style=\"color: #0000ff;\">end<\/span>\r\n\r\n<span style=\"color: #0000ff;\">end\r\n<\/span><\/pre>\n<h3>Comments<a name=\"9\"><\/a><\/h3>\n<p>Do you have a use for custom charts or a chart you would like MathWorks to make?<\/p>\n<p>Give it a try and let us know what you think <a href=\"http:\/\/blogs.mathworks.com\/pick\/?p=11287#respond\">here<\/a> or leave a <a href=\"http:\/\/www.mathworks.com\/matlabcentral\/fileexchange\/59561#comments\">comment<\/a> for Moses.<\/p>\n<p><script language=\"JavaScript\">\n<!--\n\n    function grabCode_9348b4f6211b4b9180456d43d71b4093() {\n        \/\/ Remember the title so we can use it in the new page\n        title = document.title;\n\n        \/\/ Break up these strings so that their presence\n        \/\/ in the Javascript doesn't mess up the search for\n        \/\/ the MATLAB code.\n        t1='9348b4f6211b4b9180456d43d71b4093 ' + '##### ' + 'SOURCE BEGIN' + ' #####';\n        t2='##### ' + 'SOURCE END' + ' #####' + ' 9348b4f6211b4b9180456d43d71b4093';\n    \n        b=document.getElementsByTagName('body')[0];\n        i1=b.innerHTML.indexOf(t1)+t1.length;\n        i2=b.innerHTML.indexOf(t2);\n \n        code_string = b.innerHTML.substring(i1, i2);\n        code_string = code_string.replace(\/REPLACE_WITH_DASH_DASH\/g,'--');\n\n        \/\/ Use \/x3C\/g instead of the less-than character to avoid errors \n        \/\/ in the XML parser.\n        \/\/ Use '\\x26#60;' instead of '<' so that the XML parser\n        \/\/ doesn't go ahead and substitute the less-than character. \n        code_string = code_string.replace(\/\\x3C\/g, '\\x26#60;');\n\n        author = 'Sean de Wolski';\n        copyright = 'Copyright 2020 The MathWorks, Inc.';\n\n        w = window.open();\n        d = w.document;\n        d.write('<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<pre>\\n');\r\n        d.write(code_string);\r\n\r\n        \/\/ Add author and copyright lines at the bottom if specified.\r\n        if ((author.length > 0) || (copyright.length > 0)) {\r\n            d.writeln('');\r\n            d.writeln('%%');\r\n            if (author.length > 0) {\r\n                d.writeln('% _' + author + '_');\r\n            }\r\n            if (copyright.length > 0) {\r\n                d.writeln('% _' + copyright + '_');\r\n            }\r\n        }\r\n\r\n        d.write('<\/pre>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\n<\/p>\n\n\n\n\n<p>\\n');\n      \n      d.title = title + ' (MATLAB code)';\n      d.close();\n      }   \n      \n-->\n<\/script><a><span style=\"font-size: x-small; font-style: italic;\"><noscript>(requires JavaScript)<\/noscript><\/span><\/a><\/p>\n<p>Published with MATLAB\u00ae R2020a<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Sean&#8216;s pick this week is spider_plot by Moses.<br \/>\nLast week, we looked at the custom chart I created.\u00a0 This week, we&#8217;ll look at authoring it.<br \/>\nContents<\/p>\n<p>Authoring the Custom Chart<br \/>\nFull&#8230; <a class=\"read-more\" href=\"https:\/\/blogs.mathworks.com\/pick\/2020\/02\/14\/spider-plot-iii-custom-charts-authoring\/\">read more >><\/a><\/p>\n","protected":false},"author":87,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[7,16],"tags":[],"_links":{"self":[{"href":"https:\/\/blogs.mathworks.com\/pick\/wp-json\/wp\/v2\/posts\/11287"}],"collection":[{"href":"https:\/\/blogs.mathworks.com\/pick\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.mathworks.com\/pick\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.mathworks.com\/pick\/wp-json\/wp\/v2\/users\/87"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.mathworks.com\/pick\/wp-json\/wp\/v2\/comments?post=11287"}],"version-history":[{"count":4,"href":"https:\/\/blogs.mathworks.com\/pick\/wp-json\/wp\/v2\/posts\/11287\/revisions"}],"predecessor-version":[{"id":11301,"href":"https:\/\/blogs.mathworks.com\/pick\/wp-json\/wp\/v2\/posts\/11287\/revisions\/11301"}],"wp:attachment":[{"href":"https:\/\/blogs.mathworks.com\/pick\/wp-json\/wp\/v2\/media?parent=11287"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.mathworks.com\/pick\/wp-json\/wp\/v2\/categories?post=11287"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.mathworks.com\/pick\/wp-json\/wp\/v2\/tags?post=11287"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}