0Pricing
AI Agents · درس

إنشاء المخططات والتصورات آليًا

إنشاء مخططات 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. نمط Code Interpreter لتحليل البيانات
  2. أدوات وكلاء البيانات المعتمدة على Pandas
  3. إنشاء المخططات والتصورات آليًا
  4. وكلاء الملخصات الإحصائية
← العودة إلى AI Agents