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:
parent
7ca21cc329
commit
375dd702b2
|
@ -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 😱"
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue