cryman38's picture
Upload 16 files
48b95e7 verified
import ssl
import logging
import gradio as gr
import matplotlib.pyplot as plt
from io import BytesIO
import base64
from datetime import datetime
# ๋กœ๊ทธ ์„ค์ •
#logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
# SSL ์ธ์ฆ์„œ ๊ฒ€์ฆ ๋น„ํ™œ์„ฑํ™”
ssl._create_default_https_context = ssl._create_unverified_context
current_time = datetime.now().strftime("%b-%d-%Y")
def load_css():
with open('style.css', 'r', encoding='utf-8') as file:
css = file.read()
return f"<style>{css}</style>"
def format_quantity(quantity):
# ์•„์ฃผ ์ž‘์€ ๊ฐ’์„ 0์œผ๋กœ ์ฒ˜๋ฆฌ
if abs(quantity) < 1e-5: # ์ž„๊ณ„๊ฐ’์„ ์กฐ์ •ํ•˜์—ฌ ๋” ์ ์ ˆํ•œ ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
quantity = 0
if quantity < 0:
return f"({-quantity:,.1f})"
else:
return f"{quantity:,.1f}"
def format_value(value):
# ์•„์ฃผ ์ž‘์€ ๊ฐ’์„ 0์œผ๋กœ ์ฒ˜๋ฆฌ
if abs(value) < 1e-5: # ์ž„๊ณ„๊ฐ’์„ ์กฐ์ •ํ•˜์—ฌ ๋” ์ ์ ˆํ•œ ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
value = 0
if value < 0:
return f"({-value:,.0f})"
else:
return f"{value:,.0f}"
currency_symbols = {
"KRW": "โ‚ฉ",
"USD": "$",
"CAD": "$",
"EUR": "โ‚ฌ",
"JPY": "ยฅ",
"GBP": "ยฃ"
}
def get_currency_symbol(currency_code):
return currency_symbols.get(currency_code.upper(), "")
def get_currency_codes():
return list(currency_symbols.keys())
currency_codes = get_currency_codes()
# Helper function to add buttons
def clear_buttons(inputs):
clear_button = gr.ClearButton(value="Clear")
clear_button.click(
fn=lambda: [None] * len(inputs),
inputs=[],
outputs=inputs
)
return clear_button
def submit_buttons(inputs, update_fn, output):
submit_button = gr.Button(value="Run", variant="primary")
submit_button.click(
fn=update_fn,
inputs=inputs,
outputs=output
)
return submit_button
def on_change(inputs, update_ouutput, outputs):
for input_component in inputs:
input_component.change(
fn=update_ouutput,
inputs=inputs,
outputs=outputs
)
def render_components(component_rows):
for row in component_rows:
if isinstance(row, list):
with gr.Row():
for component in row:
component.render()
else:
row.render()
def create_tab(tab_name, inputs, outputs, update_fn, examples, component_rows):
with gr.TabItem(tab_name):
with gr.Row():
with gr.Column(elem_classes="input"):
render_components(component_rows)
clear_buttons(inputs)
submit_buttons(inputs, update_fn, outputs)
gr.Examples(examples=examples, cache_examples=False, inputs=inputs)
with gr.Column():
outputs.render()
on_change(inputs, update_fn, outputs)
import matplotlib.pyplot as plt
import numpy as np
from io import BytesIO
import base64
from matplotlib import font_manager
# Global dictionary to store color mapping
color_map_storage = {}
def get_color_for_label(index, color_map, num_labels):
"""Retrieve or generate color for the given index."""
if index not in color_map_storage:
cmap = plt.get_cmap(color_map)
# Generate a color based on index (inverse of the index for color intensity)
color_map_storage[index] = cmap(1 - index / (num_labels - 1))
return color_map_storage[index]
def plot_donut_chart(data, color_map='Blues', font_path='Quicksand-Regular.ttf', legend_fontsize=30):
# ๋ฐ์ดํ„ฐ ํ•„ํ„ฐ๋ง: ๋น„์ค‘์ด 0์ด ์•„๋‹Œ ํ•ญ๋ชฉ๋งŒ ์ถ”์ถœ
filtered_data = {k: v for k, v in data.items() if v > 0}
if not filtered_data:
return '<p>No data to display.</p>' # ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ์ฒ˜๋ฆฌ
# ๋น„์ค‘์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌ
sorted_data = sorted(filtered_data.items(), key=lambda item: item[1], reverse=True)
labels, sizes = zip(*sorted_data)
# ์ƒ‰์ƒ ๋งต์„ ์„ค์ •
num_labels = len(labels)
# ์›ํ˜• ์ฐจํŠธ์˜ ์ƒ‰์ƒ ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ
colors = [get_color_for_label(i, color_map, num_labels) for i in range(num_labels)]
# ๋„๋„› ์ฐจํŠธ ์‹œ๊ฐํ™”
fig, ax = plt.subplots(figsize=(12, 8), dpi=300) # figsize์™€ dpi๋ฅผ ์„ค์ •ํ•˜์—ฌ ํ•ด์ƒ๋„ ๋†’์ด๊ธฐ
wedges, _ = ax.pie(
sizes,
colors=colors,
labels=[None]*num_labels, # ๋ผ๋ฒจ์„ ์—†์• ๊ธฐ
autopct=None, # ๊ฐ’ ํ‘œ์‹œ๋ฅผ ์—†์• ๊ธฐ
startangle=-90, # 12์‹œ ๋ฐฉํ–ฅ๋ถ€ํ„ฐ ์‹œ์ž‘
pctdistance=0.85,
wedgeprops=dict(width=0.4, edgecolor='w') # ๋„๋„› ์ฐจํŠธ
)
# y์ถ• ๋’ค์ง‘๊ธฐ
ax.invert_yaxis()
# ๋ฒ”๋ก€ ์ƒ์„ฑ
handles = [plt.Line2D([0], [0], marker='o', color='w', label=f'{label} {size * 100:.1f}%',
markersize=15, markerfacecolor=get_color_for_label(i, color_map, num_labels))
for i, (label, size) in enumerate(zip(labels, sizes))]
# ๋ฒ”๋ก€ ์ถ”๊ฐ€, ์ œ๋ชฉ ์ œ๊ฑฐ, ๊ธ€์ž ํฌ๊ธฐ๋ฅผ ํ‚ค์šฐ๊ณ  ๋ฒ”๋ก€ ๋ฐ•์Šค๋ฅผ ์กฐ์ •
ax.legend(handles=handles, loc='upper left', bbox_to_anchor=(1, 1),
prop=font_manager.FontProperties(fname=font_path, size=legend_fontsize), frameon=False)
# ์ถ•์„ ์ˆจ๊น๋‹ˆ๋‹ค.
ax.axis('off')
# SVG๋กœ ์ €์žฅ
buf = BytesIO()
plt.savefig(buf, format='svg', bbox_inches='tight') # bbox_inches='tight'๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฒ”๋ก€๊ฐ€ ์ž˜๋ฆฌ๋Š” ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€
plt.close(fig)
buf.seek(0)
# SVG ๋ฐ์ดํ„ฐ๋ฅผ base64๋กœ ์ธ์ฝ”๋”ฉ
svg_str = buf.getvalue().decode('utf-8')
return f'<img src="data:image/svg+xml;base64,{base64.b64encode(svg_str.encode("utf-8")).decode("utf-8")}" />'