import matplotlib.pyplot as plt import numpy as np import streamlit as st FIRST_ORDER = 0 SECOND_ORDER = 1 THIRD_ORDER = 2 BASE_RADIUS = 6.0 INCREMENT_CENTER_X = -4 INCREMENT_CENTER_Y = -4 def draw_concentric_circle(num1, num2, num3, num4, max_num, min_num): if num1 == 0: radius_num1 = 1 else: radius_num1 = num1 if num2 == 0: radius_num2 = 1 else: radius_num2 = num2 # set radius if num1 > num2: radius1 = scale_radius(num1, max_num, min_num) radius2 = max(radius1 * radius_num2 / radius_num1, 1) else: radius2 = scale_radius(num1, max_num, min_num) radius1 = max(radius2 * radius_num1 / radius_num2, 1) radius3 = 2 radius4 = 2 color1 = '#FEEAD2' color2 = '#FFA640' fig, ax = plt.subplots(figsize=(6, 6), facecolor='none') circle1 = plt.Circle((0, 0), radius1, color=color1, alpha=0.8) circle2 = plt.Circle((0, 0), radius2, color=color2, alpha=0.8) circle3 = plt.Circle((-INCREMENT_CENTER_X, INCREMENT_CENTER_Y), radius3, color='lightblue', alpha=0.8) circle4 = plt.Circle((INCREMENT_CENTER_X, INCREMENT_CENTER_Y), radius4, color='lightgreen', alpha=0.8) if num1 >= num2: circle1.set_zorder(FIRST_ORDER) circle2.set_zorder(SECOND_ORDER) else: circle1.set_zorder(SECOND_ORDER) circle2.set_zorder(FIRST_ORDER) circle3.set_zorder(THIRD_ORDER) circle4.set_zorder(THIRD_ORDER) ax.add_patch(circle1) ax.add_patch(circle2) ax.add_patch(circle3) ax.add_patch(circle4) if radius1 > radius2: ax.text(0, radius1 + 0.1, str(num1), ha='center', va='center', fontsize=20, color='black') ax.text(0, 0, str(num2), ha='center', va='center', fontsize=20, color='black') else: ax.text(0, 0, str(num1), ha='center', va='center', fontsize=20, color='black') ax.text(0, radius2 + 0.1, str(num2), ha='center', va='center', fontsize=20, color='black') ax.text(-INCREMENT_CENTER_X, INCREMENT_CENTER_Y, str(num3), ha='center', va='center', fontsize=28, color='black') ax.text(INCREMENT_CENTER_X, INCREMENT_CENTER_Y, str(num4), ha='center', va='center', fontsize=28, color='black') ax.set_xlim(-BASE_RADIUS - 1, BASE_RADIUS + 1) ax.set_ylim(-BASE_RADIUS - 1, BASE_RADIUS + 1) ax.axis('off') return fig def scale_radius(radius, max_num, min_num, max_radius=6, min_radius=2): if max_num == min_num: return max_radius scaled_radius = (radius - min_num) / (max_num - min_num) * (max_radius - min_radius) + min_radius return scaled_radius def draw_arrow(user_count, name): fig, ax = plt.subplots(figsize=(6, 8), facecolor='none') arrow = ax.arrow(0.4, 0, 0.1, -9, width=0.05, head_length=1, color='mediumpurple') ax.text(0.6, -4.5, user_count, fontsize=32, verticalalignment='center') ax.set_xlim(0, 1) ax.set_ylim(-10, 0.5) ax.axis('off') return fig