| | import json |
| | import matplotlib.pyplot as plt |
| | from datetime import datetime, timedelta |
| | from collections import defaultdict |
| | import numpy as np |
| |
|
| | import matplotlib.font_manager as fm |
| | font_path = '/System/Library/Fonts/PingFang.ttc' |
| | prop = fm.FontProperties(fname=font_path) |
| | plt.rcParams['font.family'] = prop.get_name() |
| |
|
| | with open('./test/states.json') as f: |
| | data = json.load(f) |
| | request_arrivals = data["request_arrivals"] |
| |
|
| | def create_pic(request_arrivals, key): |
| | request_arrivals = request_arrivals[key] |
| | |
| | datetimes = [datetime.fromisoformat(t) for t in request_arrivals] |
| | |
| | latest_time = max(datetimes) |
| |
|
| | |
| | time_range = [latest_time - timedelta(hours=i) for i in range(32, 0, -1)] |
| | |
| | hourly_counts = defaultdict(int) |
| | for dt in datetimes: |
| | for t in time_range[::-1]: |
| | if dt >= t: |
| | hourly_counts[t] += 1 |
| | break |
| |
|
| | |
| | hours = [t.strftime('%Y-%m-%d %H:00') for t in time_range] |
| | counts = [hourly_counts[t] for t in time_range] |
| |
|
| | |
| | plt.figure(figsize=(15, 6)) |
| | plt.bar(hours, counts) |
| | plt.title(f'{key} 端点请求量 (过去24小时)') |
| | plt.xlabel('时间') |
| | plt.ylabel('请求数') |
| | plt.xticks(rotation=45, ha='right') |
| | plt.tight_layout() |
| |
|
| | |
| | plt.savefig(f'{key.replace("/", "")}.png') |
| |
|
| | def create_pie_chart(model_counts): |
| | models = list(model_counts.keys()) |
| | counts = list(model_counts.values()) |
| |
|
| | |
| | colors = plt.cm.Set3(np.linspace(0, 1, len(models))) |
| | sorted_data = sorted(zip(counts, models, colors), reverse=True) |
| | counts, models, colors = zip(*sorted_data) |
| |
|
| | |
| | fig, ax = plt.subplots(figsize=(16, 10)) |
| | wedges, _ = ax.pie(counts, colors=colors, startangle=90, wedgeprops=dict(width=0.5)) |
| |
|
| | |
| | centre_circle = plt.Circle((0, 0), 0.35, fc='white') |
| | fig.gca().add_artist(centre_circle) |
| |
|
| | |
| | total = sum(counts) |
| |
|
| | |
| | bbox_props = dict(boxstyle="round,pad=0.3", fc="w", ec="k", lw=0.72) |
| | kw = dict(xycoords='data', textcoords='data', arrowprops=dict(arrowstyle="-"), bbox=bbox_props, zorder=0) |
| |
|
| | left_labels = [] |
| | right_labels = [] |
| |
|
| | for i, p in enumerate(wedges): |
| | ang = (p.theta2 - p.theta1) / 2. + p.theta1 |
| | y = np.sin(np.deg2rad(ang)) |
| | x = np.cos(np.deg2rad(ang)) |
| |
|
| | percentage = counts[i] / total * 100 |
| | label = f"{models[i]}: {percentage:.1f}%" |
| |
|
| | if x > 0: |
| | right_labels.append((x, y, label)) |
| | else: |
| | left_labels.append((x, y, label)) |
| |
|
| | |
| | for i, (x, y, label) in enumerate(left_labels): |
| | ax.annotate(label, xy=(x, y), xytext=(-1.2, 0.9 - i * 0.15), **kw) |
| |
|
| | |
| | for i, (x, y, label) in enumerate(right_labels): |
| | ax.annotate(label, xy=(x, y), xytext=(1.2, 0.9 - i * 0.15), **kw) |
| |
|
| | plt.title("各模型使用次数对比", size=16) |
| | ax.set_xlim(-1.5, 1.5) |
| | ax.set_ylim(-1.2, 1.2) |
| | ax.axis('off') |
| | plt.tight_layout() |
| | plt.savefig('model_usage_pie_chart.png', bbox_inches='tight', pad_inches=0.5) |
| |
|
| | if __name__ == '__main__': |
| | model_counts = { |
| | "model_counts": { |
| | "claude-3-5-sonnet": 94, |
| | "o1-preview": 71, |
| | "gpt-4o": 512, |
| | "gpt-4o-mini": 5, |
| | "gemini-1.5-pro": 5, |
| | "deepseek-chat": 7, |
| | "grok-2-mini": 1, |
| | "grok-2": 9, |
| | "o1-mini": 8 |
| | } |
| | } |
| | |
| |
|
| | create_pie_chart(model_counts["model_counts"]) |
| |
|