{"id":1884,"date":"2017-03-02T17:51:54","date_gmt":"2017-03-02T17:51:54","guid":{"rendered":"http:\/\/pcool.dyndns.org:8080\/statsbook\/?page_id=1884"},"modified":"2025-07-01T12:47:10","modified_gmt":"2025-07-01T11:47:10","slug":"radar-plots","status":"publish","type":"page","link":"https:\/\/pcool.dyndns.org\/index.php\/radar-plots\/","title":{"rendered":"Radar Plot"},"content":{"rendered":"\n<p>A radar or spider-web plot is a great way to visualise multivariate data when there are three or more continuous variables and several groups (categorical data). In this example data are first prepared and then two methods to create a radar plot will be described.<\/p>\n\n\n\n<p><strong>Preparation of the data<\/strong><\/p>\n\n\n\n<p>Download and open the <a href=\"https:\/\/pcool.dyndns.org:\/wp-content\/data_files\/tests.rda\" target=\"_blank\" rel=\"noreferrer noopener\">tests.rda<\/a> dataset for this example and open it in R. The data set contains the results of 5 tests&nbsp; as a classifier for infection. The gold standard for infection is indicated by the variable &#8216;standard&#8217;. All variables are binary (0, 1) and data that are not available are indicated by &#8216;NA&#8217;. The data can be shown by:<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code><em><mark style=\"background-color:rgba(0, 0, 0, 0);color:#f20505\" class=\"has-inline-color\">tests\n<\/mark><mark style=\"background-color:rgba(0, 0, 0, 0);color:#2305f2\" class=\"has-inline-color\">   test1 test2 test3 test4 test5 standard\n1      0     1     0     0     0        0\n2      1    NA    NA    NA     0        0\n.....\n.....\n55     1     0     1     0     0        0<\/mark><\/em><\/code><\/pre>\n\n\n\n<p>It is straightforward to create a confusion table that compare the classifier to the gold standard:<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code><span style=\"color: #ff0000;\"><em>test1 &lt;- table(tests$test1, tests$standard)<\/em><\/span>\n<span style=\"color: #ff0000;\"><em>test2 &lt;- table(tests$test2, tests$standard)<\/em><\/span>\n<span style=\"color: #ff0000;\"><em>test3 &lt;- table(tests$test3, tests$standard)<\/em><\/span>\n<span style=\"color: #ff0000;\"><em>test4 &lt;- table(tests$test4, tests$standard)<\/em><\/span>\n<span style=\"color: #ff0000;\"><em>test5 &lt;- table(tests$test5, tests$standard)<\/em><\/span><\/code><\/pre>\n\n\n\n<p>The show the confusion table for test 3:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><em><span style=\"color: #ff0000;\">test3&nbsp;&nbsp;<\/span> <\/em>  \n<em><mark style=\"background-color:rgba(0, 0, 0, 0);color:#0f19ec\" class=\"has-inline-color\">   0  1\n  0 35  2\n  1 10  4<\/mark><\/em><\/code><\/pre>\n\n\n\n<p>The <a href=\"https:\/\/pcool.dyndns.org\/index.php\/sensitivity-specificity\/\" data-type=\"page\" data-id=\"813\">positive predictive value<\/a>, <a href=\"https:\/\/pcool.dyndns.org\/index.php\/sensitivity-specificity\/\" data-type=\"page\" data-id=\"813\">negative predictive value<\/a>, <a href=\"https:\/\/pcool.dyndns.org\/index.php\/sensitivity-specificity\/\" data-type=\"page\" data-id=\"813\">sensitivity<\/a>, <a href=\"https:\/\/pcool.dyndns.org\/index.php\/sensitivity-specificity\/\" data-type=\"page\" data-id=\"813\">specificity<\/a> and <a href=\"https:\/\/pcool.dyndns.org\/index.php\/sensitivity-specificity\/\" data-type=\"page\" data-id=\"813\">accuracy<\/a> can be found using the epiR package<sup class='sup-ref-note' id='note-zotero-ref-p1884-r1-o1'><a class='sup-ref-note' href='#zotero-ref-p1884-r1'>1<\/a><\/sup>. Unfortunately, the data in the confusion table is in the wrong order to be inserted into the epi.tests function of the epiR package. To change the order of the matrix:<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code><em><span style=\"color: #ff0000;\">matrix_test1 &lt;-matrix(c(test1&#091;2,2],test1&#091;1,2],test1&#091;2,1],test1&#091;1,1]), ncol = 2)<\/span><\/em>\n<em><span style=\"color: #ff0000;\">matrix_test2 &lt;-matrix(c(test2&#091;2,2],test2&#091;1,2],test2&#091;2,1],test2&#091;1,1]), ncol = 2)<\/span><\/em>\n<em><span style=\"color: #ff0000;\">matrix_test3 &lt;-matrix(c(test3&#091;2,2],test3&#091;1,2],test3&#091;2,1],test3&#091;1,1]), ncol = 2)<\/span><\/em>\n<em><span style=\"color: #ff0000;\">matrix_test4 &lt;-matrix(c(test4&#091;2,2],test4&#091;1,2],test4&#091;2,1],test4&#091;1,1]), ncol = 2)<\/span><\/em>\n<em><span style=\"color: #ff0000;\">matrix_test5 &lt;-matrix(c(test5&#091;2,2],test5&#091;1,2],test5&#091;2,1],test5&#091;1,1]), ncol = 2)<\/span><\/em><\/code><\/pre>\n\n\n\n<p>To show, for example, the matrix of test 3:<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code><span style=\"color: #ff0000;\"><em>matrix_test3<\/em><\/span>\n<span style=\"color: #0000ff;\"><em>&nbsp;&nbsp;&nbsp;&nbsp; &#091;,1] &#091;,2]<\/em><\/span>\n<span style=\"color: #0000ff;\"><em>&#091;1,]&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp; 10<\/em><\/span>\n<span style=\"color: #0000ff;\"><em>&#091;2,]&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp; 35<\/em><\/span><\/code><\/pre>\n\n\n\n<p>To summarise the positive predictive value, negative predictive value, sensitivity, specificity and accuracy using the epiR package<sup class='sup-ref-note' id='note-zotero-ref-p1884-r2-o1'><a class='sup-ref-note' href='#zotero-ref-p1884-r2'>2<\/a><\/sup>, one large matrix (called overall) can be build after the epiR package has been loaded:<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code><em><mark style=\"background-color:rgba(0, 0, 0, 0);color:#f80101\" class=\"has-inline-color\"><span style=\"color: #ff0000;\">library(epiR)<\/span>\n\n<span style=\"color: #ff0000;\">overall &lt;- matrix(c(<\/span>\nepi.tests(matrix_test1)$detail$est&#091;epi.tests(matrix_test1)$detail$statistic == \"pv.pos\"],\nepi.tests(matrix_test1)$detail$est&#091;epi.tests(matrix_test1)$detail$statistic == \"pv.neg\"],\nepi.tests(matrix_test1)$detail$est&#091;epi.tests(matrix_test1)$detail$statistic == \"se\"],\nepi.tests(matrix_test1)$detail$est&#091;epi.tests(matrix_test1)$detail$statistic == \"sp\"],\nepi.tests(matrix_test1)$detail$est&#091;epi.tests(matrix_test1)$detail$statistic == \"diag.ac\"],\nepi.tests(matrix_test2)$detail$est&#091;epi.tests(matrix_test2)$detail$statistic == \"pv.pos\"],\nepi.tests(matrix_test2)$detail$est&#091;epi.tests(matrix_test2)$detail$statistic == \"pv.neg\"],\nepi.tests(matrix_test2)$detail$est&#091;epi.tests(matrix_test2)$detail$statistic == \"se\"],\nepi.tests(matrix_test2)$detail$est&#091;epi.tests(matrix_test2)$detail$statistic == \"sp\"],\nepi.tests(matrix_test2)$detail$est&#091;epi.tests(matrix_test2)$detail$statistic == \"diag.ac\"],\nepi.tests(matrix_test3)$detail$est&#091;epi.tests(matrix_test3)$detail$statistic == \"pv.pos\"],\nepi.tests(matrix_test3)$detail$est&#091;epi.tests(matrix_test3)$detail$statistic == \"pv.neg\"],\nepi.tests(matrix_test3)$detail$est&#091;epi.tests(matrix_test3)$detail$statistic == \"se\"],\nepi.tests(matrix_test3)$detail$est&#091;epi.tests(matrix_test3)$detail$statistic == \"sp\"],\nepi.tests(matrix_test3)$detail$est&#091;epi.tests(matrix_test3)$detail$statistic == \"diag.ac\"],\nepi.tests(matrix_test4)$detail$est&#091;epi.tests(matrix_test4)$detail$statistic == \"pv.pos\"],\nepi.tests(matrix_test4)$detail$est&#091;epi.tests(matrix_test4)$detail$statistic == \"pv.neg\"],\nepi.tests(matrix_test4)$detail$est&#091;epi.tests(matrix_test4)$detail$statistic == \"se\"],\nepi.tests(matrix_test4)$detail$est&#091;epi.tests(matrix_test4)$detail$statistic == \"sp\"],\nepi.tests(matrix_test4)$detail$est&#091;epi.tests(matrix_test4)$detail$statistic == \"diag.ac\"],\nepi.tests(matrix_test5)$detail$est&#091;epi.tests(matrix_test5)$detail$statistic == \"pv.pos\"],\nepi.tests(matrix_test5)$detail$est&#091;epi.tests(matrix_test5)$detail$statistic == \"pv.neg\"],\nepi.tests(matrix_test5)$detail$est&#091;epi.tests(matrix_test5)$detail$statistic == \"se\"],\nepi.tests(matrix_test5)$detail$est&#091;epi.tests(matrix_test5)$detail$statistic == \"sp\"],\nepi.tests(matrix_test5)$detail$est&#091;epi.tests(matrix_test5)$detail$statistic == \"diag.ac\"]),\n<span style=\"color: #ff0000;\">ncol = 5)<\/span><\/mark><\/em><\/code><\/pre>\n\n\n\n<p>To show the matrix, just call the object:<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code><em><mark style=\"background-color:rgba(0, 0, 0, 0);color:#fb0101\" class=\"has-inline-color\">overall\n<\/mark><mark style=\"background-color:rgba(0, 0, 0, 0);color:#0722f5\" class=\"has-inline-color\">          &#091;,1]      &#091;,2]      &#091;,3]      &#091;,4]      &#091;,5]\n&#091;1,] 0.1724138 0.2500000 0.2857143 0.6000000 0.8000000\n&#091;2,] 0.9615385 0.9736842 0.9459459 0.9772727 0.9795918\n&#091;3,] 0.8333333 0.7500000 0.6666667 0.7500000 0.8000000\n&#091;4,] 0.5102041 0.8043478 0.7777778 0.9555556 0.9795918\n&#091;5,] 0.5454545 0.8000000 0.7647059 0.9387755 0.9629630<\/mark><\/em><\/code><\/pre>\n\n\n\n<p>Apply collumn and row names and round the values:<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code><span style=\"color: #ff0000;\"><em>colnames(overall) &lt;- c('Test1','Test2','Test3','Test4','Test5')<\/em><\/span>\n<span style=\"color: #ff0000;\"><em>rownames(overall) &lt;- c('PPV', 'NPV', 'Sens', 'Spec', 'Acc')<\/em><\/span>\n<span style=\"color: #ff0000;\"><em>round(overall*100,0)<\/em><\/span>\n<em><mark style=\"background-color:rgba(0, 0, 0, 0);color:#0914f4\" class=\"has-inline-color\">     Test1 Test2 Test3 Test4 Test5\nPPV     17    25    29    60    80\nNPV     96    97    95    98    98\nSens    83    75    67    75    80\nSpec    51    80    78    96    98\nAcc     55    80    76    94    96<\/mark><\/em><\/code><\/pre>\n\n\n\n<p>The matrix can be transposed (t) and converted to a data frame, called radar, for subsequent analysis:<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code><span style=\"color: #ff0000;\"><em>radar &lt;- t(round(overall*100,0))<\/em><\/span>\n<span style=\"color: #ff0000;\"><em>radar &lt;- as.data.frame(radar)<\/em><\/span>\n<span style=\"color: #ff0000;\"><em>radar<\/em><\/span>\n<em><mark style=\"background-color:rgba(0, 0, 0, 0);color:#0a15ef\" class=\"has-inline-color\">      PPV NPV Sens Spec Acc\nTest1  17  96   83   51  55\nTest2  25  97   75   80  80\nTest3  29  95   67   78  76\nTest4  60  98   75   96  94\nTest5  80  98   80   98  96<\/mark><\/em><\/code><\/pre>\n\n\n\n<p><strong>Two Methods to create a radar plot will be described:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Using the fmsb package<sup class='sup-ref-note' id='note-zotero-ref-p1884-r3-o1'><a class='sup-ref-note' href='#zotero-ref-p1884-r3'>3<\/a><\/sup>(easier, but less versatile)<\/li>\n\n\n\n<li>Using function as provided by LePennec<sup class='sup-ref-note' id='note-zotero-ref-p1884-r4-o1'><a class='sup-ref-note' href='#zotero-ref-p1884-r4'>4<\/a><\/sup> using the ggplot2 package<sup class='sup-ref-note' id='note-zotero-ref-p1884-r5-o1'><a class='sup-ref-note' href='#zotero-ref-p1884-r5'>5<\/a><\/sup><\/li>\n<\/ul>\n\n\n\n<p><strong>Method 1:<\/strong><\/p>\n\n\n\n<p>Make sure the fmsb<sup class='sup-ref-note' id='note-zotero-ref-p1884-r6-o1'><a class='sup-ref-note' href='#zotero-ref-p1884-r6'>6<\/a><\/sup> package is loaded and create a simple radar plot:<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code><span style=\"color: #ff0000;\"><em>library(fmsb)<\/em><\/span>\n<span style=\"color: #ff0000;\"><em>radarchart(radar, maxmin = F)<\/em><\/span><\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" src=\"https:\/\/pcool.dyndns.org\/wp-content\/uploads\/2025\/06\/radar1-1024x1024.png\" alt=\"\" class=\"wp-image-3555\" srcset=\"https:\/\/pcool.dyndns.org\/wp-content\/uploads\/2025\/06\/radar1-1024x1024.png 1024w, https:\/\/pcool.dyndns.org\/wp-content\/uploads\/2025\/06\/radar1-300x300.png 300w, https:\/\/pcool.dyndns.org\/wp-content\/uploads\/2025\/06\/radar1-150x150.png 150w, https:\/\/pcool.dyndns.org\/wp-content\/uploads\/2025\/06\/radar1-768x768.png 768w, https:\/\/pcool.dyndns.org\/wp-content\/uploads\/2025\/06\/radar1-1536x1536.png 1536w, https:\/\/pcool.dyndns.org\/wp-content\/uploads\/2025\/06\/radar1.png 1800w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>The add maximum (100) and minimum (0) values to the plot, they need to be inserted to the first and second row of the data frame respectively:<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code><span style=\"color: #ff0000;\"><em>radar2 &lt;- rbind(rep(100,5) , rep(0,5) , radar)<\/em><\/span>\n<span style=\"color: #ff0000;\"><em>radarchart(radar2)<\/em><\/span><\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" src=\"https:\/\/pcool.dyndns.org\/wp-content\/uploads\/2025\/06\/radar2-1024x1024.png\" alt=\"\" class=\"wp-image-3560\" srcset=\"https:\/\/pcool.dyndns.org\/wp-content\/uploads\/2025\/06\/radar2-1024x1024.png 1024w, https:\/\/pcool.dyndns.org\/wp-content\/uploads\/2025\/06\/radar2-300x300.png 300w, https:\/\/pcool.dyndns.org\/wp-content\/uploads\/2025\/06\/radar2-150x150.png 150w, https:\/\/pcool.dyndns.org\/wp-content\/uploads\/2025\/06\/radar2-768x768.png 768w, https:\/\/pcool.dyndns.org\/wp-content\/uploads\/2025\/06\/radar2-1536x1536.png 1536w, https:\/\/pcool.dyndns.org\/wp-content\/uploads\/2025\/06\/radar2.png 1800w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>A better looking plot can be obtained by setting the arguments as per the manual of the package:<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code><em><span style=\"color: #ff0000;\">colours &lt;- c( 'tomato','orchid','grey','gold', 'seagreen')<\/span><\/em>\n\n<em><span style=\"color: #ff0000;\">radarchart(radar, axistype=1 , maxmin=F, <\/span><\/em><em><span style=\"color: #ff0000;\">pcol=colours, plwd=4, plty=1,<\/span><\/em>\n <em><span style=\"color: #ff0000;\">cglcol=\"grey\", cglty=1, axislabcol=\"black\", cglwd=0.8, <\/span><\/em><em><span style=\"color: #ff0000;\">vlcex=0.8)<\/span><\/em>\n<em><span style=\"color: #ff0000;\">legend(x=0.7, y=1.2, legend = rownames(radar), bty = \"n\", pch=20, col=colours, text.col = \"grey\", cex=1.2, pt.cex=3)<\/span><\/em><\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" src=\"https:\/\/pcool.dyndns.org\/wp-content\/uploads\/2025\/06\/radar3-1024x1024.png\" alt=\"\" class=\"wp-image-3565\" srcset=\"https:\/\/pcool.dyndns.org\/wp-content\/uploads\/2025\/06\/radar3-1024x1024.png 1024w, https:\/\/pcool.dyndns.org\/wp-content\/uploads\/2025\/06\/radar3-300x300.png 300w, https:\/\/pcool.dyndns.org\/wp-content\/uploads\/2025\/06\/radar3-150x150.png 150w, https:\/\/pcool.dyndns.org\/wp-content\/uploads\/2025\/06\/radar3-768x768.png 768w, https:\/\/pcool.dyndns.org\/wp-content\/uploads\/2025\/06\/radar3-1536x1536.png 1536w, https:\/\/pcool.dyndns.org\/wp-content\/uploads\/2025\/06\/radar3-2048x2048.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><strong>Method 2:<\/strong><\/p>\n\n\n\n<p>This method is more versatile, but requires more packages to be loaded. Plots are created using the ggplot2 package<sup class='sup-ref-note' id='note-zotero-ref-p1884-r7-o1'><a class='sup-ref-note' href='#zotero-ref-p1884-r7'>7<\/a><\/sup> and a function from LePennec<sup class='sup-ref-note' id='note-zotero-ref-p1884-r8-o1'><a class='sup-ref-note' href='#zotero-ref-p1884-r8'>8<\/a><\/sup>.<\/p>\n\n\n\n<p>Make sure the required packages , including reshape2<sup class='sup-ref-note' id='note-zotero-ref-p1884-r9-o1'><a class='sup-ref-note' href='#zotero-ref-p1884-r9'>9<\/a><\/sup>, are loaded:<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code><em><span style=\"color: #ff0000;\">library(reshape2)<\/span><\/em>\n<em><span style=\"color: #ff0000;\">library(ggplot2)<\/span><\/em><\/code><\/pre>\n\n\n\n<p>Have a look at the data frame again:<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code><em><mark style=\"background-color:rgba(0, 0, 0, 0);color:#f50515\" class=\"has-inline-color\">radar<\/mark><mark style=\"background-color:rgba(0, 0, 0, 0);color:#050ff4\" class=\"has-inline-color\">\n      PPV NPV Sens Spec Acc\nTest1  17  96   83   51  55\nTest2  25  97   75   80  80\nTest3  29  95   67   78  76\nTest4  60  98   75   96  94\nTest5  80  98   80   98  96<\/mark><\/em><\/code><\/pre>\n\n\n\n<p>The data frame needs to contain a varaible that contains the&nbsp; test; therefore define a new data frame and call it radar3:<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code><span style=\"color: #ff0000;\"><em>test &lt;- c(\"Test 1\", \"Test 2\", \"Test 3\", \"Test 4\", \"Test 5\")<\/em><\/span>\n<span style=\"color: #ff0000;\"><em>radar3 &lt;- cbind(test, radar)<\/em><\/span>\n<span style=\"color: #ff0000;\"><em>radar3<\/em><\/span>\n<em><mark style=\"background-color:rgba(0, 0, 0, 0);color:#1406f6\" class=\"has-inline-color\">        test PPV NPV Sens Spec Acc\nTest1 Test 1  17  96   83   51  55\nTest2 Test 2  25  97   75   80  80\nTest3 Test 3  29  95   67   78  76\nTest4 Test 4  60  98   75   96  94\nTest5 Test 5  80  98   80   98  96<\/mark><\/em><\/code><\/pre>\n\n\n\n<p>Now melt the data using the reshape2 package<sup class='sup-ref-note' id='note-zotero-ref-p1884-r10-o1'><a class='sup-ref-note' href='#zotero-ref-p1884-r10'>10<\/a><\/sup>:<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code><span style=\"color: #ff0000;\"><em>radar4 &lt;- melt(radar3)<\/em><\/span>\n<span style=\"color: #ff0000;\"><em>radar4<\/em><\/span>\n<em><mark style=\"background-color:rgba(0, 0, 0, 0);color:#2609f1\" class=\"has-inline-color\">     test variable value\n1  Test 1      PPV    17\n2  Test 2      PPV    25\n.....\n.....\n25 Test 5      Acc    96<\/mark><\/em><\/code><\/pre>\n\n\n\n<p>and give collumn names:<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code><span style=\"color: #ff0000;\"><em>colnames(radar4) &lt;- c('Test', 'Descript', 'Value')<\/em><\/span>\n<span style=\"color: #ff0000;\"><em>radar4<\/em><\/span>\n<em><mark style=\"background-color:rgba(0, 0, 0, 0);color:#0a25f2\" class=\"has-inline-color\">     Test Descript Value\n1  Test 1      PPV    17\n2  Test 2      PPV    25\n.....\n.....\n25 Test 5      Acc    96<\/mark><\/em><\/code><\/pre>\n\n\n\n<p>LePennec<sup class='sup-ref-note' id='note-zotero-ref-p1884-r11-o1'><a class='sup-ref-note' href='#zotero-ref-p1884-r11'>11<\/a><\/sup> has defined a function that creates radar charts with the ggplot2 package. Load the function:<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code><mark style=\"background-color:rgba(0, 0, 0, 0);color:#f10606\" class=\"has-inline-color\"><em>coord_radar &lt;- function (theta = c(\"x\", \"y\"), start = 0, direction = 1) {\n  theta &lt;- match.arg(theta)\n  r &lt;- if (theta == \"x\") \"y\" else \"x\"\n  ggproto(\n    \"CoordRadar\", CoordPolar,\n    theta = theta,\n    r = r,\n    start = start,\n    direction = sign(direction),\n    is_linear = function(coord) TRUE\n  )\n}<\/em><\/mark><\/code><\/pre>\n\n\n\n<p>Finally, build the plot using the ggplot2 package:<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code><span style=\"color: #ff0000;\"><em>ggplot(radar4, aes(x = Descript, y = Value)) +<\/em><\/span>\n<span style=\"color: #ff0000;\"><em>geom_polygon(aes(group = Test, color = Test), fill = NA, size = 2, show.legend = FALSE) +<\/em><\/span>\n<span style=\"color: #ff0000;\"><em>geom_line(aes(group = Test, color = Test), size = 2) +<\/em><\/span>\n<span style=\"color: #ff0000;\"><em>xlab(\"\") + ylab(\"\") +<\/em><\/span>\n<span style=\"color: #ff0000;\"><em>guides(color = guide_legend(ncol=2)) +<\/em><\/span>\n<span style=\"color: #ff0000;\"><em>scale_color_manual(values = c('springgreen', 'turquoise3', 'gold', 'darkorchid1', 'tomato')) +<\/em><\/span>\n<span style=\"color: #ff0000;\"><em>coord_radar() + <\/em><\/span>\n<span style=\"color: #ff0000;\"><em>ggtitle('Radar Plot - 5 different tests') +<\/em><\/span>\n<span style=\"color: #ff0000;\"><em>theme_bw(base_size = 16)<\/em><\/span><\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" src=\"https:\/\/pcool.dyndns.org\/wp-content\/uploads\/2025\/06\/radar4-1024x1024.png\" alt=\"\" class=\"wp-image-3570\" srcset=\"https:\/\/pcool.dyndns.org\/wp-content\/uploads\/2025\/06\/radar4-1024x1024.png 1024w, https:\/\/pcool.dyndns.org\/wp-content\/uploads\/2025\/06\/radar4-300x300.png 300w, https:\/\/pcool.dyndns.org\/wp-content\/uploads\/2025\/06\/radar4-150x150.png 150w, https:\/\/pcool.dyndns.org\/wp-content\/uploads\/2025\/06\/radar4-768x768.png 768w, https:\/\/pcool.dyndns.org\/wp-content\/uploads\/2025\/06\/radar4-1536x1536.png 1536w, https:\/\/pcool.dyndns.org\/wp-content\/uploads\/2025\/06\/radar4.png 1800w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A radar or spider-web plot is a great way to visualise multivariate data when there are three or more continuous variables and several groups (categorical data). In this example data are first prepared and then two methods to create a radar plot will be described. Preparation of the data Download and open the tests.rda dataset [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"inline_featured_image":false,"footnotes":""},"class_list":["post-1884","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/pcool.dyndns.org\/index.php\/wp-json\/wp\/v2\/pages\/1884","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pcool.dyndns.org\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/pcool.dyndns.org\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/pcool.dyndns.org\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/pcool.dyndns.org\/index.php\/wp-json\/wp\/v2\/comments?post=1884"}],"version-history":[{"count":4,"href":"https:\/\/pcool.dyndns.org\/index.php\/wp-json\/wp\/v2\/pages\/1884\/revisions"}],"predecessor-version":[{"id":4709,"href":"https:\/\/pcool.dyndns.org\/index.php\/wp-json\/wp\/v2\/pages\/1884\/revisions\/4709"}],"wp:attachment":[{"href":"https:\/\/pcool.dyndns.org\/index.php\/wp-json\/wp\/v2\/media?parent=1884"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}