diff --git a/02_quant_analysis.py b/02_quant_analysis.py index a7b6e23..434ec36 100644 --- a/02_quant_analysis.py +++ b/02_quant_analysis.py @@ -73,7 +73,6 @@ def _(check_progress, data_all, duration_validation, mo): {duration_validation(data_all)} - """) return @@ -263,23 +262,14 @@ def _(mo, plot_most_ranked_1, top3_voices): def _(mo): mo.md(r""" ## Voice Speaking Style - Perception Traits - """) - return - -@app.cell(hide_code=True) -def _(mo): - mo.md(r""" - How does each voice score for each “speaking style labeled trait”? Here you can find the speaking styles and traits: [Speaking Style Traits Quantitative test design.docx](https://voicebranding-my.sharepoint.com/:w:/g/personal/phoebe_voicebranding_ai/IQBfM_Z8PF98Qalz4lzIbJ3RAUCdc7waB32HZXCj7k3xfo0?e=rtFd27) - - - There are 4 speaking styles: Green, Blue, Orange, Red. - - There are 16 traits distributed across the 4 speaking styles. + Here you can find the speaking styles and traits: [Speaking Style Traits Quantitative test design.docx](https://voicebranding-my.sharepoint.com/:w:/g/personal/phoebe_voicebranding_ai/IQBfM_Z8PF98Qalz4lzIbJ3RAUCdc7waB32HZXCj7k3xfo0?e=rtFd27) """) return @app.cell -def _(data, survey): +def _(data, survey, utl): ss_or, choice_map_or = survey.get_ss_orange_red(data) ss_gb, choice_map_gb = survey.get_ss_green_blue(data) @@ -289,43 +279,26 @@ def _(data, survey): choice_map = {**choice_map_or, **choice_map_gb} # print(_d.head()) - print(choice_map) - return choice_map, ss_all - - -@app.cell -def _(choice_map, ss_all, utl): + # print(choice_map) ss_long = utl.process_speaking_style_data(ss_all, choice_map) - ss_long return (ss_long,) @app.cell -def _(pl, ss_long): - target_trait = "Indifferent | Unfocussed | Detached:Attentive | Helpful | Caring | Deliberate" - trait_data = ss_long.filter(pl.col("Description") == target_trait) - trait_data - return target_trait, trait_data +def _(mo, pl, plts, ss_long): + content = """### How does each voice score for each “speaking style labeled trait”?""" + for i, trait in enumerate(ss_long.select("Description").unique().to_series().to_list()): + trait_d = ss_long.filter(pl.col("Description") == trait) -@app.cell -def _(plts, target_trait, trait_data): - plts.plot_speaking_style_trait_scores( - trait_data, - title=target_trait.replace(":", " ↔ "), - # trait_description="Attentive vs Indifferent", # simplified title - ) - return + content += f""" + ### {i+1}) {trait.replace(":", " ↔ ")} - -app._unparsable_cell( + {mo.ui.plotly(plts.plot_speaking_style_trait_scores(trait_d, title=trait.replace(":", " ↔ "), height=550))} """ - for trait in ss_long.select(\"Description\").unique().to_series().to_list(): - trait_data = ss_long.filter(pl.col(\"Description\") == trait) - mo.md(f\"\"\" - """, - name="_" -) + + mo.md(content) + return @app.cell(hide_code=True) @@ -343,21 +316,13 @@ def _(data, mo, plot_average_scores_with_counts, survey): mo.md(f""" - How does each voice score on a scale from 1-10? + ### How does each voice score on a scale from 1-10? {mo.ui.plotly(plot_average_scores_with_counts(vscales, x_label='Voice', width=1000))} """) return -@app.cell -def _(mo): - mo.md(r""" - - """) - return - - @app.cell(hide_code=True) def _(mo): mo.md(r""" diff --git a/plots.py b/plots.py index 119de8c..a8a9d08 100644 --- a/plots.py +++ b/plots.py @@ -768,7 +768,7 @@ def plot_speaking_style_trait_scores( pl.col("score").mean().alias("mean_score"), pl.col("score").count().alias("count") ]) - .sort("mean_score", descending=True) # Descending for Left-to-Right + .sort("mean_score", descending=False) # Ascending for display bottom-to-top ) # Attempt to extract anchors from DF if not provided @@ -795,33 +795,36 @@ def plot_speaking_style_trait_scores( fig = go.Figure() fig.add_trace(go.Bar( - x=stats["Voice"], # X is Voice - y=stats["mean_score"], # Y is Score + y=stats["Voice"], # Y is Voice + x=stats["mean_score"], # X is Score + orientation='h', text=stats["count"], textposition='inside', + textangle=0, + textfont=dict(size=16, color='white'), texttemplate='%{text}', # Count on bar marker_color=ColorPalette.PRIMARY, - hovertemplate='%{x}
Average: %{y:.2f}
Count: %{text}' + hovertemplate='%{y}
Average: %{x:.2f}
Count: %{text}' )) # Add annotations for anchors annotations = [] - # Place anchors on the right side + # Place anchors at the bottom if left_anchor: annotations.append(dict( - xref='paper', yref='y', - x=1.01, y=1, - xanchor='left', yanchor='middle', + xref='x', yref='paper', + x=1, y=-0.2, # Below axis + xanchor='left', yanchor='top', text=f"1: {left_anchor.split('|')[0]}", showarrow=False, font=dict(size=10, color='gray') )) if right_anchor: annotations.append(dict( - xref='paper', yref='y', - x=1.01, y=5, - xanchor='left', yanchor='middle', + xref='x', yref='paper', + x=5, y=-0.2, # Below axis + xanchor='right', yanchor='top', text=f"5: {right_anchor.split('|')[0]}", showarrow=False, font=dict(size=10, color='gray') @@ -832,21 +835,21 @@ def plot_speaking_style_trait_scores( text=f"{title}
{trait_description}
(Numbers on bars indicate respondent count)", y=0.92 ), - xaxis_title="Voice", - yaxis_title="Average Score (1-5)", + xaxis_title="Average Score (1-5)", + yaxis_title="Voice", height=height, width=width, plot_bgcolor=ColorPalette.BACKGROUND, - yaxis=dict( + xaxis=dict( range=[1, 5], showgrid=True, gridcolor=ColorPalette.GRID, zeroline=False ), - xaxis=dict( + yaxis=dict( showgrid=False ), - margin=dict(r=150), + margin=dict(b=120), annotations=annotations, font=dict(size=11) )