in spotify_confidence/analysis/frequentist/chartify_grapher.py [0:0]
def _categorical_summary_plot(self, level_name, summary_df, remaining_groups, groupby):
if not remaining_groups:
remaining_groups = listify(groupby)
df = summary_df.set_index(remaining_groups).assign(categorical_x=lambda df: df.index.to_numpy()).reset_index()
axis_format, y_min, y_max = axis_format_precision(
numbers=concat([df[CI_LOWER], df[POINT_ESTIMATE], df[CI_UPPER]]), absolute=True
)
ch = Chart(x_axis_type="categorical")
ch.plot.interval(
(
df.assign(**{CI_LOWER: to_finite(df[CI_LOWER], y_min, y_max)}).assign(
**{CI_UPPER: to_finite(df[CI_UPPER], y_min, y_max)}
)
),
categorical_columns=remaining_groups,
lower_bound_column=CI_LOWER,
upper_bound_column=CI_UPPER,
middle_column=POINT_ESTIMATE,
categorical_order_by="labels",
categorical_order_ascending=True,
)
# Also plot transparent circles, just to be able to show hover box
ch.style.color_palette.reset_palette_order()
ch.figure.circle(
source=df, x="categorical_x", y=POINT_ESTIMATE, size=20, name="center", line_alpha=0, fill_alpha=0
)
ch.set_title("Estimate of {} / {}".format(self._numerator, self._denominator))
if groupby:
ch.set_subtitle("{}: {}".format(groupby, level_name))
else:
ch.set_subtitle("")
ch.axes.set_xaxis_label("{}".format(", ".join(remaining_groups)))
ch.axes.set_yaxis_label("{} / {}".format(self._numerator, self._denominator))
ch.set_source_label("")
ch.axes.set_yaxis_tick_format(axis_format)
self.add_tools(
chart=ch, df=df, center_name=POINT_ESTIMATE, absolute=True, ordinal=False, use_adjusted_intervals=False
)
return ch