{"id":7826,"date":"2016-09-09T21:53:06","date_gmt":"2016-09-10T01:53:06","guid":{"rendered":"https:\/\/blogs.mathworks.com\/pick\/?p=7826"},"modified":"2016-09-10T01:43:05","modified_gmt":"2016-09-10T05:43:05","slug":"most-activeinteractive-file-exchange-entry","status":"publish","type":"post","link":"https:\/\/blogs.mathworks.com\/pick\/2016\/09\/09\/most-activeinteractive-file-exchange-entry\/","title":{"rendered":"&#8220;Most Active\/Interactive&#8221; File Exchange Entry"},"content":{"rendered":"\r\n\r\n<div class=\"content\"><p><a href=\"https:\/\/www.mathworks.com\/matlabcentral\/fileexchange\/authors\/15007\">Jiro<\/a>'s pick this week is <a href=\"https:\/\/www.mathworks.com\/matlabcentral\/fileexchange\/23611-peakfit-m\">\"Command-line peak fitter for time-series signals\"<\/a> by <a href=\"https:\/\/www.mathworks.com\/matlabcentral\/profile\/authors\/870532\">Tom O'Haver<\/a>.<\/p><p>Continuing with the celebration of <a href=\"https:\/\/www.mathworks.com\/matlabcentral\/anniversary\/\/\">MATLAB Central's 15th birthday<\/a> and previous week's <a href=\"https:\/\/blogs.mathworks.com\/pick\/2016\/09\/02\/top-files-and-authors\/\">blog post<\/a> by <a href=\"http:\/\/jp.mathworks.com\/matlabcentral\/profile\/authors\/3208495\">Sean<\/a>, I'd like to focus on all of the great interactions people have had through the File Exchange entries. Although, you may not think of the File Exchange as the next big social network, people have collaborated and exchanged conversations through the comments and rating sections of the entries. When I see a File Exchange entry with a lot of comments, I tend to think that the file is getting a lot of interest from other users. If I also see a lot of responses from the author of the file, that means that the author is actively involved with improving and helping people use the file. If there are a lot of updates to the entry, that also means that the author is actively maintaining the file.<\/p><p>So, I wanted to see which files had the most interactions amongst the author and the users. <em>Disclaimer: Not all of the metrics used here are purely quantitative. I've introduced some qualitative fudge factors.<\/em><\/p><p><b>The Data<\/b><\/p><p>I gathered my data the brute-force way, of course using MATLAB. I went through all possible File Exchange IDs and scraped each webpage for comments and updates.<\/p><pre class=\"codeinput\">load <span class=\"string\">FEX<\/span>\r\n<\/pre><p>Here's what the first few entries look like.<\/p><pre class=\"codeinput\">FEX(1:5,:)\r\n<\/pre><pre class=\"codeoutput\">ans = \r\n              Name               FEXID           Author            Comments        Updates  \r\n    _________________________    _____    ____________________    ___________    ___________\r\n    'central_diff.m'             12       'Robert Canfield'       [3x4 table]    [5x3 table]\r\n    'interpsinc.m'               13       'Michael Minardi'       [1x4 table]    [1x3 table]\r\n    'Polybase'                   15       'Giampiero Campa'       [8x4 table]    [7x3 table]\r\n    'Toolbox BOD Version 2.8'    16       'Gert-Helge Geitner'    [1x4 table]    [7x3 table]\r\n    'connectnames.m'             17       'Douglas Harriman'      [1x4 table]    [0x3 table]\r\n<\/pre><p>Here are the comments from the first entry (<a href=\"https:\/\/www.mathworks.com\/matlabcentral\/fileexchange\/12-central-diff-m\">central_diff.m<\/a>, which was <a href=\"https:\/\/blogs.mathworks.com\/pick\/2016\/08\/19\/the-oldest-file\/\">Picked<\/a> a couple of weeks ago).<\/p><pre class=\"codeinput\">FEX.Comments{1}\r\n<\/pre><pre class=\"codeoutput\">ans = \r\n       Date              Name                                           Comment                                   Rating\r\n    __________    ___________________    _____________________________________________________________________    ______\r\n    2004-09-16    'godlove njie teku'    ' '                                                                      4     \r\n    2006-08-09    'Shyang-Wen Tseng'     '&lt;p&gt;This is a very good and usefull add-on function.  Thank you.&lt;\/p&gt;'    4     \r\n    2007-08-06    'Alvaro Valcarce'      '&lt;p&gt;I think that line 98 should be (notice the \"=\" sign)&lt;\/p&gt;&#8230;'           4     \r\n<\/pre><p>And the updates for that entry.<\/p><pre class=\"codeinput\">FEX.Updates{1}\r\n<\/pre><pre class=\"codeoutput\">ans = \r\n       Date       Version                                   Description                                \r\n    __________    _______    __________________________________________________________________________\r\n    NaT           ''         '&lt;p&gt;update description&lt;\/p&gt;'             \r\n    NaT           ''         '&lt;p&gt;description&lt;\/p&gt;'                    \r\n    NaT           ''         '&lt;p&gt;updating description&lt;\/p&gt;'           \r\n    2001-08-21    ''         '&lt;p&gt;updating&lt;\/p&gt;'                       \r\n    2015-10-01    '2.0'      '&lt;p&gt;Second-order accurate forward and backward difference formulae are u&#8230;'\r\n<\/pre><p><b>The Metric<\/b><\/p><p>To help me find the entries with the most \"interactions\", I first calculated the number of comments and updates from the data.<\/p><pre class=\"codeinput\">FEX.NumComments = cellfun(@height, FEX.Comments);\r\nFEX.NumUpdates = cellfun(@height, FEX.Updates);\r\n<\/pre><p>Next, I also wanted to know of all the comments for each entry, how many were by the author of the entry.<\/p><pre class=\"codeinput\">FEX.NumAuthorComments = cellfun(@(a,c) nnz(strcmp(a,c.Name)), <span class=\"keyword\">...<\/span>\r\n    FEX.Author, FEX.Comments);\r\nFEX.NumUserComments = FEX.NumComments - FEX.NumAuthorComments;\r\n<\/pre><p><b>Most Comments<\/b><\/p><p>Let's see which entry had the most comments.<\/p><pre class=\"codeinput\">FEX = sortrows(FEX,<span class=\"string\">'NumComments'<\/span>,<span class=\"string\">'descend'<\/span>);\r\nbarh(FEX.NumComments(10:-1:1))\r\ntitle(<span class=\"string\">'Number of Comments'<\/span>)\r\n\r\n<span class=\"comment\">% Truncate the file names to the first 20 characters (for labeling)<\/span>\r\nfexNames = cellfun(@(x) x(1:min(20,length(x))),FEX.Name(10:-1:1),<span class=\"string\">'UniformOutput'<\/span>,false);\r\n\r\n<span class=\"comment\">% Axes properties<\/span>\r\nax = gca;\r\nax.YLim = [0 11];\r\nax.YTickLabel = fexNames;\r\nax.TickLabelInterpreter = <span class=\"string\">'none'<\/span>;\r\nax.YTickLabelRotation = 30;\r\n<\/pre><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"https:\/\/blogs.mathworks.com\/images\/pick\/jiro\/potw_most_interactive\/potw_most_interactive_01.png\" alt=\"\"> <p>Not surprisingly, <a href=\"http:\/\/jp.mathworks.com\/matlabcentral\/fileexchange\/23629\"><tt>export_fig<\/tt><\/a>.<\/p><p><b>Most Updates<\/b><\/p><p>How about most number of updates?<\/p><pre class=\"codeinput\">FEX = sortrows(FEX,<span class=\"string\">'NumUpdates'<\/span>,<span class=\"string\">'descend'<\/span>);\r\nbarh(FEX.NumUpdates(10:-1:1))\r\ntitle(<span class=\"string\">'Number of Updates'<\/span>)\r\n\r\n<span class=\"comment\">% Truncate the file names to the first 20 characters (for labeling)<\/span>\r\nfexNames = cellfun(@(x) x(1:min(20,length(x))),FEX.Name(10:-1:1),<span class=\"string\">'UniformOutput'<\/span>,false);\r\n\r\n<span class=\"comment\">% Axes properties<\/span>\r\nax = gca;\r\nax.YLim = [0 11];\r\nax.YTickLabel = fexNames;\r\nax.TickLabelInterpreter = <span class=\"string\">'none'<\/span>;\r\nax.YTickLabelRotation = 30;\r\n<\/pre><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"https:\/\/blogs.mathworks.com\/images\/pick\/jiro\/potw_most_interactive\/potw_most_interactive_02.png\" alt=\"\"> <p><a href=\"https:\/\/www.mathworks.com\/matlabcentral\/fileexchange\/42997-dicom-to-nifti-converter--nifti-tool-and-viewer\">\"DICOM to NIfTI converter\"<\/a> just beats <tt>export_fig<\/tt>.<\/p><p><b>Highest percentage of comments by the original author<\/b><\/p><p>One way to see how much the original author was involved with the user comments is to look at the percentage of author comments. (Yes, an author can be heavily involved without actually responding to comments on the File Exchange. He\/she can choose to respond via email or simply update files.) To account for bias towards low number of comments, I have included an arbitrary qualification cutoff of 20 comments.<\/p><pre class=\"codeinput\">FEX.AuthorCommentRatio = FEX.NumAuthorComments .\/ FEX.NumComments;\r\n\r\n<span class=\"comment\">% Fix 0\/0 (-&gt; NaN) to 0<\/span>\r\nFEX.AuthorCommentRatio(isnan(FEX.AuthorCommentRatio)) = 0;\r\n\r\n<span class=\"comment\">% Only look at entries with 20 or more comments<\/span>\r\nFEX = FEX(FEX.NumComments &gt;= 20,:);\r\n\r\nFEX = sortrows(FEX,<span class=\"string\">'AuthorCommentRatio'<\/span>,<span class=\"string\">'descend'<\/span>);\r\nFEX(1:5,{<span class=\"string\">'Name'<\/span>,<span class=\"string\">'Author'<\/span>,<span class=\"string\">'NumComments'<\/span>,<span class=\"string\">'NumAuthorComments'<\/span>,<span class=\"string\">'NumUpdates'<\/span>})\r\n<\/pre><pre class=\"codeoutput\">ans = \r\n                   Name                             Author              NumComments    NumAuthorComments    NumUpdates\r\n    ___________________________________    _________________________    ___________    _________________    __________\r\n    'ipf(arg1,arg2,arg3,arg4)'             'Tom O'Haver'                23             14                   39        \r\n    'nth_element'                          'Peter Li'                   26             14                    7        \r\n    'Tree Controls for User Interfaces'    'Robyn Jackey'               29             15                    6        \r\n    'Wavelet Based  Image Segmentation'    'Ashutosh Kumar Upadhyay'    23             11                   16        \r\n    'iPeak'                                'Tom O'Haver'                36             17                   30        \r\n<\/pre><p>Great job folks!<\/p><p>Let me add another arbitrary qualification cutoff of 10 minimum updates.<\/p><pre class=\"codeinput\">FEX = FEX(FEX.NumUpdates &gt;= 10,:);\r\nFEX(1:5,{<span class=\"string\">'Name'<\/span>,<span class=\"string\">'Author'<\/span>,<span class=\"string\">'NumComments'<\/span>,<span class=\"string\">'NumAuthorComments'<\/span>,<span class=\"string\">'NumUpdates'<\/span>})\r\n<\/pre><pre class=\"codeoutput\">ans = \r\n                           Name                                    Author              NumComments    NumAuthorComments    NumUpdates\r\n    __________________________________________________    _________________________    ___________    _________________    __________\r\n    'ipf(arg1,arg2,arg3,arg4)'                            'Tom O'Haver'                 23            14                   39        \r\n    'Wavelet Based  Image Segmentation'                   'Ashutosh Kumar Upadhyay'     23            11                   16        \r\n    'iPeak'                                               'Tom O'Haver'                 36            17                   30        \r\n    'Command-line peak fitter for time-series signals'    'Tom O'Haver'                120            54                   41        \r\n    'Fast Bilateral Filter'                               'Kunal Chaudhury'             20             9                   14        \r\n<\/pre><p>Wow, Tom is up there 3 times!! I'm a little intrigued by the 4th one, which has 120 comments with 41 updates. Let's take a closer look at the timings of those comments and updates.<\/p><pre class=\"codeinput\"><span class=\"comment\">% Process the 4th entry<\/span>\r\n\r\n<span class=\"comment\">% Break up the comments into user comments and author comments<\/span>\r\nauthorCommentID = strcmp(FEX.Author{4},FEX.Comments{4}.Name);\r\nuserComments = FEX.Comments{4}(~authorCommentID,:);\r\nauthorComments = FEX.Comments{4}(authorCommentID,:);\r\n\r\n<span class=\"comment\">% Create plot<\/span>\r\nh1 = scatter(datenum(userComments.Date),ones(1,height(userComments)),<span class=\"keyword\">...<\/span>\r\n    <span class=\"string\">'MarkerFaceColor'<\/span>,<span class=\"string\">'b'<\/span>,<span class=\"string\">'MarkerEdgeColor'<\/span>,<span class=\"string\">'none'<\/span>,<span class=\"string\">'MarkerFaceAlpha'<\/span>,0.25);\r\nhold <span class=\"string\">on<\/span>\r\nh2 = scatter(datenum(authorComments.Date),1.5*ones(1,height(authorComments)),<span class=\"keyword\">...<\/span>\r\n    <span class=\"string\">'MarkerFaceColor'<\/span>,<span class=\"string\">'r'<\/span>,<span class=\"string\">'MarkerEdgeColor'<\/span>,<span class=\"string\">'none'<\/span>,<span class=\"string\">'MarkerFaceAlpha'<\/span>,0.25);\r\nh3 = plot([FEX.Updates{4}.Date FEX.Updates{4}.Date]',<span class=\"keyword\">...<\/span>\r\n    repmat([0;0.5],1,height(FEX.Updates{4})),<span class=\"string\">'Color'<\/span>,[.3 .7 .3],<span class=\"keyword\">...<\/span>\r\n    <span class=\"string\">'DatetimeTickFormat'<\/span>,<span class=\"string\">'uuuu'<\/span>);\r\nhold <span class=\"string\">off<\/span>\r\n\r\n<span class=\"comment\">% Axis properties<\/span>\r\nax = gca;\r\nax.YLim = [0 2];\r\nax.YTick = [1 1.5];\r\nax.YTickLabel = {<span class=\"string\">'Users'<\/span>,<span class=\"string\">'Author'<\/span>};\r\nax.YTickLabelRotation = 60;\r\nax.YGrid = <span class=\"string\">'on'<\/span>;\r\ntitle({FEX.Name{plotID},FEX.Author{plotID}})\r\nylabel(<span class=\"string\">'Comments'<\/span>)\r\nxlabel(<span class=\"string\">'Date'<\/span>)\r\nlegend([h1;h2;h3(1)],<span class=\"string\">'User Comments'<\/span>,<span class=\"string\">'Author Comments'<\/span>,<span class=\"string\">'Updates'<\/span>)\r\n<\/pre><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"https:\/\/blogs.mathworks.com\/images\/pick\/jiro\/potw_most_interactive\/potw_most_interactive_03.png\" alt=\"\"> <p>We can see that there is a nice balance of comments from users and Tom. The updates seem to be coming in at a nice regular interval, with updates happening recently. This is a sign that Tom has been heavily involved with interacting with users and keeping the file up-to-date.<\/p><p>Thank you, Tom, for being a great citizen of MATLAB Central and the File Exchange! You are what makes this community thrive.<\/p><p><b>Comments<\/b><\/p><p>Give this a try and let us know what you think <a href=\"https:\/\/blogs.mathworks.com\/pick\/?p=7826#respond\">here<\/a> or leave a <a href=\"https:\/\/www.mathworks.com\/matlabcentral\/fileexchange\/23611-peakfit-m#comments\">comment<\/a> for Tom.<\/p><script language=\"JavaScript\"> <!-- \r\n    function grabCode_9f6f31f27b324948ba5afee763af9304() {\r\n        \/\/ Remember the title so we can use it in the new page\r\n        title = document.title;\r\n\r\n        \/\/ Break up these strings so that their presence\r\n        \/\/ in the Javascript doesn't mess up the search for\r\n        \/\/ the MATLAB code.\r\n        t1='9f6f31f27b324948ba5afee763af9304 ' + '##### ' + 'SOURCE BEGIN' + ' #####';\r\n        t2='##### ' + 'SOURCE END' + ' #####' + ' 9f6f31f27b324948ba5afee763af9304';\r\n    \r\n        b=document.getElementsByTagName('body')[0];\r\n        i1=b.innerHTML.indexOf(t1)+t1.length;\r\n        i2=b.innerHTML.indexOf(t2);\r\n \r\n        code_string = b.innerHTML.substring(i1, i2);\r\n        code_string = code_string.replace(\/REPLACE_WITH_DASH_DASH\/g,'--');\r\n\r\n        \/\/ Use \/x3C\/g instead of the less-than character to avoid errors \r\n        \/\/ in the XML parser.\r\n        \/\/ Use '\\x26#60;' instead of '<' so that the XML parser\r\n        \/\/ doesn't go ahead and substitute the less-than character. \r\n        code_string = code_string.replace(\/\\x3C\/g, '\\x26#60;');\r\n\r\n        copyright = 'Copyright 2016 The MathWorks, Inc.';\r\n\r\n        w = window.open();\r\n        d = w.document;\r\n        d.write('<pre>\\n');\r\n        d.write(code_string);\r\n\r\n        \/\/ Add copyright line at the bottom if specified.\r\n        if (copyright.length > 0) {\r\n            d.writeln('');\r\n            d.writeln('%%');\r\n            if (copyright.length > 0) {\r\n                d.writeln('% _' + copyright + '_');\r\n            }\r\n        }\r\n\r\n        d.write('<\/pre>\\n');\r\n\r\n        d.title = title + ' (MATLAB code)';\r\n        d.close();\r\n    }   \r\n     --> <\/script><p style=\"text-align: right; font-size: xx-small; font-weight:lighter;   font-style: italic; color: gray\"><br><a href=\"javascript:grabCode_9f6f31f27b324948ba5afee763af9304()\"><span style=\"font-size: x-small;        font-style: italic;\">Get \r\n      the MATLAB code <noscript>(requires JavaScript)<\/noscript><\/span><\/a><br><br>\r\n      Published with MATLAB&reg; R2016a<br><\/p><p class=\"footer\"><br>\r\n      Published with MATLAB&reg; R2016a<br><\/p><\/div><!--\r\n9f6f31f27b324948ba5afee763af9304 ##### SOURCE BEGIN #####\r\n%%\r\n% <https:\/\/www.mathworks.com\/matlabcentral\/fileexchange\/authors\/15007\r\n% Jiro>'s pick this week is\r\n% <https:\/\/www.mathworks.com\/matlabcentral\/fileexchange\/23611-peakfit-m \"Command-line\r\n% peak fitter for time-series signals\"> by\r\n% <https:\/\/www.mathworks.com\/matlabcentral\/profile\/authors\/870532 Tom\r\n% O'Haver>.\r\n%\r\n% Continuing with the celebration of\r\n% <https:\/\/www.mathworks.com\/matlabcentral\/anniversary\/\/ MATLAB Central's\r\n% 15th birthday> and previous week's\r\n% <https:\/\/blogs.mathworks.com\/pick\/2016\/09\/02\/top-files-and-authors\/ blog\r\n% post> by <http:\/\/jp.mathworks.com\/matlabcentral\/profile\/authors\/3208495\r\n% Sean>, I'd like to focus on all of the great interactions people have had\r\n% through the File Exchange entries. Although, you may not think of the\r\n% File Exchange as the next big social network, people have collaborated\r\n% and exchanged conversations through the comments and rating sections of\r\n% the entries. When I see a File Exchange entry with a lot of comments, I\r\n% tend to think that the file is getting a lot of interest from other\r\n% users. If I also see a lot of responses from the author of the file, that\r\n% means that the author is actively involved with improving and helping\r\n% people use the file. If there are a lot of updates to the entry, that\r\n% also means that the author is actively maintaining the file.\r\n%\r\n% So, I wanted to see which files had the most interactions amongst the\r\n% author and the users. _Disclaimer: Not all of the metrics used here are\r\n% purely quantitative. I've introduced some qualitative fudge factors._\r\n%\r\n% *The Data*\r\n%\r\n% I gathered my data the brute-force way, of course using MATLAB. I went\r\n% through all possible File Exchange IDs and scraped each webpage for\r\n% comments and updates.\r\n\r\nload FEX\r\n\r\n%%\r\n% Here's what the first few entries look like.\r\nFEX(1:5,:)\r\n\r\n%%\r\n% Here are the comments from the first entry\r\n% (<https:\/\/www.mathworks.com\/matlabcentral\/fileexchange\/12-central-diff-m central_diff.m>,\r\n% which was <https:\/\/blogs.mathworks.com\/pick\/2016\/08\/19\/the-oldest-file\/\r\n% Picked> a couple of weeks ago).\r\nFEX.Comments{1}\r\n\r\n%%\r\n% And the updates for that entry.\r\nFEX.Updates{1}\r\n\r\n%%\r\n% *The Metric*\r\n%\r\n% To help me find the entries with the most \"interactions\", I first\r\n% calculated the number of comments and updates from the data.\r\n\r\nFEX.NumComments = cellfun(@height, FEX.Comments);\r\nFEX.NumUpdates = cellfun(@height, FEX.Updates);\r\n\r\n%%\r\n% Next, I also wanted to know of all the comments for each entry, how many\r\n% were by the author of the entry.\r\nFEX.NumAuthorComments = cellfun(@(a,c) nnz(strcmp(a,c.Name)), ...\r\n    FEX.Author, FEX.Comments);\r\nFEX.NumUserComments = FEX.NumComments - FEX.NumAuthorComments;\r\n\r\n%%\r\n% *Most Comments*\r\n%\r\n% Let's see which entry had the most comments.\r\nFEX = sortrows(FEX,'NumComments','descend');\r\nbarh(FEX.NumComments(10:-1:1))\r\ntitle('Number of Comments')\r\n\r\n% Truncate the file names to the first 20 characters (for labeling)\r\nfexNames = cellfun(@(x) x(1:min(20,length(x))),FEX.Name(10:-1:1),'UniformOutput',false);\r\n\r\n% Axes properties\r\nax = gca;\r\nax.YLim = [0 11];\r\nax.YTickLabel = fexNames;\r\nax.TickLabelInterpreter = 'none';\r\nax.YTickLabelRotation = 30;\r\n\r\n%%\r\n% Not surprisingly,\r\n% <http:\/\/jp.mathworks.com\/matlabcentral\/fileexchange\/23629 |export_fig|>.\r\n%\r\n% *Most Updates*\r\n%\r\n% How about most number of updates? \r\nFEX = sortrows(FEX,'NumUpdates','descend');\r\nbarh(FEX.NumUpdates(10:-1:1))\r\ntitle('Number of Updates')\r\n\r\n% Truncate the file names to the first 20 characters (for labeling)\r\nfexNames = cellfun(@(x) x(1:min(20,length(x))),FEX.Name(10:-1:1),'UniformOutput',false);\r\n\r\n% Axes properties\r\nax = gca;\r\nax.YLim = [0 11];\r\nax.YTickLabel = fexNames;\r\nax.TickLabelInterpreter = 'none';\r\nax.YTickLabelRotation = 30;\r\n\r\n%%\r\n% <https:\/\/www.mathworks.com\/matlabcentral\/fileexchange\/42997-dicom-to-nifti-converter--nifti-tool-and-viewer \"DICOM to NIfTI\r\n% converter\"> just beats |export_fig|.\r\n%\r\n% *Highest percentage of comments by the original author*\r\n%\r\n% One way to see how much the original author was involved with the user\r\n% comments is to look at the percentage of author comments. (Yes, an author\r\n% can be heavily involved without actually responding to comments on the\r\n% File Exchange. He\/she can choose to respond via email or simply update\r\n% files.) To account for bias towards low number of comments, I have\r\n% included an arbitrary qualification cutoff of 20 comments.\r\n\r\nFEX.AuthorCommentRatio = FEX.NumAuthorComments .\/ FEX.NumComments;\r\n\r\n% Fix 0\/0 (-> NaN) to 0\r\nFEX.AuthorCommentRatio(isnan(FEX.AuthorCommentRatio)) = 0;\r\n\r\n% Only look at entries with 20 or more comments\r\nFEX = FEX(FEX.NumComments >= 20,:);\r\n\r\nFEX = sortrows(FEX,'AuthorCommentRatio','descend');\r\nFEX(1:5,{'Name','Author','NumComments','NumAuthorComments','NumUpdates'})\r\n%%\r\n% Great job folks!\r\n%\r\n% Let me add another arbitrary qualification cutoff of 10 minimum updates.\r\nFEX = FEX(FEX.NumUpdates >= 10,:);\r\nFEX(1:5,{'Name','Author','NumComments','NumAuthorComments','NumUpdates'})\r\n\r\n%%\r\n% Wow, Tom is up there 3 times!! I'm a little intrigued by the 4th one,\r\n% which has 120 comments with 41 updates. Let's take a closer look at the\r\n% timings of those comments and updates.\r\n\r\n% Process the 4th entry\r\n\r\n% Break up the comments into user comments and author comments\r\nauthorCommentID = strcmp(FEX.Author{4},FEX.Comments{4}.Name);\r\nuserComments = FEX.Comments{4}(~authorCommentID,:);\r\nauthorComments = FEX.Comments{4}(authorCommentID,:);\r\n\r\n% Create plot\r\nh1 = scatter(datenum(userComments.Date),ones(1,height(userComments)),...\r\n    'MarkerFaceColor','b','MarkerEdgeColor','none','MarkerFaceAlpha',0.25);\r\nhold on\r\nh2 = scatter(datenum(authorComments.Date),1.5*ones(1,height(authorComments)),...\r\n    'MarkerFaceColor','r','MarkerEdgeColor','none','MarkerFaceAlpha',0.25);\r\nh3 = plot([FEX.Updates{4}.Date FEX.Updates{4}.Date]',...\r\n    repmat([0;0.5],1,height(FEX.Updates{4})),'Color',[.3 .7 .3],...\r\n    'DatetimeTickFormat','uuuu');\r\nhold off\r\n\r\n% Axis properties\r\nax = gca;\r\nax.YLim = [0 2];\r\nax.YTick = [1 1.5];\r\nax.YTickLabel = {'Users','Author'};\r\nax.YTickLabelRotation = 60;\r\nax.YGrid = 'on';\r\ntitle({FEX.Name{plotID},FEX.Author{plotID}})\r\nylabel('Comments')\r\nxlabel('Date')\r\nlegend([h1;h2;h3(1)],'User Comments','Author Comments','Updates')\r\n\r\n%%\r\n% We can see that there is a nice balance of comments from users and Tom.\r\n% The updates seem to be coming in at a nice regular interval, with updates\r\n% happening recently. This is a sign that Tom has been heavily involved\r\n% with interacting with users and keeping the file up-to-date.\r\n%\r\n% Thank you, Tom, for being a great citizen of MATLAB Central and the File\r\n% Exchange! You are what makes this community thrive.\r\n%\r\n% *Comments*\r\n%\r\n% Give this a try and let us know what you think\r\n% <https:\/\/blogs.mathworks.com\/pick\/?p=7826#respond here> or leave a\r\n% <https:\/\/www.mathworks.com\/matlabcentral\/fileexchange\/23611-peakfit-m#comments\r\n% comment> for Tom.\r\n\r\n##### SOURCE END ##### 9f6f31f27b324948ba5afee763af9304\r\n-->","protected":false},"excerpt":{"rendered":"<div class=\"overview-image\"><img decoding=\"async\"  class=\"img-responsive\" src=\"https:\/\/blogs.mathworks.com\/images\/pick\/jiro\/potw_most_interactive\/potw_most_interactive_01.png\" onError=\"this.style.display ='none';\" \/><\/div><p>\r\n\r\nJiro's pick this week is \"Command-line peak fitter for time-series signals\" by Tom O'Haver.Continuing with the celebration of MATLAB Central's 15th birthday and previous week's blog post by Sean,... <a class=\"read-more\" href=\"https:\/\/blogs.mathworks.com\/pick\/2016\/09\/09\/most-activeinteractive-file-exchange-entry\/\">read more >><\/a><\/p>","protected":false},"author":35,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[16],"tags":[],"_links":{"self":[{"href":"https:\/\/blogs.mathworks.com\/pick\/wp-json\/wp\/v2\/posts\/7826"}],"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\/35"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.mathworks.com\/pick\/wp-json\/wp\/v2\/comments?post=7826"}],"version-history":[{"count":5,"href":"https:\/\/blogs.mathworks.com\/pick\/wp-json\/wp\/v2\/posts\/7826\/revisions"}],"predecessor-version":[{"id":7833,"href":"https:\/\/blogs.mathworks.com\/pick\/wp-json\/wp\/v2\/posts\/7826\/revisions\/7833"}],"wp:attachment":[{"href":"https:\/\/blogs.mathworks.com\/pick\/wp-json\/wp\/v2\/media?parent=7826"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.mathworks.com\/pick\/wp-json\/wp\/v2\/categories?post=7826"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.mathworks.com\/pick\/wp-json\/wp\/v2\/tags?post=7826"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}