| 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"]) |
|
|