File size: 4,091 Bytes
8f412ba
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import matplotlib.pyplot as plt
import re
import numpy as np
from collections import defaultdict


def createGraph(resultPath):
    # Initialize lists to store emotions sequentially
    emotions_list = []
    emotion_counts = defaultdict(int)
    emotion_scores = defaultdict(float)

    # Define a regular expression pattern to match the emotion and score
    pattern = re.compile(r"'emotion': '(\w+)', 'score': ([\d\.]+)")

    # Read and parse the file
    with open(resultPath, 'r') as file:
        for line in file:
            match = pattern.search(line)
            if match:
                emotion = match.group(1)
                score = float(match.group(2))
                emotions_list.append(emotion)
                emotion_counts[emotion] += 1
                emotion_scores[emotion] += score
            else:
                print(f"Skipping malformed line: {line.strip()}")

    # Group emotions into positive, neutral, and negative categories
    emotion_group_map = {
        'happy': 'Positive',
        'surprise': 'Positive',  # Positive emotions
        'neutral': 'Neutral',  # Neutral emotions
        'sad': 'Negative',
        'angry': 'Negative',
        'fear': 'Negative',
        'disgust': 'Negative'  # Negative emotions
    }

    # Aggregate counts for positive, neutral, and negative categories
    grouped_counts = defaultdict(int)
    for emotion in emotions_list:
        grouped_counts[emotion_group_map[emotion]] += 1

    # Define the categories and their counts
    categories = ['Positive', 'Neutral', 'Negative']
    counts = [grouped_counts[category] for category in categories]

    # **Figure 1: Bar Chart for Positive, Neutral, and Negative Emotions**
    plt.figure(figsize=(8, 6))
    plt.bar(categories, counts, color=['green', 'grey', 'red'], alpha=0.7)
    plt.xlabel('Emotion Group')
    plt.ylabel('Count')
    plt.title('Distribution of Positive, Neutral, and Negative Emotions')
    plt.grid(True)

    # Save the bar plot
    plt.savefig('data/output/emotion_bar_plot.png')

    # **Figure 2: Stem Plot (unchanged from previous version)**
    emotion_values = [1 if emotion_group_map[e] == 'Positive' else
                      0 if emotion_group_map[e] == 'Neutral' else
                      -1 for e in emotions_list]

    # Prepare x-axis values (line numbers)
    line_numbers = np.arange(1, len(emotion_values) + 1)

    plt.figure(figsize=(12, 6))
    plt.plot(line_numbers, emotion_values, color='blue', linewidth=2, linestyle='-', marker='o', alpha=0.7)

    for i, emotion in enumerate(emotions_list):
        if emotion_group_map[emotion] == 'Positive':
            plt.axvspan(i + 0.5, i + 1.5, color='green', alpha=0.3)
        elif emotion_group_map[emotion] == 'Neutral':
            plt.axvspan(i + 0.5, i + 1.5, color='grey', alpha=0.3)
        elif emotion_group_map[emotion] == 'Negative':
            plt.axvspan(i + 0.5, i + 1.5, color='red', alpha=0.3)

    plt.xlabel('Line Number')
    plt.ylabel('Emotion Group')
    plt.title('Emotion Type Across the File (Stem Plot)')
    plt.ylim([-2, 2])
    plt.grid(True)
    plt.yticks([-1, 0, 1], ['Negative', 'Neutral', 'Positive'])

    # Save the stem plot
    plt.savefig('data/output/emotion_stem_plot.png')

    # **Figure 3: Combination Bar and Line Chart for Counts and Scores (unchanged)**
    emotions = list(emotion_counts.keys())
    counts = [emotion_counts[e] for e in emotions]
    average_scores = [emotion_scores[e] / emotion_counts[e] for e in emotions]

    fig, ax1 = plt.subplots()

    ax1.bar(emotions, counts, color='b', alpha=0.7)
    ax1.set_xlabel('Emotion')
    ax1.set_ylabel('Count', color='b')
    ax1.tick_params(axis='y', labelcolor='b')

    ax2 = ax1.twinx()
    ax2.plot(emotions, average_scores, color='r', marker='o')
    ax2.set_ylabel('Average Score', color='r')
    ax2.tick_params(axis='y', labelcolor='r')

    plt.title('Emotion Distribution and Average Scores')
    plt.savefig('data/output/emotionAVG.png')