UX: Make sentiment trends more readable in time series data (#1013)

Instead of a stacked chart showing a separate series for positive and negative, this PR introduces a simplification to the overall sentiment dashboard. It comprises the sentiment into a single series of the difference between `positive - negative` instead. This should allow for the data to be more easy to scan and look for trends.
This commit is contained in:
Keegan George 2024-12-11 00:22:41 +09:00 committed by GitHub
parent 7ca21cc329
commit 375dd702b2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 11 additions and 19 deletions

View File

@ -400,9 +400,7 @@ en:
sentiment: sentiment:
reports: reports:
overall_sentiment: overall_sentiment: "Overall sentiment (Positive - Negative)"
positive: "Positive"
negative: "Negative"
post_emotion: post_emotion:
sadness: "Sadness 😢" sadness: "Sadness 😢"
surprise: "Surprise 😱" surprise: "Surprise 😱"

View File

@ -5,7 +5,7 @@ module DiscourseAi
class SentimentDashboardReport class SentimentDashboardReport
def self.register!(plugin) def self.register!(plugin)
plugin.add_report("overall_sentiment") do |report| plugin.add_report("overall_sentiment") do |report|
report.modes = [:stacked_chart] report.modes = [:chart]
threshold = 0.6 threshold = 0.6
sentiment_count_sql = Proc.new { |sentiment| <<~SQL } sentiment_count_sql = Proc.new { |sentiment| <<~SQL }
@ -38,20 +38,17 @@ module DiscourseAi
threshold: threshold, threshold: threshold,
) )
data_points = %w[positive negative]
return report if grouped_sentiments.empty? return report if grouped_sentiments.empty?
report.data = report.data =
data_points.map do |point|
{
req: "sentiment_#{point}",
color: point == "positive" ? report.colors[:lime] : report.colors[:purple],
label: I18n.t("discourse_ai.sentiment.reports.overall_sentiment.#{point}"),
data:
grouped_sentiments.map do |gs| grouped_sentiments.map do |gs|
{ x: gs.posted_at, y: gs.public_send("#{point}_count") } {
end, color: report.colors[:lime],
label: I18n.t("discourse_ai.sentiment.reports.overall_sentiment"),
data: {
x: gs.posted_at,
y: gs.public_send("positive_count") - gs.public_send("negative_count"),
},
} }
end end
end end

View File

@ -77,11 +77,8 @@ RSpec.describe DiscourseAi::Sentiment::EntryPoint do
sentiment_classification(pm, positive_classification) sentiment_classification(pm, positive_classification)
report = Report.find("overall_sentiment") report = Report.find("overall_sentiment")
positive_data_point = report.data[0][:data].first[:y].to_i overall_sentiment = report.data[0][:data][:y].to_i
negative_data_point = report.data[1][:data].first[:y].to_i expect(overall_sentiment).to eq(2)
expect(positive_data_point).to eq(1)
expect(negative_data_point).to eq(-1)
end end
end end