لا توجد مكتبة رسوم بيانية واحدة "أفضل" في Python، ومن يقول لك غير ذلك فهو يحاول بيعك شيئاً. الجواب الصادق هو أن المجال ينقسم إلى حفنة من الأدوات يتفوّق كلٌّ منها في مهمة بعينها: رسم ثابت بجودة النشر، أو سطر واحد للإحصاء، أو لوحة معلومات تفاعلية، أو مواصفة تصريحية يمكن وضعها تحت إدارة الإصدارات، أو رسم يجب أن يصمد أمام مئة مليون نقطة. تستعرض هذه المراجعة المكتبات التي تهمّ، وما الذي يجيده كلٌّ منها حقاً، وأين ينهار، و — لأن هذا الموقع يدور حول البناء بـ Python للأسواق — كيف تتعامل مع الشموع اليابانية والسلاسل الزمنية الكبيرة.
كل عدد نجوم ورقم تنزيل وترخيص أدناه جرى التحقق منه مقابل المصادر الأولية (GitHub وPyPI والوثائق الرسمية) في منتصف 2026. وحيثما كان الرقم أفضل حالة يُبلِّغ عنها المورّد عن نفسه، فقد جرت الإشارة إلى ذلك.

النموذج الذهني: ثابت مقابل تفاعلي
أول مفترق هو ما إذا كان الخرج صورة ثابتة (PNG/SVG/PDF تُرسَم مرة واحدة) أم شكلاً تفاعلياً (HTML/JS، مع التحريك والتكبير والتمرير فوق العناصر في المتصفح).
- ثابت: Matplotlib وSeaborn وPlotnine — وPygal الذي يُخرج SVG شبه تفاعلي.
- تفاعلي: Plotly وBokeh وAltair.
المفترق الثاني — الذي لا يظهر أثره إلا عندما تكبر بياناتك — هو أين تُرسَم النقاط: في المتصفح (من جهة العميل، عبر WebGL) أم مُجمّعة مسبقاً على الخادم في صورة. هذا التمييز هو جوهر قصة "طبقة التوسّع" التي ستأتي لاحقاً، وهو ما تتجاهله معظم المراجعات.
Matplotlib — الأساس الذي يقوم عليه كل شيء
Matplotlib هي الصخرة الأساس للرسم في Python. إنها ليست مجرد مكتبة، بل محرّك التصيير الذي تبني فوقه Seaborn، والإعدادات الافتراضية لـ Plotnine، وmplfinance، وعشرات غيرها. ترخيصها متساهل — رسمياً "مبني على ترخيص PSF" ومتوافق مع BSD، فيمكنك إدراجها في منتج احتكاري وبيعه دون تردّد (وثائق الترخيص).
نقاط القوة. تحكّم كامل. إن كان بوسعك وصف علامة على لوحة ثنائية الأبعاد، فبإمكان Matplotlib رسمها، وهي تُصدّر PDF/SVG شعاعياً حاداً صالحاً للطباعة. وهي مثبّتة في كل مكان، ولكل خطأ قد تصادفه إجابة جاهزة على Stack Overflow.
نقاط الضعف. واجهتها البرمجية ذات رأسين بشكل مشهور — واجهة pyplot ذات الحالة على نمط MATLAB، وواجهة Figure/Axes كائنية التوجّه — والدروس التعليمية تخلط بينهما بحرية، وهذا تحديداً سبب وجود نوع كامل من المقالات بعنوان "لماذا تكره matplotlib". الإعدادات الافتراضية قديمة الطراز، وتنسيق رسم ليبدو عصرياً يتطلب أسطراً فعلية من الشيفرة.
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(10, 4))
ax.plot(df.index, df["close"], lw=1.2)
ax.set_title("BTC-USD daily close")
fig.savefig("btc.png", dpi=150, bbox_inches="tight")

استخدمها عندما تحتاج إلى رسم ثابت جاهز للطباعة، أو عندما تبني أداة أعلى مستوى وتريد لوحة تتحكم فيها تحكماً كاملاً.
Seaborn — رسوم إحصائية دون الإسهاب
Seaborn طبقة رقيقة ذات رأي محدّد فوق Matplotlib (ترخيص BSD-3-Clause) تحوّل عشرة أسطر من العبث بالمحاور إلى سطر واحد. إنها "توفّر واجهة عالية المستوى لرسم رسوم إحصائية جذابة" وتتكامل بإحكام مع pandas — فالتوزيعات والانحدارات والخرائط الحرارية والمضاعفات الصغيرة المقسّمة كلها باستدعاء واحد.
import seaborn as sns
sns.set_theme()
sns.lineplot(data=returns, x="date", y="ret", hue="symbol")

نقاط القوة. إعدادات إحصائية افتراضية من الطراز الأول؛ جميلة من الصندوق مباشرة؛ الخيار الأول البديهي لتحليل البيانات الاستكشافي.
نقاط الضعف. ترث طبيعة Matplotlib الثابتة (لا تفاعلية)، وعندما تحتاج رسماً لا تملك له دالة، تعود إلى Matplotlib الخام على أي حال. إنها طبقة راحة، لا مهرب من المحرّك.
استخدمها عندما تجري تحليلاً استكشافياً على DataFrame وتريد خرائط حرارية للارتباط أو توزيعات أو رسوم انحدار بسرعة.
Plotly — الخيار التفاعلي الافتراضي
Plotly.py هي الخيار التفاعلي الأوسع تبنّياً. مرخّصة بـ MIT، ومبنية فوق plotly.js، والأرقام ليست متقاربة: نحو 18.6k نجمة على GitHub ونحو 1.24 مليار تنزيل من PyPI طوال الوقت — بمعدل يقارب 61 مليون تنزيل في آخر 30 يوماً (PyPI · إحصاءات التنزيل). تأتي تلميحات التمرير والتكبير والتحريك وتبديل وسيلة الإيضاح مجاناً، والشكل نفسه يُعرَض في دفتر ملاحظات أو تطبيق Dash أو ملف HTML ثابت.
import plotly.graph_objects as go
fig = go.Figure(go.Candlestick(
x=df.index, open=df.open, high=df.high, low=df.low, close=df.close,
))
fig.update_layout(title="BTC-USDT", xaxis_rangeslider_visible=False)
fig.show()

نقاط القوة. تفاعلية دون أي JavaScript؛ أنواع رسوم مالية من الدرجة الأولى (go.Candlestick وgo.Ohlc)؛ الطريق إلى لوحة معلومات كاملة (Dash) قصير.
نقاط الضعف. حزمة plotly.js ثقيلة — وهذا تكلفة حقيقية للمواقع الحساسة لزمن تحميل الصفحة (تحليل زمن الحزمة). وهناك سقف تصيير صارم: مع مسارات WebGL (go.Scattergl) يمكنك تمثيل ما يصل إلى نحو مليون نقطة، لكن المتصفحات تسمح بـ 8–16 سياق WebGL لكل صفحة فقط، فعملياً تحصل على 4–8 أشكال WebGL قبل أن تصطدم بـ "Too many active WebGL contexts" (وثائق أداء Plotly). أما التكبير/التحريك التفاعلي السلس فيصمد واقعياً حتى نحو 100–200 ألف نقطة.
استخدمها عندما تريد رسوماً أو لوحات معلومات تفاعلية، خصوصاً المالية منها، وتكون سلاسلك بين الآلاف وملايين قليلة من النقاط.
Bokeh — تفاعلية مبنية للبيانات الكبيرة والمتدفقة
Bokeh (ترخيص BSD-3-Clause، نحو 20.4k نجمة / 4.3k نسخة متفرّعة) هي المنافس التفاعلي الرئيس لـ Plotly، بمركز ثقل مختلف: إنها "مكتبة تصوير تفاعلي لمتصفحات الويب الحديثة" موجّهة نحو مجموعات البيانات الكبيرة والمتدفقة والتطبيقات المدفوعة بالخادم (يستطيع خادم Bokeh دفع تحديثات حية إلى رسم عبر websocket).
تحذير صادق واحد لن يقدّمه لك التسويق: عبارة "عالية الأداء" هي جزئياً وصف ذاتي. تظهر تقارير من الواقع تباطؤ التمرير/التلميحات على مجموعات بيانات صغيرة بحجم نحو 50 ألف نقطة، فهي ليست سريعة تلقائياً على البيانات الضخمة — لا يزال عليك اللجوء إلى التجميع (أدناه). عامِل ميزة Bokeh على أنها التدفّق وبنية التطبيقات، لا عدد النقاط الخام.
from bokeh.plotting import figure, show
p = figure(x_axis_type="datetime", title="BTC-USD", height=350)
p.line(df["date"], df["close"])
show(p)
استخدمها عندما تبني لوحة معلومات تتحدّث حياً أو تطبيق بيانات مدفوعاً بـ Python وتريد تحكماً من جهة الخادم في التفاعلية.
Altair — قواعد تصريحية للرسوم
Altair مكتبة تصريحية: أنت تصف ماذا تُرمّز (هذا العمود إلى المحور x، وذاك إلى اللون) ويقرّر محرّك Vega-Lite كيف يرسمه. الرسوم مواصفات JSON، ما يجعلها قابلة للتركيب وودودة للمقارنة بين الإصدارات.

العقبة التي يصطدم بها كل وافد جديد: افتراضياً ترفض Altair رسم أكثر من 5,000 صف، مُطلِقةً خطأ MaxRowsError. إنه حاجز حماية متعمّد (تُضمّن Altair البيانات كـ JSON في المواصفة)، لا عجز عن التعامل مع البيانات — وإزالته بسطر واحد:
import altair as alt
alt.data_transformers.disable_max_rows() # أو استخدم خلفية VegaFusion لما يقارب 100k+
alt.Chart(df).mark_line().encode(x="date:T", y="close:Q")
إنه مصدر إحباط متكرّر تحديداً لأن الخطأ يظهر على ما يبدو إطاراً "صغيراً" من 35 ألف صف (وثائق البيانات الكبيرة).
استخدمها عندما تقدّر المواصفات الموجزة والتصريحية والقابلة لإعادة الإنتاج وتكون بياناتك متواضعة الحجم — أو تكون مستعداً لتوصيل VegaFusion للأطر الأكبر.
Plotnine وPygal — استكمال المشهد
- Plotnine نقل شبه وفيّ لقواعد رسوم
ggplot2من R (مرخّصة بـ MIT). إن جئت من R أو كنت تفكّر بأسلوبaes()+ طبقاتgeom_*، فهي أكثر الواجهات البرمجية طبيعية في هذه القائمة. تُصيّر عبر Matplotlib، فهي ثابتة.
python
from plotnine import ggplot, aes, geom_line
(ggplot(df, aes("date", "close")) + geom_line())
- Pygal تُخرج رسوم SVG — مستقلة عن الدقة، قابلة للتنسيق بـ CSS، وصغيرة بما يكفي للتضمين في تقرير أو صفحة ويب. إنها خيار متخصّص: رائعة لرسوم شعاعية نظيفة على صفحة ويب، لكنها ليست مبنية للبيانات الكبيرة أو التفاعلية الثقيلة.

عندما تكبر بياناتك: طبقة التوسّع
هنا تنهار الخيارات الساذجة. بمجرد تجاوزك مليون نقطة، لا يمكنك ببساطة تسليمها للمتصفح. (وللدقّة بشأن خرافة شائعة: يستطيع المتصفح تمثيل نحو مليون نقطة WebGL — ما يتدهور هو السلاسة التفاعلية، لا أنه انهيار صارم.) هناك استراتيجيتان تحلّان هذا:
1. التنقيط من جهة الخادم — Datashader. بدلاً من إرسال النقاط إلى المتصفح، تقوم Datashader (ترخيص BSD-3-Clause) بتوزيعها في شبكة ثنائية الأبعاد ثابتة الحجم وتصيّر تلك الشبكة كصورة، "محافظةً بأمانة على توزيع البيانات". رقمها الأبرز: مليار نقطة في نحو ثانية على حاسوب محمول بذاكرة 16 GB، مع التوسّع خارج الذاكرة وإلى وحدة المعالجة الرسومية عبر Dask (مقدمة · دليل البيانات الكبيرة في HoloViews). عامِل رقم المليار نقطة في الثانية على أنه أفضل حالة من المورّد — لكن النهج نفسه (إعادة التوزيع عند كل تكبير/تحريك) هو فعلاً الصحيح للبيانات الكثيفة.
import datashader as ds, datashader.transfer_functions as tf
cvs = ds.Canvas(plot_width=900, plot_height=400)
agg = cvs.points(df, "t", "price") # df قد يكون إطار Dask أكبر من ذاكرة الوصول العشوائي
img = tf.shade(agg)
2. تقليل العيّنات المعتمد على العرض — plotly-resampler. يحافظ هذا على تفاعلية Plotly الكاملة لكنه لا يصيّر سوى النقاط التي يمكنك رؤيتها فعلاً. يقلّص تجميعه الافتراضي MinMaxLTTB كل مسار إلى نحو 1,000 نقطة مرسومة للعرض الحالي، ثم يعيد الجلب أثناء تكبيرك — يُصوّر العرض التوضيحي بهذه الطريقة أكثر من 110 ملايين نقطة بيانات (الورقة البحثية).
from plotly_resampler import FigureResampler
import plotly.graph_objects as go
fig = FigureResampler(go.Figure())
fig.add_trace(go.Scattergl(name="price"), hf_x=ts, hf_y=price) # 100M+ نقطة
fig.show_dash()
قاعدة عامة: مخطط انتشار/خريطة حرارية كثيفة من ملايين النقاط ← Datashader؛ سلسلة زمنية تفاعلية طويلة ← plotly-resampler.
رسم بيانات الأسواق: الشموع اليابانية وOHLC
لسير عمل موجّه للتداول، النجم البارز هو mplfinance — حزمة الرسوم المالية من منظمة Matplotlib. تأخذ DataFrame من pandas بفهرس DatetimeIndex وأعمدة Open/High/Low/Close وترسم رسوم الشموع اليابانية وOHLC والخطوط وRenko وPoint & Figure، مع المتوسطات المتحركة وحجم التداول مدمجين فيها:
import mplfinance as mpf
mpf.plot(df, type="candle", mav=(20, 50), volume=True, style="charles")
ما وراء mplfinance:
- الشموع اليابانية التفاعلية:
go.Candlestickمن Plotly، مغلّفة فيplotly-resamplerعندما يطول تاريخك. - الرسوم الحية/المتدفقة: نموذج خادم Bokeh، أو أغلفة مخصصة مثل
lightweight-charts-python(ربط فوق lightweight-charts من TradingView) عندما تريد مظهر طرفية التداول بدقة. - التقارير الثابتة/الاختبارات الرجعية: mplfinance مباشرة إلى PNG.
المقارنة في لمحة
| المكتبة | النوع | الترخيص | تفاعلية | الأفضل لـ | انتبه إلى |
|---|---|---|---|---|---|
| Matplotlib | ثابتة | متوافقة مع PSF/BSD | لا | تحكّم كامل، الطباعة/PDF | مُسهِبة، إعدادات افتراضية قديمة |
| Seaborn | ثابتة | BSD-3 | لا | التحليل الاستكشافي الإحصائي | تعود إلى Matplotlib للحالات غير المعتادة |
| Plotly | تفاعلية | MIT | نعم | لوحات المعلومات، الرسوم المالية | حزمة ثقيلة؛ سقف WebGL نحو مليون نقطة |
| Bokeh | تفاعلية | BSD-3 | نعم | التدفّق / تطبيقات البيانات | ليست سريعة تلقائياً على البيانات الكبيرة |
| Altair | تفاعلية | BSD-3 | نعم | مواصفات تصريحية قابلة لإعادة الإنتاج | حدّ افتراضي بـ 5,000 صف |
| Plotnine | ثابتة | MIT | لا | ذاكرة عضلات ggplot2 | ثابتة فقط |
| Pygal | SVG | مفتوحة المصدر (LGPL) | خفيفة | رسوم شعاعية نظيفة على الويب | متخصصة؛ ليست للبيانات الكبيرة |
| Datashader | تنقيط من الخادم | BSD-3 | عبر HoloViews | 10⁶–10⁹ نقطة | صورة، لا علامات شعاعية |
| mplfinance | ثابتة | بنمط BSD (منظمة mpl) | لا | الشموع اليابانية / OHLC | ثابتة؛ اقرنها بـ Plotly للتفاعلية |
أرقام الشعبية مُتحقَّق منها في منتصف 2026: Plotly نحو 18.6k نجمة / نحو 1.24 مليار تنزيل؛ Bokeh نحو 20.4k نجمة / 4.3k نسخة متفرّعة. أعداد النجوم والتنزيلات تتغير باستمرار — عامِلها كلقطات لحظية، وتذكّر أن تنزيلات PyPI الخام تشمل أنظمة التكامل المستمر والمرايا، فهي تبالغ في تقدير التبني البشري.
كيف تختار، بنفَس واحد
- رسم ثابت سريع في دفتر ملاحظات ← Matplotlib.
- تحليل استكشافي إحصائي على DataFrame ← Seaborn.
- رسوم تفاعلية أو لوحة معلومات ← Plotly (أو Bokeh إن كان متدفقاً / بشكل تطبيق).
- مواصفات موجزة قابلة لإدارة الإصدارات ← Altair (انتبه لحدّ 5k صف).
- أنت تفكّر بأسلوب ggplot2 ← Plotnine.
- SVG نظيف لصفحة ويب أو تقرير ← Pygal.
- ملايين إلى مليارات النقاط ← Datashader (للكثيفة) أو plotly-resampler (للسلاسل الزمنية الطويلة).
- الشموع اليابانية وبيانات الأسواق ← mplfinance للثابتة، Plotly للتفاعلية.
اختر التي تناسب المهمة، لا التي تملك أكثر النجوم. معظم المشاريع الواقعية تنتهي إلى استخدام اثنتين أو ثلاث منها معاً — Seaborn للاستكشاف، وPlotly للوحة المعلومات، وmplfinance لتقرير الاختبار الرجعي — وهذه هي النتيجة الصحيحة، لا فشل في التوحيد.
المنهجية: جرى التحقق المتبادل من ادعاءات هذه المراجعة مقابل المصادر الأولية (مستودعات GitHub للمشاريع، وPyPI، والوثائق الرسمية) والتحقق منها بأسلوب تنافسي؛ الأرقام لقطات لمنتصف 2026. أرقام الأداء المُعلَّمة كأرقام مورّد (مليار نقطة من Datashader، و110 ملايين من plotly-resampler) هي أفضل حالات قابلة لإعادة الإنتاج، لا اختبارات أداء مستقلة.