| import matplotlib.pyplot as plt | |
| import io | |
| import streamlit as st | |
| class Visualization: | |
| def plot_intervention_statistics(self, intervention_stats): | |
| sessions_held = intervention_stats['Intervention Sessions Held'].values[0] | |
| sessions_not_held = intervention_stats['Intervention Sessions Not Held'].values[0] | |
| fig, ax = plt.subplots() | |
| ax.bar(['Intervention Sessions'], [sessions_held], label='Held', color='#358E66') | |
| ax.bar(['Intervention Sessions'], [sessions_not_held], bottom=[sessions_held], label='Not Held', color='#91D6B8') | |
| ax.text(0, sessions_held / 2, str(sessions_held), ha='center', va='center', color='white', fontweight='bold', fontsize=14) | |
| ax.text(0, sessions_held + sessions_not_held / 2, str(sessions_not_held), ha='center', va='center', color='black', fontweight='bold', fontsize=14) | |
| ax.set_ylabel('Frequency') | |
| ax.set_title('Intervention Sessions Held vs Not Held', fontsize=16) | |
| handles, labels = ax.get_legend_handles_labels() | |
| ax.legend(handles[::-1], labels[::-1]) | |
| ax.spines['top'].set_visible(False) | |
| ax.spines['right'].set_visible(False) | |
| st.pyplot(fig) | |
| return fig | |
| def plot_student_metrics(self, student_metrics_df, attendance_avg_stats, engagement_avg_stats): | |
| fig, ax = plt.subplots(figsize=(10, 6)) | |
| bar_width = 0.35 | |
| index = range(len(student_metrics_df)) | |
| attendance_bars = ax.bar( | |
| [i - bar_width / 2 for i in index], | |
| student_metrics_df['Attendance (%)'], | |
| width=bar_width, label='Attendance (%)', | |
| color='#005288', alpha=0.7 | |
| ) | |
| engagement_bars = ax.bar( | |
| [i + bar_width / 2 for i in index], | |
| student_metrics_df['Engagement (%)'], | |
| width=bar_width, label='Engagement (%)', | |
| color='#3AB0FF', alpha=0.7 | |
| ) | |
| for bar in attendance_bars: | |
| height = bar.get_height() | |
| ax.text(bar.get_x() + bar.get_width() / 2, height, f'{height:.0f}%', ha='center', va='bottom', color='black') | |
| for bar in engagement_bars: | |
| height = bar.get_height() | |
| ax.text(bar.get_x() + bar.get_width() / 2, height, f'{height:.0f}%', ha='center', va='bottom', color='black') | |
| ax.axhline(y=attendance_avg_stats, color='#005288', linestyle='--', linewidth=1.5, label=f'Attendance Average: {attendance_avg_stats}%') | |
| ax.axhline(y=engagement_avg_stats, color='#3AB0FF', linestyle='--', linewidth=1.5, label=f'Engagement Average: {engagement_avg_stats}%') | |
| ax.set_xlabel('Student') | |
| ax.set_ylabel('Percentage (%)') | |
| ax.set_title('Student Attendance and Engagement Metrics') | |
| ax.legend(loc='upper right', frameon=False) | |
| ax.set_xticks(index) | |
| ax.set_xticklabels(student_metrics_df['Student'], rotation=0, ha='right') | |
| ax.set_ylim(0, 119) | |
| ax.yaxis.set_ticks(range(0, 119, 20)) | |
| ax.spines['top'].set_visible(False) | |
| ax.spines['right'].set_visible(False) | |
| plt.tight_layout() | |
| st.pyplot(fig) | |
| return fig | |
| def download_chart(self, fig, filename): | |
| buffer = io.BytesIO() | |
| fig.savefig(buffer, format='png') | |
| buffer.seek(0) | |
| st.download_button(label="Download Chart", data=buffer, file_name=filename, mime='image/png', icon="📊", use_container_width=True) | |