import streamlit as st import matplotlib import matplotlib.pyplot as plt import plotly.graph_objects as go import plotly.express as px def indicator_plot(value, title, value_range, domain): plot = go.Indicator( mode = 'gauge+delta', value = value, domain = domain, title = title, delta = { 'reference': 0, 'decreasing': {'color': '#ec4899'}, 'increasing': {'color': '#36def1'} }, gauge = { 'axis': {'range': value_range, 'tickwidth': 1, 'tickcolor': 'black'}, 'bar': {'color': '#4361ee'}, 'bgcolor': 'white', 'borderwidth': 2, 'bordercolor': '#efefef', 'steps': [ {'range': [value_range[0], 0], 'color': '#efefef'}, {'range': [0, value_range[1]], 'color': '#efefef'} ], 'threshold': { 'line': {'color': '#4361ee', 'width': 8}, 'thickness': 0.75, 'value': value } } ) return plot def scatter_plot(df, group_var): colors = ['#36def1', '#4361ee'] if group_var else ['#4361ee'] plot = px.scatter( df, x='Machine-ratings', y='Human-ratings', color=group_var, facet_col='x_group', facet_col_wrap=2, trendline='ols', trendline_scope='trace', hover_data={ 'Text': df.text, 'Language': False, 'x_group': False, 'Human-ratings': ':.2f', 'Machine-ratings': ':.2f', 'Study': df.study, 'Instrument': df.instrument, }, width=400, height=400, color_discrete_sequence=colors ) plot.for_each_annotation(lambda a: a.update(text=a.text.split('=')[-1])) plot.update_layout( legend={ 'orientation':'h', 'yanchor': 'bottom', 'y': -.30 }) plot.update_xaxes(title_standoff = 0) return plot def show_scores(sentiment, desirability, input_text): with st.container(): num_steps = 10 colorscale = plt.get_cmap('viridis', num_steps) steps_sentiment = [{ 'range': [i/num_steps*2-1, (i+1)/num_steps*2-1], 'color': matplotlib.colors.rgb2hex(colorscale(i)[:3]) } for i in range(num_steps)] steps_desirability = [{ 'range': [i/num_steps*8-4, (i+1)/num_steps*8-4], 'color': matplotlib.colors.rgb2hex(colorscale(i)[:3]) } for i in range(num_steps)] plot1 = go.Indicator( mode = 'number+gauge', value = sentiment, domain = {'x': [0.25, 1], 'y': [0.45, 0.65]}, title = {'text': 'Sentiment', 'font': {'color': 'black', 'size': 22}}, number={'font': {'color': 'black', 'size': 26}, 'valueformat': '.2f'}, gauge = { 'shape': 'bullet', 'axis': {'range': [-1, 1]}, 'threshold': { 'line': {'color': '#36def1', 'width': 10}, 'thickness': 0.75, 'value': sentiment}, 'steps': steps_sentiment, 'bar': {'color': 'rgba(0,0,0,0)'} } ) plot2 = go.Indicator( mode = 'number+gauge', value = desirability, domain = {'x': [0.25, 1], 'y': [0.15, 0.35]}, title = {'text': 'Desirability', 'font': {'color': 'black', 'size': 22}}, number={'font': {'color': 'black', 'size': 26}, 'valueformat': '.2f'}, gauge = { 'shape': 'bullet', 'axis': {'range': [-4, 4]}, 'threshold': { 'line': {'color': '#36def1', 'width': 10}, 'thickness': 0.75, 'value': desirability}, 'steps': steps_desirability, 'bar': {'color': 'rgba(0,0,0,0)'} } ) fig = go.Figure() fig.add_trace(plot1) fig.add_trace(plot2) plot_title = f'Estimated Sentiment and Desirability for
"{input_text}"' fig.update_layout( annotations=[ go.layout.Annotation( text=plot_title, align='center', showarrow=False, xref='paper', yref='paper', x=0.5, y=.85, xanchor='center', yanchor='bottom', font=dict(size=22) ), go.layout.Annotation( text="Negative", showarrow=False, xref='paper', yref='paper', x=0.25, y=0.8, font=dict(size=18) ), go.layout.Annotation( text="Positive", showarrow=False, xref='paper', yref='paper', x=.81, y=.8, font=dict(size=18) ), ], font = {'color': 'black', 'family': 'Arial'}, height=300, margin={'t': 50, 'b': 0, 'l': 0} ) st.plotly_chart(fig, theme=None, use_container_width=True) st.markdown(""" Item sentiment: Absolute differences between positive and negative sentiment. Item desirability: z-transformed values, 0 indicated "neutral". """)