Entries with most feedback
Identical to final time, let’s first have a look at the entries with essentially the most variety of feedback posted within the final 5 years (Jan 2017 to Dec 2021).
load FEX2017to2021.mat addonsAfter2016 commentsAfter2016 versionsAfter2016
addonsAfter2016 = sortrows(addonsAfter2016,“NumComments”,“descend”);
bar([addonsAfter2016.NumAuthorComments(1:10), addonsAfter2016.NumUserComments(1:10)],“stacked”)
title(“Variety of feedback (since Jan 2017)”)
xticklabels(addonsAfter2016.NameShort(1:10))
set(gca,“TickLabelInterpreter”,“none”)
legend(“Creator Feedback”, “Person Feedback”, “Location”, “northeast”)
Wordcloud on feedback
We see that some entries have feedback principally from customers, whereas others have extra feedback from the writer of the entries, suggesting a “dialog” between the customers and the writer. After all, entries with feedback principally from customers aren’t any much less useful. Doing a fast phrase cloud on the feedback on “MATLAB File Affiliation & Shortcut Repair” appears to indicate a number of reward for the entry.
addonsAfter2016 = sortrows(addonsAfter2016,“NumComments”,“descend”);
% Extract all feedback from “MATLAB File Affiliation & Shortcut Repair”
textData = commentsAfter2016.Remark(commentsAfter2016.AddOnUUID == addonsAfter2016.AddOnUUID(1) & ~commentsAfter2016.IsCommentByContributor);
title(“Feedback: ” + addonsAfter2016.Title(1))
Entries with most writer feedback
Let’s examine which entries had many feedback from authors.
addonsAfter2016 = sortrows(addonsAfter2016,“NumAuthorComments”,“descend”);
bar([addonsAfter2016.NumAuthorComments(1:10), addonsAfter2016.NumUserComments(1:10)],“stacked”)
title(“Variety of feedback (since Jan 2017)”)
xticklabels(addonsAfter2016.NameShort(1:10))
set(gca,“TickLabelInterpreter”,“none”)
legend(“Creator Feedback”, “Person Feedback”, “Location”, “northeast”)
Very good! These entries appear to have a pleasant steadiness between writer and consumer feedback.
Most up to date entries
How about variety of updates? Entries which can be incessantly up to date point out that they’re actively maintained by the writer.
addonsAfter2016 = sortrows(addonsAfter2016,“NumUpdates”,“descend”);
bar(addonsAfter2016.NumUpdates(1:10))
title(“Variety of updates (since Jan 2017)”)
xticklabels(addonsAfter2016.NameShort(1:10))
set(gca,“TickLabelInterpreter”,“none”)
Taking a look at just a few metrics
We already see just a few entries that present up in a number of bar charts. Let’s attempt to visualize just a few of those metrics collectively and see which of them stand out.
First, I will arbitrarily select entries which have at the very least 100 feedback since Jan 2017.
addonsAfter2016_over100comments = addonsAfter2016(addonsAfter2016.NumComments > 100,:);
numEntries = peak(addonsAfter2016_over100comments)
47 entries. That is quantity to work with.
Let’s calculate the ratio of writer feedback to all feedback and type primarily based on the ratio. I do that, since I needed to see which entries had a comparatively massive variety of writer feedback in comparison with general feedback.
addonsAfter2016_over100comments.AuthorCommentRatio = addonsAfter2016_over100comments.NumAuthorComments ./ addonsAfter2016_over100comments.NumComments;
addonsAfter2016_over100comments = sortrows(addonsAfter2016_over100comments,“AuthorCommentRatio”,“descend”);
We’ll now have a look at the next 3 metrics:
- Variety of writer feedback
- Ratio of writer feedback to general feedback
- Variety of updates
I’ll rank the 47 entries primarily based on these metrics and have a look at a heatmap.
[~, id_author_comments] = kind(addonsAfter2016_over100comments.NumAuthorComments,“descend”);
[~, id_author_ratio] = kind(addonsAfter2016_over100comments.AuthorCommentRatio,“descend”);
[~, id_updates] = kind(addonsAfter2016_over100comments.NumUpdates,“descend”);
rankings(id_author_comments,1) = 1:numEntries;
rankings(id_author_ratio,2) = 1:numEntries;
rankings(id_updates,3) = 1:numEntries;
heatmap(rankings,“XDisplayLabels”,[“Num Author Comments”,“Author Comment Ratio”,“Num Updates”],…
“YDisplayLabels”, addonsAfter2016_over100comments.NameShort)
Listed here are the entries that ranked in underneath 10 in all three classes.
selectedEntries = addonsAfter2016_over100comments(rankings(:,1) < 10 & rankings(:,2) < 10 & rankings(:,3) < 10,:);
selectedEntries(:,[“Name” “ID” “Author” “NumComments” “NumAuthorComments” “AuthorCommentRatio” “NumUpdates”])
Visualize interactions
Let us take a look at the timings of the interactions in these entries. You will discover that these interactions occur constantly, which is nice to see.
Systemic Danger
This entry has had the very best variety of updates on this time-frame, which have probably been motivated by the various feedback from the customers.
createTimelinePlot(1,selectedEntries,commentsAfter2016,versionsAfter2016)
fitVirusCOVID19
As you may expects, this one got here out quickly after the pandemic outbreak. You see a number of discussions taking place the primary half of 2020.
createTimelinePlot(2,selectedEntries,commentsAfter2016,versionsAfter2016)
spider_plot
createTimelinePlot(3,selectedEntries,commentsAfter2016,versionsAfter2016)
xiangruili/dicm2nii
The file updates for this entry have stopped, however Xiangrui continues to speak together with his customers by the feedback.
createTimelinePlot(4,selectedEntries,commentsAfter2016,versionsAfter2016)
Feedback
Helper perform for creating timeline plot
perform createTimelinePlot(id,selectedEntries,commentsAfter2016,versionsAfter2016)
commentsForEntry = commentsAfter2016(commentsAfter2016.AddOnUUID == selectedEntries.AddOnUUID(id),:);
x = commentsForEntry.Date;
y = 2*ones(peak(commentsForEntry),1);
y(commentsForEntry.IsCommentByContributor) = 3;
versionsForEntry = versionsAfter2016(versionsAfter2016.AddOnUUID == selectedEntries.AddOnUUID(id),:);
scatter(x,y,100,“MarkerEdgeColor”,“none”,“MarkerFaceColor”,“blue”,“MarkerFaceAlpha”,0.25)
plot([versionsForEntry.Date, versionsForEntry.Date]’,…
[1*ones(1,height(versionsForEntry));zeros(1,height(versionsForEntry))],“r”);
yticklabels([“Updates”, “User Comments”, “Author Comments”])
title([selectedEntries.Name(id) selectedEntries.Author(id)],“Interpreter”,“none”)