ورقة Matplotlib المرجعية
آخر تحديث
الشكل والمحاور
الشكل (figure) هو الصورة كاملة. والمحاور (axes) رسم واحد داخله، وكل الاستدعاءات أدناه تقريبًا دوال على ax .
| المهمة | الكود |
|---|---|
| استيراد pyplot | import matplotlib.pyplot as plt |
| شكل واحد فيه رسم واحد | fig, ax = plt.subplots() |
| تحديد الحجم بالبوصة | fig, ax = plt.subplots(figsize=(8, 4)) |
| الرسم على المحاور | ax.plot(x, y) |
| عرض الشكل | plt.show() |
| الحفظ كصورة PNG حادة | fig.savefig("chart.png", dpi=150, bbox_inches="tight") |
| الحفظ كرسوم متجهية | fig.savefig("chart.svg"), fig.savefig("chart.pdf") |
| خلفية شفافة | fig.savefig("chart.png", transparent=True) |
| إغلاق الشكل لتحرير الذاكرة | plt.close(fig) |
| أسلوب pyplot السريع لرسم واحد | plt.plot(x, y)
plt.title("Quick look")
plt.show() |
أنواع الرسوم
| المهمة | الكود |
|---|---|
| مخطط خطي | ax.plot(x, y) |
| مخطط انتشار | ax.scatter(x, y, s=20, alpha=0.7) |
| انتشار ملوّن حسب القيمة مع شريط ألوان | points = ax.scatter(x, y, c=y, cmap="viridis")
fig.colorbar(points, ax=ax) |
| مخطط أعمدة | ax.bar(cats, a) |
| مخطط أعمدة أفقية | ax.barh(cats, a) |
| أعمدة مكدسة | ax.bar(cats, a, label="2025")
ax.bar(cats, b, bottom=a, label="2026") |
| أعمدة مجمعة | pos = np.arange(len(cats))
ax.bar(pos - 0.2, a, width=0.4)
ax.bar(pos + 0.2, b, width=0.4)
ax.set_xticks(pos, labels=cats) |
| مدرج تكراري | ax.hist(data, bins=30) |
| مخطط صندوقي | ax.boxplot([data, data * 2], tick_labels=["A", "B"]) |
| مخطط كماني (violin) | ax.violinplot([data, data * 2]) |
| مخطط دائري | ax.pie([40, 35, 25], labels=cats, autopct="%1.0f%%") |
| نطاق بين منحنيين | ax.fill_between(x, y - 0.2, y + 0.2, alpha=0.3) |
| أشرطة الخطأ | ax.errorbar([1, 2, 3], [4, 5, 3], yerr=[0.5, 0.3, 0.6], fmt="o", capsize=4) |
| مخطط درجي | ax.step(x, y, where="mid") |
| خريطة حرارية لمصفوفة ثنائية الأبعاد | image = ax.imshow(np.random.default_rng(0).random((5, 5)), cmap="magma")
fig.colorbar(image, ax=ax) |
| مخطط كنتوري ممتلئ | X, Y = np.meshgrid(x, x)
ax.contourf(X, Y, np.sin(X) * np.cos(Y), levels=20) |
| كثافة عدد كبير من النقاط | ax.hexbin(data, data + np.random.default_rng(1).normal(size=200), gridsize=20) |
| خط مرجعي أفقي أو عمودي | ax.axhline(0, color="gray", linestyle="--"), ax.axvline(5) |
| تظليل نطاق | ax.axvspan(2, 4, alpha=0.2) |
الخطوط والعلامات والألوان
| المهمة | الكود |
|---|---|
| اللون والعرض ونمط الخط | ax.plot(x, y, color="tab:red", linewidth=2, linestyle="--") |
| علامات على النقاط | ax.plot(x, y, marker="o", markersize=4) |
| سلسلة تنسيق مختصرة | ax.plot(x, y, "g--o") |
| الشفافية | ax.plot(x, y, alpha=0.5) |
| أنماط الخطوط | "-", "--", "-.", ":" |
| رموز العلامات | "o", "s", "^", "x", ".", "*" |
| طرق تسمية اللون | "tab:blue", "C1", "#1f77b4", (0.2, 0.4, 0.6) |
| n لونًا من خريطة ألوان | colors = plt.colormaps["viridis"](np.linspace(0, 1, 5)) |
| دورة ألوان خاصة بك | ax.set_prop_cycle(color=["#0b7285", "#e8590c", "#5f3dc4"]) |
| أعمدة بحدود وتظليل خطي | ax.bar(cats, a, color="white", edgecolor="black", hatch="//") |
العناوين والتسميات ووسائل الإيضاح
| المهمة | الكود |
|---|---|
| العنوان وتسميات المحاور | ax.set_title("Sales"), ax.set_xlabel("Month"), ax.set_ylabel("EUR") |
| كلها في استدعاء واحد | ax.set(title="Sales", xlabel="Month", ylabel="EUR") |
| وسيلة إيضاح من تسميات الخطوط | ax.plot(x, y, label="sin")
ax.legend() |
| موضع وسيلة الإيضاح وأعمدتها | ax.legend(loc="upper right", ncols=2, frameon=False) |
| وسيلة الإيضاح خارج الرسم | ax.legend(loc="center left", bbox_to_anchor=(1, 0.5)) |
| نص عند موضع في البيانات | ax.text(5, 0.5, "note") |
| تعليق توضيحي بسهم | ax.annotate("peak", xy=(1.57, 1), xytext=(3, 1.2), arrowprops=dict(arrowstyle="->")) |
| تسميات القيم على الأعمدة | bars = ax.bar(cats, a)
ax.bar_label(bars) |
| عنوان للشكل كاملًا | fig.suptitle("Q1 report") |
| رموز رياضية في التسميات | ax.set_xlabel(r"$\alpha$ (rad)") |
المحاور والتدريجات والمقاييس
| المهمة | الكود |
|---|---|
| حدود المحاور | ax.set_xlim(0, 10), ax.set_ylim(bottom=0) |
| مقياس لوغاريتمي | ax.set_yscale("log") |
| اختيار التدريجات وتسمياتها | ax.set_xticks([0, 5, 10], labels=["start", "middle", "end"]) |
| تدوير تسميات التدريجات | ax.tick_params(axis="x", labelrotation=45) |
| خطوط الشبكة | ax.grid(True, alpha=0.3) |
| محور بالنسبة المئوية | from matplotlib.ticker import PercentFormatter
ax.yaxis.set_major_formatter(PercentFormatter(1.0)) |
| فاصل الآلاف | ax.yaxis.set_major_formatter("{x:,.0f}") |
| إخفاء الإطار العلوي والأيمن | ax.spines[["top", "right"]].set_visible(False) |
| محور y ثانٍ على اليمين | ax2 = ax.twinx()
ax2.plot(x, y * 100, color="tab:orange") |
| المقياس نفسه على المحورين | ax.set_aspect("equal") |
| قلب محور | ax.invert_yaxis() |
| إخفاء المحاور تمامًا | ax.axis("off") |
| تسميات تواريخ مقروءة | fig.autofmt_xdate() |
الرسوم الفرعية والتخطيط
تُرجع plt.subplots(rows, cols) مصفوفة NumPy من المحاور. استخدم الفهرسة عليها كأي مصفوفة.
| المهمة | الكود |
|---|---|
| شبكة من الرسوم | fig, axs = plt.subplots(2, 2, figsize=(8, 6)) |
| الرسم على أحدها | axs[0, 1].plot(x, y) |
| المرور عليها كلها | for ax in axs.flat:
ax.grid(True) |
| مشاركة محور بين الرسوم | fig, axs = plt.subplots(1, 3, sharey=True) |
| تباعد يمنع التداخل | fig, axs = plt.subplots(2, 2, layout="constrained") |
| إصلاح التداخل بعد الرسم | fig.tight_layout() |
| أعمدة بعروض مختلفة | fig, axs = plt.subplots(1, 2, width_ratios=[3, 1]) |
| تخطيط مسمّى مع لوحة عريضة | fig, axd = plt.subplot_mosaic([["top", "top"], ["left", "right"]])
axd["top"].plot(x, y) |
| رسم صغير داخل رسم | inset = ax.inset_axes([0.6, 0.6, 0.35, 0.35]) |
| إخفاء لوحة فارغة | axs[0].axis("off") |
الأنماط والإعدادات الافتراضية
| المهمة | الكود |
|---|---|
| استخدام نمط مدمج | plt.style.use("ggplot") |
| عرض قائمة الأنماط | plt.style.available |
| مظهر seaborn بدون seaborn | plt.style.use("seaborn-v0_8-whitegrid") |
| نمط لشكل واحد فقط | with plt.style.context("dark_background"):
fig, ax = plt.subplots() |
| حجم الخط الافتراضي | plt.rcParams["font.size"] = 12 |
| حجم الشكل ودقته الافتراضيان | plt.rcParams["figure.figsize"] = (8, 4), plt.rcParams["figure.dpi"] = 120 |
| العودة إلى الإعدادات الافتراضية | plt.style.use("default") |
| خرائط ألوان شائعة: متدرجة، متباعدة، رمادية | "viridis", "coolwarm", "Greys" |
الرسم من pandas
ترسم pandas باستخدام Matplotlib. مرّر ax= لترسم داخل محاورك، أو احتفظ بكائن ax الذي تُرجعه pandas.
| المهمة | الكود |
|---|---|
| أعمدة DataFrame داخل محاورك | df.plot(x="month", y="sales", ax=ax) |
| مخطط أعمدة لملخص مجموعات | df.groupby("city")["sales"].sum().plot.bar(ax=ax) |
| متابعة تنسيق ما رسمته pandas | ax = df.plot(x="month", y="sales")
ax.set_title("Sales") |
| الأعمدة مباشرة إلى Matplotlib | ax.plot(df["month"], df["sales"]) |
Matplotlib 3.11: الصيغ القديمة وما تكتبه الآن
الكود المنسوخ من الدروس القديمة قد يفشل أو يُظهر تحذيرات في Matplotlib 3.11. اكتب الصيغ الموجودة في عمود Matplotlib 3.11 بدلًا منه.
| المهمة | Matplotlib 3.11 | الصيغة القديمة |
|---|---|---|
| تسميات المخطط الصندوقي | ax.boxplot([data, data * 2], tick_labels=["A", "B"]) | labels=["A", "B"] |
| مخطط صندوقي أو كماني أفقي | ax.boxplot(data, orientation="horizontal") | vert=False |
| الحصول على خريطة ألوان | plt.colormaps["viridis"] | plt.cm.get_cmap("viridis") |
| نمط seaborn | plt.style.use("seaborn-v0_8") | plt.style.use("seaborn") |
أكواد Matplotlib التي تحتاجها لتحويل البيانات إلى رسم بياني واضح، مرتبة حسب المهمة: الشكل والمحاور، أنواع الرسوم، الخطوط والألوان، العناوين ووسائل الإيضاح، المحاور والتدريجات، الرسوم الفرعية والتخطيط، الأنماط، والرسم من pandas. كل صف مقتطف قصير يمكنك لصقه مباشرة، مع سطر واحد يشرح ما يفعله.
كل ما هنا يستخدم الأسلوب الكائني ( fig, ax = plt.subplots() ثم استدعاء الدوال على ax ) ومكتوب لإصدار Matplotlib 3.11، وهو الإصدار الذي يشغّله Coddy. الصيغ القديمة مثل labels= في boxplot لا تظهر إلا في الجدول الأخير، بجانب ما تكتبه بدلًا منها. تستخدم الأمثلة x = np.linspace(0, 10, 50) و y = np.sin(x) وعينة من قيم التوزيع الطبيعي اسمها data . هل أنت جديد على Python نفسها؟ ابدأ بـ ورقة Python المرجعية، واحتفظ بأوراق pandas و NumPy و scikit-learn المرجعية بجانب هذه الورقة.
الأسئلة الشائعة حول ورقة Matplotlib المرجعية
هل ورقة Matplotlib المرجعية هذه مجانية؟
ما الفرق بين plt و ax؟
plt.plot() على المحاور الحالية أيًا كانت، وهذا سريع لرسم واحد. أما fig, ax = plt.subplots() فتعطيك الشكل والمحاور ككائنات، فترسم ax.plot() دائمًا في المكان الذي تقصده تمامًا. استخدم أسلوب ax في أي شيء فيه أكثر من رسم واحد، وفي الكود الذي ستحتفظ به.كيف أغيّر حجم الشكل؟
figsize بالبوصة عند إنشاء الشكل: fig, ax = plt.subplots(figsize=(10, 5)) . ولتغيير القيمة الافتراضية لكل الأشكال، اضبط plt.rcParams["figure.figsize"] = (10, 5) . حجم الملف المحفوظ بالبكسل يساوي figsize مضروبًا في dpi .كيف أحفظ رسمًا بدقة عالية؟
fig.savefig("chart.png", dpi=300, bbox_inches="tight") . كلما ارتفعت قيمة dpi كانت صورة PNG أكثر حدة، و bbox_inches="tight" تقص الهوامش الفارغة. للطباعة أو العروض التقديمية احفظ بصيغة SVG أو PDF، فهما تبقيان حادتين بأي حجم.لماذا تتداخل عناوين الرسوم الفرعية وتسمياتها؟
layout="constrained" ، كما في plt.subplots(2, 2, layout="constrained") ، وسيترك Matplotlib مساحة للعناوين والتسميات وأشرطة الألوان. وفي شكل موجود، استدعِ fig.tight_layout() بعد الرسم.ما إصدار Matplotlib الذي تغطيه هذه الورقة المرجعية؟
labels= في boxplot (أصبحت الآن tick_labels= ) و plt.cm.get_cmap (أصبحت الآن plt.colormaps[...] )، موجودة في الجدول الأخير بجانب ما تكتبه بدلًا منها.