bjorn-hommel's picture
replaced gauge by bullet plot
464b09c
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 <br><i>"{input_text}</i>"'
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".
""")