{"id":"l-pda-5-2","courseId":"python-data-analysis","lang":"ar","kind":"lesson","summary":"اختر الرسم البياني المناسب للسؤال، وارسمه من DataFrame باستخدام ‎.plot في pandas وكائني figure و axes في matplotlib، وضع عليه عناوين تجعله يقول اكتشافه وحده.","html":"<p>لديك أرقام تجيب عن سؤال رئيس النمو، وقريبًا ستعرضها. جدول من 24 رقمًا شهريًا يجعل الناس يضيّقون أعينهم؛ أما رسم خطي للأرقام نفسها فيُظهر قفزة نوفمبر قبل أن يقرأ أحد أي محور. الرسوم البيانية ليست زينة تُضاف في النهاية. إنها الطريقة التي سيستهلك بها معظم الناس تحليلك، والرسم الجيد كثيرًا ما يكون هو الرسالة كلها.</p>\n<p>كود الرسوم في هذا الدرس مخصّص لـ Jupyter notebook الخاص بك: كتل Run في هذه الدورة تعرض نصًا مطبوعًا لا صورًا. أما تجهيز البيانات فيعمل هنا كالمعتاد.</p>\n<h2 id=\"sec-1\" tabindex=\"-1\">اختر الرسم من السؤال</h2>\n<figure class=\"diagram\"><svg class=\"diagram-svg\" focusable=\"false\" viewBox=\"0 0 700 220\" role=\"img\" aria-labelledby=\"l-pda-5-2-t1\"><defs><marker id=\"arrow-l-pda-5-2-1\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"7\" markerHeight=\"7\" orient=\"auto-start-reverse\"><path d=\"M0 0 L10 5 L0 10 z\" class=\"d-arrowhead\"/></marker></defs>\n  <title id=\"l-pda-5-2-t1\">أربع لوحات. كيف يتغيّر عبر الزمن: رسم خطي. أيّ مجموعة أكبر: أعمدة أفقية مرتّبة. كيف تنتشر القيم: مدرّج تكراري. هل يتحرّك شيئان معًا: مخطط انتشار.</title>\n  <rect class=\"d-box\" x=\"10\" y=\"10\" width=\"160\" height=\"160\" rx=\"10\"/>\n  <path class=\"d-arrow\" d=\"M30 130 L60 115 L90 120 L120 95 L150 50\"/>\n  <text class=\"d-label-strong\" x=\"90\" y=\"196\" text-anchor=\"middle\">التغيّر عبر الزمن</text>\n  <text class=\"d-label-muted\" x=\"90\" y=\"214\" text-anchor=\"middle\">خطي</text>\n  <rect class=\"d-box\" x=\"185\" y=\"10\" width=\"160\" height=\"160\" rx=\"10\"/>\n  <rect class=\"d-box-primary\" x=\"200\" y=\"35\" width=\"130\" height=\"20\"/>\n  <rect class=\"d-box-primary\" x=\"200\" y=\"65\" width=\"100\" height=\"20\"/>\n  <rect class=\"d-box-primary\" x=\"200\" y=\"95\" width=\"75\" height=\"20\"/>\n  <rect class=\"d-box-primary\" x=\"200\" y=\"125\" width=\"40\" height=\"20\"/>\n  <text class=\"d-label-strong\" x=\"265\" y=\"196\" text-anchor=\"middle\">مقارنة المجموعات</text>\n  <text class=\"d-label-muted\" x=\"265\" y=\"214\" text-anchor=\"middle\">أعمدة مرتّبة</text>\n  <rect class=\"d-box\" x=\"360\" y=\"10\" width=\"160\" height=\"160\" rx=\"10\"/>\n  <rect class=\"d-box-accent\" x=\"375\" y=\"100\" width=\"22\" height=\"50\"/>\n  <rect class=\"d-box-accent\" x=\"399\" y=\"70\" width=\"22\" height=\"80\"/>\n  <rect class=\"d-box-accent\" x=\"423\" y=\"60\" width=\"22\" height=\"90\"/>\n  <rect class=\"d-box-accent\" x=\"447\" y=\"95\" width=\"22\" height=\"55\"/>\n  <rect class=\"d-box-accent\" x=\"471\" y=\"125\" width=\"22\" height=\"25\"/>\n  <text class=\"d-label-strong\" x=\"440\" y=\"196\" text-anchor=\"middle\">انتشار القيم</text>\n  <text class=\"d-label-muted\" x=\"440\" y=\"214\" text-anchor=\"middle\">مدرّج تكراري</text>\n  <rect class=\"d-box\" x=\"535\" y=\"10\" width=\"160\" height=\"160\" rx=\"10\"/>\n  <circle class=\"d-dot\" cx=\"560\" cy=\"140\" r=\"4\"/><circle class=\"d-dot\" cx=\"580\" cy=\"120\" r=\"4\"/><circle class=\"d-dot\" cx=\"600\" cy=\"125\" r=\"4\"/>\n  <circle class=\"d-dot\" cx=\"615\" cy=\"95\" r=\"4\"/><circle class=\"d-dot\" cx=\"635\" cy=\"85\" r=\"4\"/><circle class=\"d-dot\" cx=\"650\" cy=\"60\" r=\"4\"/><circle class=\"d-dot\" cx=\"670\" cy=\"45\" r=\"4\"/>\n  <text class=\"d-label-strong\" x=\"615\" y=\"196\" text-anchor=\"middle\">العلاقة</text>\n  <text class=\"d-label-muted\" x=\"615\" y=\"214\" text-anchor=\"middle\">مخطط انتشار</text>\n</svg><figcaption>أربعة أسئلة، وأربعة أنواع من الرسوم</figcaption></figure>\n<p>معظم الرسوم البيانية في العمل واحد من هذه الأربعة. الرسوم الدائرية تقارن بشكل سيئ بعد شريحتين أو ثلاث؛ ورسم الأعمدة المرتّبة يقول الشيء نفسه بوضوح أكبر. والرسوم ذات المحورين الرأسيين المختلفين تدعو القارئ إلى مقارنة خطوط على مقاييس لا علاقة بينها، ففضّل رسمين مكدّسين أحدهما فوق الآخر.</p>\n<h2 id=\"sec-2\" tabindex=\"-1\">جهّز البيانات ثم ارسم</h2>\n<p>الرسم البياني يريد جدولًا صغيرًا: صف لكل نقطة أو عمود، مرتّبًا ومسمّى مسبقًا. بناؤه عمل pandas عادي، ويعمل هنا:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"python\" data-run=\"python\" data-index=\"0\"><div class=\"code-head\"><span class=\"code-title\">Python</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn code-run\" data-action=\"run\" data-lang=\"python\" data-index=\"0\" aria-label=\"شغّل هذا المثال\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\"/></svg><span>تشغيل</span></button><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">import</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pandas </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">as</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pd</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">items </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pd.read_csv(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_items.csv\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">orders </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> pd.read_csv(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"orders.csv\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#953800;--shiki-dark:#FFA657\">parse_dates</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_date\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">])</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">items[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"revenue\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> items[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"quantity\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">*</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> items[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"unit_price\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">*</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> (</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">1</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> -</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> items[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"discount\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">])</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">orders </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> orders.merge(items.groupby(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_id\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#953800;--shiki-dark:#FFA657\">as_index</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">False</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"revenue\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">].sum(), </span><span style=\"color:#953800;--shiki-dark:#FFA657\">on</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_id\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#953800;--shiki-dark:#FFA657\">validate</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"one_to_one\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">orders </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> orders[orders[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"status\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">!=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"cancelled\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">]</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">monthly </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> orders.set_index(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_date\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">).resample(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"ME\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"revenue\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">].sum()</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">by_year </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> monthly.groupby([monthly.index.year, monthly.index.month]).sum().unstack(</span><span style=\"color:#953800;--shiki-dark:#FFA657\">level</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">0</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">by_year.index.name </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"month\"</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(by_year.round(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">0</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">))</span></span></code></pre><div class=\"run-output\" data-run-output=\"0\" hidden></div></div>\n<p>تنقل <code dir=\"ltr\">unstack(level=0)</code> السنة إلى الأعمدة، فيصبح هناك عمود لكل سنة وصف لكل شهر: الشكل المطلوب بالضبط لرسم فيه خط لكل سنة. ومقارنة السنوات على محور واحد من يناير إلى ديسمبر هي طريقة رؤية الموسمية: إذا ارتفع الخطان كلاهما في نوفمبر، فقفزة نوفمبر نمط لا مصادفة.</p>\n<h2 id=\"sec-3\" tabindex=\"-1\">ارسمه باستخدام pandas و matplotlib</h2>\n<p>تستدعي methods <code dir=\"ltr\">.plot</code> في pandas مكتبة matplotlib نيابةً عنك. أنشئ الـ figure والـ axes بنفسك، كي تستطيع إنهاء الرسم كما يجب:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"python\" data-index=\"1\"><div class=\"code-head\"><span class=\"code-title\">Python</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">import</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> matplotlib.pyplot </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">as</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> plt</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">fig, ax </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> plt.subplots(</span><span style=\"color:#953800;--shiki-dark:#FFA657\">figsize</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">8</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">4</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">))</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">by_year.plot(</span><span style=\"color:#953800;--shiki-dark:#FFA657\">ax</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">ax, </span><span style=\"color:#953800;--shiki-dark:#FFA657\">marker</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"o\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">ax.set_title(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"November is the peak in both years; 2025 runs about 2.7x 2024\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">ax.set_xlabel(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"Month\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">ax.set_ylabel(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"Revenue (USD)\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">ax.yaxis.set_major_formatter(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"$</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">{x:,.0f}</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">ax.set_xticks(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">range</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">1</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">13</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">))</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">ax.legend(</span><span style=\"color:#953800;--shiki-dark:#FFA657\">title</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"Year\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">fig.tight_layout()</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">fig.savefig(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"monthly_revenue.png\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#953800;--shiki-dark:#FFA657\">dpi</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">150</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#953800;--shiki-dark:#FFA657\">bbox_inches</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"tight\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span></code></pre></div>\n<p>تعيد <code dir=\"ltr\">plt.subplots()</code> كائن <strong>figure</strong> (الصورة كلها) وكائن <strong>axes</strong> (منطقة رسم واحدة بمحوريها الأفقي والرأسي). ترسم <code dir=\"ltr\">by_year.plot(ax=ax)</code> خطًا لكل عمود على تلك الـ axes، وكل استدعاء <code dir=\"ltr\">ax.set_...</code> يحسّنها. ونص التنسيق الممرَّر إلى <code dir=\"ltr\">set_major_formatter</code> يحوّل قيم العلامات على المحور إلى دولارات بفواصل الآلاف. وتكتب <code dir=\"ltr\">savefig</code> الملف الذي تلصقه في شريحة العرض؛ و<code dir=\"ltr\">bbox_inches=&quot;tight&quot;</code> تقصّ الهوامش الفارغة.</p>\n<p>ولمقارنة الفئات، رتّب أولًا واستخدم أعمدة أفقية كي تبقى التسميات الطويلة مقروءة:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"python\" data-index=\"2\"><div class=\"code-head\"><span class=\"code-title\">Python</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># sales: the line-level table you built in Lesson 4.2</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">revenue_by_country </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> sales.groupby(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"country\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"revenue\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">].sum().sort_values()</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">fig, ax </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> plt.subplots(</span><span style=\"color:#953800;--shiki-dark:#FFA657\">figsize</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">7</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">4</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">))</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">bars </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> ax.barh(revenue_by_country.index, revenue_by_country.values)</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">ax.bar_label(bars, </span><span style=\"color:#953800;--shiki-dark:#FFA657\">fmt</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"$</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">{:,.0f}</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#953800;--shiki-dark:#FFA657\">padding</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">3</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">ax.set_title(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"UAE and UK lead revenue; Jordan trails\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">ax.set_xlabel(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"Revenue 2024-2025 (USD)\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">fig.tight_layout()</span></span></code></pre></div>\n<p>وللتوزيع، مدرّج تكراري لقيم الطلبات مع تحديد الوسيط:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"python\" data-index=\"3\"><div class=\"code-head\"><span class=\"code-title\">Python</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">fig, ax </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> plt.subplots(</span><span style=\"color:#953800;--shiki-dark:#FFA657\">figsize</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">7</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">4</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">))</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">orders[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"revenue\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">].plot.hist(</span><span style=\"color:#953800;--shiki-dark:#FFA657\">bins</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">40</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#953800;--shiki-dark:#FFA657\">ax</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">ax)</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">ax.axvline(orders[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"revenue\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">].median(), </span><span style=\"color:#953800;--shiki-dark:#FFA657\">linestyle</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"--\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#953800;--shiki-dark:#FFA657\">label</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"median $147\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">ax.set_xlabel(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"Order value (USD)\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">ax.legend()</span></span></code></pre></div>\n<p>وللعلاقات، يضع مخطط الانتشار (scatter plot) عمودًا رقميًا على كل محور. مع آلاف النقاط تتكدّس في كتلة واحدة، فاجعلها صغيرة وشبه شفافة، وكثيرًا ما يكون أوضح أن ترسم ملخّصًا بدلًا من ذلك، مثل معدّل الشراء لكل عدد من الصفحات المعروضة:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"python\" data-index=\"4\"><div class=\"code-head\"><span class=\"code-title\">Python</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># assumes fig, ax = plt.subplots() and churn.csv / web_sessions.csv loaded as churn / sessions</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">churn.plot.scatter(</span><span style=\"color:#953800;--shiki-dark:#FFA657\">x</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"tenure_days\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#953800;--shiki-dark:#FFA657\">y</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"total_spent\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#953800;--shiki-dark:#FFA657\">s</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">8</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#953800;--shiki-dark:#FFA657\">alpha</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">0.3</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#953800;--shiki-dark:#FFA657\">ax</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">ax)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">rate </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> sessions.groupby(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"pages_viewed\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"purchased\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">].mean()</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">rate.loc[:</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">15</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">].plot(</span><span style=\"color:#953800;--shiki-dark:#FFA657\">ax</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">ax, </span><span style=\"color:#953800;--shiki-dark:#FFA657\">marker</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"o\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)   </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># one point per page count, up to 15</span></span></code></pre></div>\n<p>السطر الأول هو النمط لأي عمودين رقميين، وهنا مدة بقاء كل عميل مقابل إجمالي إنفاقه من <code dir=\"ltr\">churn.csv</code>؛ والسطران الآخران يحوّلان 6,000 جلسة إلى خمس عشرة نقطة مقروءة، كل منها معدّل تحويل.</p>\n<h2 id=\"sec-4\" tabindex=\"-1\">افحص الرسم قبل أن تشاركه</h2>\n<p>الرسوم البيانية تخفي الأخطاء ببراعة. قبل أن يغادر رسم الـ notebook الخاص بك، قارنه بالجدول الذي جاء منه: عدد الأعمدة أو النقاط، والفترة الأولى والأخيرة (الشهر الجزئي في النهاية يبدو انهيارًا، كما حذّر الدرس 4.4)، وقيمة أو اثنتين تستطيع قراءتهما من الرسم ومقارنتهما برقم مطبوع. ثم انظر إليه مرة كما ينظر غريب: هل يستطيع من لم يرَ البيانات قط أن يقول ما يُظهره في جملة واحدة؟ إن لم يستطع، فغيّر العنوان أو ترتيب الفرز أو نوع الرسم، لا القارئ.</p>\n<p>ستقابل أيضًا <strong>seaborn</strong>، وهي مكتبة مبنية على matplotlib بإعدادات افتراضية إحصائية جيدة. كل ما هنا ينطبق عليها: ترسم على الـ <code dir=\"ltr\">ax</code> نفسها، وتنطبق القواعد نفسها عن خطوط الأساس والعناوين.</p>\n<aside class=\"callout callout-mistake\" role=\"note\"><p class=\"callout-title\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\"/><path d=\"M12 9v4\"/><path d=\"M12 17h.01\"/></svg><span><span class=\"callout-kind\">خطأ شائع</span><span class=\"callout-sep\" aria-hidden=\"true\"> · </span>عنوان يسمّي المحاور</span></p>\n<p>“الإيراد بحسب الشهر” يخبر القارئ بما تقوله المحاور أصلًا. أما “نوفمبر هو الذروة في السنتين” فتخبره بما يجب أن يراه. اكتب العنوان على هيئة الجملة التي ستقولها وأنت تشير إلى الرسم، واحتفظ بأسماء المتغيّرات لتسميات المحاور.</p>\n</aside>\n<aside class=\"callout callout-tip\" role=\"note\"><p class=\"callout-title\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5\"/><path d=\"M9 18h6\"/><path d=\"M10 22h4\"/></svg><span><span class=\"callout-kind\">نصيحة</span><span class=\"callout-sep\" aria-hidden=\"true\"> · </span>ألوان أقل، معنى أكثر</span></p>\n<p>استخدم لونًا واحدًا لكل شيء، ثم لونًا ثانيًا أقوى للعمود أو الخط الوحيد الذي يجب أن ينظر إليه القارئ، مثل الربع الرابع من 2025. دورات الألوان الافتراضية مناسبة للاستكشاف؛ أما في العرض فيجب أن يحمل اللون الرسالة.</p>\n</aside>\n<p>في تمرين هذا الدرس تختار الرسوم المناسبة لمجموعة من الأسئلة. وفي الدرس التالي تجمع كل شيء معًا وتجيب عن سؤال الربع الرابع من البداية إلى النهاية.</p>\n","toc":[{"id":"sec-1","text":"اختر الرسم من السؤال","level":2},{"id":"sec-2","text":"جهّز البيانات ثم ارسم","level":2},{"id":"sec-3","text":"ارسمه باستخدام pandas و matplotlib","level":2},{"id":"sec-4","text":"افحص الرسم قبل أن تشاركه","level":2}],"takeaways":["اختر الرسم من السؤال - الخطي للتغيّر عبر الزمن، والأعمدة المرتّبة لمقارنة الفئات، والمدرّج التكراري للتوزيع، ومخطط الانتشار للعلاقة.","<code dir=\"ltr\">fig, ax = plt.subplots()</code> ثم <code dir=\"ltr\">df.plot(ax=ax)</code> تعطيك سهولة pandas مع تحكّم matplotlib الكامل في العناوين والمحاور والحفظ.","جهّز جدولًا صغيرًا مرتّبًا أولًا (صف لكل عمود أو نقطة)، ثم ارسمه؛ فمعظم مشكلات الرسم البياني مشكلات في تشكيل البيانات.","الأعمدة تبدأ من الصفر، والمحاور تحمل وحداتها، والعنوان يقول الاكتشاف بدلًا من تسمية المتغيّرات.","<code dir=\"ltr\">fig.savefig(&quot;chart.png&quot;, dpi=150, bbox_inches=&quot;tight&quot;)</code> تحفظ الرسم لتقرير؛ والرسوم البيانية لا تظهر في كتل Run في هذه الدورة."],"further":[{"title":"pandas - Chart visualization","url":"https://pandas.pydata.org/docs/user_guide/visualization.html"},{"title":"matplotlib - Quick start guide","url":"https://matplotlib.org/stable/users/explain/quick_start.html"},{"title":"matplotlib.axes.Axes.bar_label","url":"https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.bar_label.html"}],"quiz":[{"q":"<p>تريد أن تُظهر أن الإيراد لكل قناة نما من 2024 إلى 2025. أيّ رسم بياني يُقرأ أفضل؟</p>","options":[{"text":"رسمان دائريان، واحد لكل سنة","why":"الرسوم الدائرية تُظهر أجزاء كلٍّ واحد؛ ومقارنة أحجام الشرائح عبر رسمين دائريين صعبة، وهي تخفي النمو في المجموع."},{"text":"مدرّج تكراري لقيم الطلبات","why":"المدرّج التكراري يُظهر توزيع متغيّر واحد؛ ولا يقول شيئًا عن القنوات أو السنوات."},{"text":"مخطط انتشار لقيمة الطلب مقابل تاريخه","why":"ألفا نقطة تُظهر الانتشار عبر الزمن، لكن لا تُظهر مجاميع القنوات التي تريد مقارنتها."},{"text":"أعمدة مجمّعة، مجموعة لكل قناة وعمود لكل سنة، تبدأ من الصفر","why":"صحيح. الأعمدة تقارن المبالغ، والتجميع يضع السنتين جنبًا إلى جنب لكل قناة، وخط الأساس عند الصفر يُبقي الأطوال صادقة."}],"answer":3},{"q":"<p>ما ميزة <code dir=\"ltr\">fig, ax = plt.subplots()</code> ثم <code dir=\"ltr\">monthly.plot(ax=ax)</code>، مقارنةً باستدعاء <code dir=\"ltr\">monthly.plot()</code> وحدها؟</p>","options":[{"text":"يكون كائن الـ axes بين يديك، فتستطيع ضبط العناوين والتسميات والتنسيق وحفظ الشكل الذي ضبطته بالضبط.","why":"صحيح. ترسم pandas على الـ axes التي تمرّرها، وتحتفظ أنت بتحكّم matplotlib الكامل في كل شيء آخر."},{"text":"إنها الطريقة الوحيدة لصنع رسم خطي.","why":"ترسم <code dir=\"ltr\">monthly.plot()</code> وحدها رسمًا خطيًا أيضًا؛ هي فقط تنشئ الشكل نيابةً عنك."},{"text":"تجعل الرسم تفاعليًا.","why":"التفاعلية تعتمد على البيئة والـ backend، لا على طريقة إنشاء الـ axes."}],"answer":0},{"q":"<p>رسم أعمدة للإيراد بحسب الدولة محوره الرأسي يبدأ من 60,000. ما المشكلة؟</p>","options":[{"text":"تصبح الأعمدة رفيعة جدًا.","why":"نطاق المحور لا يغيّر عرض الأعمدة."},{"text":"لم تعد أطوال الأعمدة تطابق القيم، فقد يبدو فرق 10% كأنه فرق 300%.","why":"صحيح. القرّاء يقارنون أطوال الأعمدة؛ وقطع خط الأساس يضخّم الفروق. الرسوم الخطية يمكن تقريبها، أما الأعمدة فلا."},{"text":"الدول ذات الإيراد الأقل تختفي.","why":"الأعمدة تحت 60,000 ستُقطع أو تختفي، وهذا عَرَض للمشكلة الحقيقية، أي خط الأساس المضلّل."}],"answer":1}],"exercise":{"kind":"choice","multiple":true,"options":["line-years","pie-months","bars-quarters-zero","dual-axis","hist-orders","bars-quarters-cut"],"correct":["line-years","bars-quarters-zero"],"title":"اختر الرسوم لعرض الربع الرابع","prompt":"<p>يسأل رئيس النمو: <strong>“هل الربع الرابع من 2025 غير معتاد، أم أنه الذروة الموسمية الطبيعية لعمل ينمو؟”</strong> لديك الإيراد الشهري والفصلي لعامي 2024 و2025. اختر كل رسم بياني يساعد على الإجابة عن هذا السؤال بصدق.</p>\n","hints":["السؤال يتعلّق بالتغيّر عبر الزمن، وبمقارنة الموسم نفسه عبر سنتين.","اسأل عن كل رسم: هل يُبقي أطوال الأعمدة صادقة، وهل يضع الربع الرابع من 2025 بجانب شيء يمكن مقارنته به؟"],"explanation":"<p>الرسم الخطي الذي فيه خط لكل سنة على محور من يناير إلى ديسمبر يُظهر بنظرة واحدة أن السنتين كلتيهما تبلغان الذروة في نوفمبر، فتظهر الموسمية، والفجوة بين الخطين تُظهر النمو. وأعمدة الأرباع التي تبدأ من الصفر تجعل حجم كل ربع صادقًا، وتتيح مقارنة الربع الرابع من 2025 بالربع الرابع من 2024 وبالأرباع الأخرى. أما الرسوم الدائرية والمحاور المقطوعة والمحاور المزدوجة فكلها تجعل المقارنة أصعب أو مضلّلة، والمدرّج التكراري لقيم الطلبات يجيب عن سؤال مختلف (حجم الطلبات، لا كيف تغيّر الإيراد).</p>\n","checkLabels":{},"optionText":{"line-years":{"text":"رسم خطي للإيراد الشهري فيه خط لعام 2024 وخط لعام 2025، والأشهر من يناير إلى ديسمبر على المحور الأفقي","why":"اختيار جيد. وضع السنتين فوق بعضهما على محور التقويم نفسه يُظهر ذروة نوفمبر المشتركة (الموسمية) والفجوة بين السنتين (النمو) في صورة واحدة."},"pie-months":{"text":"رسم دائري لإيراد 2025 بحسب الشهر","why":"اثنتا عشرة شريحة تستحيل مقارنتها بدقة، والرسم الدائري يخفي الترتيب الزمني ولا يقول شيئًا عن 2024."},"bars-quarters-zero":{"text":"رسم أعمدة لإيراد الأرباع الثمانية كلها، محوره الرأسي يبدأ من الصفر، مع إبراز الربع الرابع من 2025","why":"اختيار جيد. الأعمدة التي تبدأ من الصفر تُبقي الأحجام صادقة، والتسلسل الكامل يُظهر اتجاه النمو، وإبراز الربع الرابع من 2025 يوجّه الانتباه دون تشويه."},"dual-axis":{"text":"رسم واحد فيه إيراد 2025 على محور أيسر وإيراد 2024 على محور أيمن مستقل","why":"المحوران المستقلان يمكن ضبط مقياسيهما لجعل الخطين يبدوان أيّ شيء؛ وسيقارن القرّاء ارتفاعات على مقاييس مختلفة."},"hist-orders":{"text":"مدرّج تكراري لقيم طلبات الربع الرابع من 2025","why":"يُظهر حجم طلبات الربع الرابع، وهذا مفيد لاحقًا، لكنه لا يستطيع أن يخبرك هل كان الربع غير معتاد مقارنةً بغيره."},"bars-quarters-cut":{"text":"رسم أعمدة للأرباع الثمانية محوره الرأسي يبدأ من 40,000 لتصبح الفروق أوضح","why":"قطع خط الأساس يضخّم الفروق: سيبدو الربع الأول من 2025 ضئيلًا بجانب الربع الرابع من 2025، وستختفي تمامًا ثلاثة أرباع من 2024 لأنها كلها دون 40,000. يجب أن تبدأ الأعمدة من الصفر."}}},"words":612,"readMinutes":4}