إنشاء المخططات والتصورات آليًا
إنشاء مخططات matplotlib/seaborn وإرجاع نتائج الصور بترميز base64
إنشاء المخططات والتصورات آليًا درس مجاني في AI Agents على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AI Agents، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AI Agents 4 دروس في المجموع.
لماذا يُنشئ الوكلاء المخططات
يصعب فهم الأرقام المعروضة في نص. فمخطط يوضح اتجاهات المبيعات خلال 12 شهرًا ينقل خلال ثوانٍ ما لا تستطيع فقرة من الأرقام نقله.
ويكون وكيل تحليل البيانات القادر على إنشاء التصورات المرئية أكثر فائدة بكثير؛ إذ ينتج المخرجات نفسها التي ينتجها محلل بشري: الأرقام والمخططات معًا.
إعداد Matplotlib للعمل دون تفاعل
يفتح matplotlib افتراضيًا نافذة رسومية. وفي الوكيل الذي يعمل على الخادم دون شاشة، يجب التبديل إلى Agg backend، إذ يعرض المخرجات في ملف فقط من دون واجهة رسومية.
اضبط ذلك قبل استيراد pyplot لتجنب أخطاء العرض.
import matplotlib
matplotlib.use('Agg') # must be set BEFORE importing pyplot
import matplotlib.pyplot as plt
import os
OUTPUT_DIR = '/tmp/agent_charts'
os.makedirs(OUTPUT_DIR, exist_ok=True)
# Verify no display is needed
print('Backend:', matplotlib.get_backend()) # Should print: Aggإنشاء مخطط أعمدة
تقارن مخططات الأعمدة القيم بين الفئات. استخدمها لترتيب أعلى N، ومقارنة الفئات، والمقارنات بين ما قبل وما بعد.
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import os
OUTPUT_DIR = '/tmp/agent_charts'
os.makedirs(OUTPUT_DIR, exist_ok=True)
def create_bar_chart(labels, values, title, xlabel, ylabel, filename):
fig, ax = plt.subplots(figsize=(10, 6))
bars = ax.bar(labels, values, color='steelblue', edgecolor='white')
# Add value labels on bars
for bar, value in zip(bars, values):
ax.text(
bar.get_x() + bar.get_width() / 2,
bar.get_height() + max(values) * 0.01,
f'{value:,.0f}', ha='center', va='bottom', fontsize=9
)
ax.set_title(title, fontsize=14, pad=15)
ax.set_xlabel(xlabel)
ax.set_ylabel(ylabel)
plt.xticks(rotation=45, ha='right')
plt.tight_layout()
path = os.path.join(OUTPUT_DIR, filename)
plt.savefig(path, dpi=150, bbox_inches='tight')
plt.close()
return pathإنشاء مخطط خطي
توضح المخططات الخطية الاتجاهات بمرور الوقت. استخدمها لبيانات السلاسل الزمنية، مثل المبيعات اليومية، ونمو المستخدمين خلال الأشهر، ومقاييس الأداء خلال دورات التطوير.
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import os
OUTPUT_DIR = '/tmp/agent_charts'
os.makedirs(OUTPUT_DIR, exist_ok=True)
def create_line_chart(x_values, y_values, title, xlabel, ylabel, filename, label=None):
fig, ax = plt.subplots(figsize=(10, 5))
ax.plot(x_values, y_values, marker='o', linewidth=2, markersize=5,
color='darkorange', label=label or ylabel)
# Highlight min and max points
max_idx = y_values.index(max(y_values))
min_idx = y_values.index(min(y_values))
ax.annotate(f'Max: {max(y_values):,.0f}',
xy=(x_values[max_idx], y_values[max_idx]),
xytext=(5, 10), textcoords='offset points', color='green')
ax.set_title(title, fontsize=14, pad=15)
ax.set_xlabel(xlabel)
ax.set_ylabel(ylabel)
ax.grid(True, alpha=0.3)
plt.xticks(rotation=45, ha='right')
plt.tight_layout()
path = os.path.join(OUTPUT_DIR, filename)
plt.savefig(path, dpi=150, bbox_inches='tight')
plt.close()
return pathإنشاء مخطط مبعثر
تكشف المخططات المبعثرة العلاقات بين متغيرين رقميين، مثل الارتباط بين الإنفاق الإعلاني والإيرادات، أو بين حجم الطلب ووقت التسليم.
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import numpy as np
import os
OUTPUT_DIR = '/tmp/agent_charts'
os.makedirs(OUTPUT_DIR, exist_ok=True)
def create_scatter_chart(x_values, y_values, title, xlabel, ylabel, filename, add_trendline=True):
fig, ax = plt.subplots(figsize=(8, 6))
ax.scatter(x_values, y_values, alpha=0.6, color='royalblue', edgecolors='white', s=60)
if add_trendline and len(x_values) > 2:
z = np.polyfit(x_values, y_values, 1)
p = np.poly1d(z)
x_line = sorted(x_values)
ax.plot(x_line, p(x_line), 'r--', alpha=0.7, label='Trend')
ax.legend()
# Compute and show correlation
corr = np.corrcoef(x_values, y_values)[0, 1]
ax.text(0.05, 0.95, f'r = {corr:.2f}', transform=ax.transAxes,
fontsize=10, verticalalignment='top')
ax.set_title(title, fontsize=14, pad=15)
ax.set_xlabel(xlabel)
ax.set_ylabel(ylabel)
plt.tight_layout()
path = os.path.join(OUTPUT_DIR, filename)
plt.savefig(path, dpi=150, bbox_inches='tight')
plt.close()
return pathإنشاء مدرج تكراري
توضح المدرجات التكرارية توزيع متغير رقمي واحد، مثل توزيع قيم الطلبات، أو توزيع أعمار العملاء، أو توزيع أوقات الاستجابة.
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import numpy as np
import os
OUTPUT_DIR = '/tmp/agent_charts'
os.makedirs(OUTPUT_DIR, exist_ok=True)
def create_histogram(values, title, xlabel, filename, bins=20):
fig, ax = plt.subplots(figsize=(8, 5))
n, bin_edges, patches = ax.hist(values, bins=bins, color='mediumseagreen',
edgecolor='white', alpha=0.8)
# Add mean and median lines
mean_val = np.mean(values)
median_val = np.median(values)
ax.axvline(mean_val, color='red', linestyle='--', label=f'Mean: {mean_val:.1f}')
ax.axvline(median_val, color='blue', linestyle='--', label=f'Median: {median_val:.1f}')
ax.set_title(title, fontsize=14, pad=15)
ax.set_xlabel(xlabel)
ax.set_ylabel('Frequency')
ax.legend()
plt.tight_layout()
path = os.path.join(OUTPUT_DIR, filename)
plt.savefig(path, dpi=150, bbox_inches='tight')
plt.close()
return pathترميز base64 لاستجابة الوكيل
بعد حفظ المخطط كملف PNG، رمّزه بصيغة base64 حتى يمكن إعادته كسلسلة قابلة للتسلسل بصيغة JSON ضمن نتيجة الأداة. ويمكن للمستدعي بعد ذلك عرضه أو إظهاره.
import base64
def file_to_base64(filepath):
with open(filepath, 'rb') as f:
return base64.b64encode(f.read()).decode('utf-8')
def create_chart_result(chart_path, chart_type, caption):
b64 = file_to_base64(chart_path)
return {
'type': 'image',
'chart_type': chart_type,
'format': 'png',
'base64': b64,
'caption': caption,
'file_path': chart_path
}
# Usage after creating a chart
path = create_bar_chart(['Q1', 'Q2', 'Q3', 'Q4'], [12000, 15000, 18000, 22000],
'Quarterly Revenue', 'Quarter', 'Revenue ($)', 'revenue.png')
result = create_chart_result(path, 'bar', 'Quarterly revenue showing consistent growth')
print(f'Chart encoded: {len(result["base64"])} chars')إنشاء التعليقات التوضيحية
يجبر المخطط الذي لا يحتوي على تعليق توضيحي المشاهدَ على تفسيره بنفسه. اطلب من LLM إنشاء تعليق توضيحي من جملة واحدة يصف الفكرة الرئيسية الظاهرة في المخطط.
def generate_chart_caption(chart_type, data_summary, question):
prompt = f'''A {chart_type} chart was generated to answer: "{question}"
Data summary:
{data_summary}
Write a single clear sentence describing the most important insight shown in the chart.
Focus on the key finding, not on describing what type of chart it is.
Caption:'''
caption = llm_call(prompt).strip()
# Ensure it ends with a period
if caption and not caption.endswith('.'):
caption += '.'
return caption
# Example
caption = generate_chart_caption(
chart_type='bar',
data_summary='Q1: $12k, Q2: $15k, Q3: $18k, Q4: $22k (83% total growth)',
question='How did quarterly revenue trend this year?'
)
print(caption)
# -> "Revenue grew consistently each quarter, with Q4 nearly doubling Q1 figures."الاختيار التلقائي لنوع المخطط
تتطلب الأسئلة المختلفة أنواعًا مختلفة من المخططات. وبدلًا من تحديد المخطط المطلوب مسبقًا، اترك لـ LLM مهمة اختياره استنادًا إلى خصائص البيانات ونوع السؤال.
import json
CHART_TYPE_PROMPT = '''Choose the best chart type to answer this question.
Question: {question}
Data has columns: {columns}
Data sample: {sample}
Available chart types:
- bar: comparing values across categories
- line: trends over time
- scatter: relationship between two numeric variables
- histogram: distribution of one numeric variable
- pie: composition/proportions (use sparingly)
Return JSON: {{"chart_type": "bar", "x": "category_column", "y": "value_column",
"title": "Chart title", "xlabel": "X label", "ylabel": "Y label"}}'''
def select_chart_type(question, df):
sample = df.head(3).to_dict(orient='records')
response = llm_call(CHART_TYPE_PROMPT.format(
question=question,
columns=list(df.columns),
sample=json.dumps(sample, default=str)
))
return json.loads(response)أداة موحّدة لإنشاء المخططات
اجمع جميع أنواع المخططات في أداة واحدة يمكن للوكلاء استدعاؤها. تختار الأداة نوع المخطط تلقائيًا إذا لم يُحدَّد، وتنشئ المخطط، وترمّزه، وتنشئ تعليقًا توضيحيًا.
import pandas as pd
def generate_chart(df_name, question, chart_type=None, filename=None):
df = dataframes.get(df_name)
if df is None:
return {'error': f'{df_name!r} not found'}
# Auto-select chart type if not specified
if not chart_type:
spec = select_chart_type(question, df)
else:
spec = {'chart_type': chart_type}
ct = spec.get('chart_type', 'bar')
x_col = spec.get('x', df.columns[0])
y_col = spec.get('y', df.select_dtypes(include='number').columns[0])
title = spec.get('title', question[:60])
fname = filename or f'chart_{ct}.png'
x_vals = df[x_col].tolist()
y_vals = df[y_col].tolist()
if ct == 'bar':
path = create_bar_chart(x_vals, y_vals, title, x_col, y_col, fname)
elif ct == 'line':
path = create_line_chart(x_vals, y_vals, title, x_col, y_col, fname)
elif ct == 'histogram':
path = create_histogram(y_vals, title, y_col, fname)
else:
path = create_scatter_chart(x_vals, y_vals, title, x_col, y_col, fname)
caption = generate_chart_caption(ct, f'{x_col} vs {y_col}', question)
return create_chart_result(path, ct, caption)المخططات متعددة السلاسل والمجمّعة
عند مقارنة مجموعات متعددة (مثل الإيرادات حسب المنطقة بمرور الوقت)، استخدم مخططات مجمّعة أو متعددة السلاسل. يدعم Matplotlib رسم خطوط متعددة في مخطط واحد، كما يدعم مخططات الأعمدة المجمّعة باستخدام الإزاحات.
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import numpy as np
import os
OUTPUT_DIR = '/tmp/agent_charts'
os.makedirs(OUTPUT_DIR, exist_ok=True)
def create_grouped_bar_chart(categories, series_data, title, xlabel, ylabel, filename):
n_groups = len(categories)
n_series = len(series_data)
bar_width = 0.8 / n_series
x = np.arange(n_groups)
fig, ax = plt.subplots(figsize=(12, 6))
colors = ['steelblue', 'darkorange', 'forestgreen', 'crimson']
for i, (label, values) in enumerate(series_data.items()):
offset = (i - (n_series - 1) / 2) * bar_width
ax.bar(x + offset, values, bar_width, label=label,
color=colors[i % len(colors)], alpha=0.85)
ax.set_xticks(x)
ax.set_xticklabels(categories, rotation=30, ha='right')
ax.set_title(title, fontsize=14, pad=15)
ax.set_xlabel(xlabel)
ax.set_ylabel(ylabel)
ax.legend()
plt.tight_layout()
path = os.path.join(OUTPUT_DIR, filename)
plt.savefig(path, dpi=150, bbox_inches='tight')
plt.close()
return pathاختبار المعرفة
لماذا يجب ضبط Agg backend في matplotlib قبل استيراد pyplot في وكيل يعمل على الخادم؟
مراجعة: إنشاء المخططات والتصورات المرئية تلقائيًا
ينشئ وكلاء البيانات المخططات من خلال: ضبط matplotlib Agg backend (من دون واجهة رسومية)، وإنشاء المخططات باستخدام plt.savefig()، وترميزها بصيغة base64 لنقلها بصيغة JSON، وإنشاء تعليقات توضيحية يكتبها LLM لتسليط الضوء على الأفكار الرئيسية.
الأنواع الأربعة الأساسية للمخططات: الأعمدة (لمقارنة الفئات)، والخطية (للسلاسل الزمنية)، والمبعثرة (لإظهار الارتباطات مع خط الاتجاه)، والمدرج التكراري (للتوزيعات). ويتيح الاختيار التلقائي لنوع المخطط لـ LLM اختيار أفضل تصور مرئي استنادًا إلى خصائص البيانات وسؤال المستخدم.
الأسئلة الشائعة
هل درس «إنشاء المخططات والتصورات آليًا» مجاني؟
نعم — نص درس «إنشاء المخططات والتصورات آليًا» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AI Agents، انتقل إلى CoddyKit PRO. تتضمن دورة AI Agents 4 دروس في المجموع.
ماذا ستتعلم في «إنشاء المخططات والتصورات آليًا»؟
إنشاء مخططات matplotlib/seaborn وإرجاع نتائج الصور بترميز base64 تتمرن على AI Agents مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ AI Agents؟
لا تُشترط خبرة سابقة. AI Agents على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «إنشاء المخططات والتصورات آليًا»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس AI Agents هذا؟
نعم. كل درس في AI Agents يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- نمط Code Interpreter لتحليل البيانات
- أدوات وكلاء البيانات المعتمدة على Pandas
- إنشاء المخططات والتصورات آليًا
- وكلاء الملخصات الإحصائية