def build_single_loudness_chart()

in pca-server/src/pca/pca-aws-sf-process-turn-by-turn.py [0:0]


    def build_single_loudness_chart(self, axes, loudness, interrupts, quiet_time, speech_segments, xaxis_max, yaxis_max,
                                    speaker_tag, speaker_channel, show_x_legend, show_chart_legend):
        """
        Builds a single loundness/sentiment chart using the given data

        :param axes: Axis to use for the chart in our larger table
        :param loudness: Data series for the speakers loudness levels
        :param interrupts: Data series for marking interrupts on the chart
        :param quiet_time: Data series for marking non-talk time on the chart
        :param speech_segments: Call transcript structures
        :param xaxis_max: Second for the last speech entry in the call, which may not have been this speaker
        :param yaxis_max: Max decibel level in the call, which may not have been this speaker
        :param speaker_tag: Name of the caller to check for in the transcript
        :param speaker_channel: Channel tags that mark speech segment as belonging to this speaker
        :param show_x_legend: Flag to show/hide the x-axis legend
        :param show_chart_legend: Flag to show/hide the top-right graph legend
        """

        # Draw the main loudness data bar-chart
        seconds = loudness["Seconds"]
        decibels = loudness["dB"]
        axes.bar(seconds, decibels, label="Speaker volume", width=BAR_CHART_WIDTH)
        axes.set_xlim(xmin=0, xmax=xaxis_max)
        axes.set_ylim(ymax=yaxis_max)
        if show_x_legend:
            axes.set_xlabel("Time (in seconds)")
        axes.set_ylabel("decibels")

        # Build up sentiment data series for positive and negative, plotting it at the bottom
        x = np.linspace(0, max(seconds), endpoint=True, num=(max(seconds) + 1))
        ypos = np.linspace(0, 0, endpoint=True, num=(max(seconds) + 1))
        yneg = np.linspace(0, 0, endpoint=True, num=(max(seconds) + 1))
        yneut = np.linspace(0, 0, endpoint=True, num=(max(seconds) + 1))
        for segment in speech_segments:
            this_second = int(segment.segmentStartTime)
            if segment.segmentSpeaker == speaker_channel:
                if segment.segmentIsPositive:
                    for score in segment.segmentLoudnessScores:
                        ypos[this_second] = 10
                        this_second += 1
                elif segment.segmentNegative:
                    for score in segment.segmentLoudnessScores:
                        yneg[this_second] = 10
                        this_second += 1
                else:
                    for score in segment.segmentLoudnessScores:
                        yneut[this_second] = 10
                        this_second += 1
        axes.bar(x, ypos, label="Positive sentiment", color="limegreen", width=BAR_CHART_WIDTH)
        axes.bar(x, yneg, label="Negative sentiment", color="orangered", width=BAR_CHART_WIDTH)
        axes.bar(x, yneut, label="Neutral sentiment", color="cadetblue", width=BAR_CHART_WIDTH)

        # Finish with the non-talk and interrupt overlays (if there are any)
        if len(quiet_time["Seconds"]) > 0:
            axes.bar(quiet_time["Seconds"], quiet_time["dB"], label="Non-talk time", color="lightcyan",
                     width=BAR_CHART_WIDTH)
        if len(interrupts["Seconds"]) > 0:
            axes.bar(interrupts["Seconds"], interrupts["dB"], label="Interruptions", color="goldenrod",
                     width=BAR_CHART_WIDTH, alpha=0.5, bottom=10)

        # Only show the legend for the top graph if requested
        box = axes.get_position()
        axes.set_position([0.055, box.y0, box.width, box.height])
        axes.text(5, yaxis_max - 5, speaker_tag, style='normal', color='black', bbox={'facecolor': 'white', 'pad': 5})
        if show_chart_legend:
            axes.legend(loc="upper right", bbox_to_anchor=(1.21, 1.0), ncol=1, borderaxespad=0)