مقدمه
اگه با دادهها کار کرده باشید، حتماً میدونید که نگاه کردن به ردیفهای بیپایان اعداد توی یه جدول چقدر میتونه خستهکننده باشه. ولی وقتی همون دادهها رو تبدیل به یه نمودار میکنید، یهدفعه همهچیز معنا پیدا میکنه. الگوها، روندها و حتی ناهنجاریهایی که قبلاً اصلاً نمیدیدید، یکباره جلوی چشمتون ظاهر میشن.
راستش رو بخواید، مصورسازی داده یکی از اون مهارتهاییه که هر برنامهنویس و تحلیلگر دادهای باید بلد باشه. یه نمودار خوب میتونه داستانی رو روایت کنه که هزاران سطر داده قادر به بیان اون نیستن.
تو اکوسیستم پایتون، دو کتابخانه اصلی برای این کار وجود داره: Matplotlib و Seaborn. خلاصه بگم — Matplotlib پایه و اساس کاره و کنترل کاملی روی همه جزئیات نمودار بهتون میده. Seaborn هم که روی Matplotlib ساخته شده، یه رابط سطحبالاتر ارائه میده و ساختن نمودارهای آماری زیبا رو خیلی سادهتر میکنه.
یه نکته جالب: نسخه ۳.۱۰ کتابخانه Matplotlib قابلیتهای جدیدی تو زمینه دسترسیپذیری معرفی کرده. مثلاً پالت رنگی petroff10 که مخصوص افرادی طراحی شده که مشکل تشخیص رنگ دارن. این خودش یه گام بزرگ بهسمت فراگیرتر کردن نمودارهاست.
خب، بریم سراغ کار. تو این راهنما از صفر شروع میکنیم و قدمبهقدم تا تکنیکهای پیشرفته جلو میریم. هر بخش هم کدهای قابل اجرا داره تا بتونید همزمان تمرین کنید.
نصب و راهاندازی
قبل از هر چیزی، باید هر دو کتابخانه رو نصب کنید. اگه از Anaconda استفاده میکنید، احتمالاً از قبل نصب هستن. در غیر این صورت:
pip install matplotlib seaborn
بعد از نصب، این تنظیمات رو در ابتدای پروژهتون اجرا کنید. من خودم همیشه از این تنظیمات استفاده میکنم و پیشنهاد میکنم شما هم همین کار رو بکنید:
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd
# تنظیم نمایش نمودار در Jupyter Notebook
%matplotlib inline
# تنظیم اندازه پیشفرض نمودارها
plt.rcParams['figure.figsize'] = (10, 6)
plt.rcParams['figure.dpi'] = 100
print(f"Matplotlib version: {plt.matplotlib.__version__}")
print(f"Seaborn version: {sns.__version__}")
مبانی Matplotlib
مفهوم Figure و Axes
اینجا باید یه مفهوم مهم رو درک کنید. هر نمودار در Matplotlib از دو جزء اصلی ساخته شده: Figure که بوم یا قاب کلی نمودار هست، و Axes که ناحیه واقعی ترسیم دادهها رو مشخص میکنه. یک Figure میتونه شامل چندین Axes باشه.
اولش شاید یکم گیجکننده به نظر برسه، ولی وقتی چند تا نمودار بسازید، این مفهوم کاملاً جا میافته.
نمودار خطی (Line Plot)
سادهترین و شاید پرکاربردترین نوع نمودار برای نشون دادن روند تغییرات در طول زمان:
months = np.arange(1, 13)
sales = [230, 280, 310, 345, 290, 370, 410, 395, 450, 480, 520, 590]
fig, ax = plt.subplots()
ax.plot(months, sales, marker='o', color='#2196F3', linewidth=2, markersize=6)
ax.set_xlabel('Month')
ax.set_ylabel('Sales (Million Toman)')
ax.set_title('Monthly Sales Trend - 2025')
ax.set_xticks(months)
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
نمودار میلهای (Bar Chart)
وقتی میخواید مقادیر بین دستههای مختلف رو با هم مقایسه کنید، نمودار میلهای بهترین انتخابه:
departments = ['Engineering', 'Marketing', 'Sales', 'Support', 'HR']
revenue = [450, 320, 580, 190, 150]
colors = ['#4CAF50', '#2196F3', '#FF9800', '#9C27B0', '#F44336']
fig, ax = plt.subplots()
bars = ax.bar(departments, revenue, color=colors, edgecolor='white', linewidth=1.2)
for bar, val in zip(bars, revenue):
ax.text(bar.get_x() + bar.get_width() / 2, bar.get_height() + 8,
f'{val}', ha='center', va='bottom', fontweight='bold')
ax.set_ylabel('Revenue (Billion Rials)')
ax.set_title('Revenue by Department')
ax.set_ylim(0, max(revenue) * 1.15)
plt.tight_layout()
plt.show()
دقت کنید که اضافه کردن مقدار عددی بالای هر میله (با ax.text) خوانایی نمودار رو خیلی بالا میبره.
نمودار پراکندگی (Scatter Plot)
برای بررسی رابطه بین دو متغیر عددی، نمودار پراکندگی دقیقاً همون چیزیه که لازم دارید:
np.random.seed(42)
study_hours = np.random.uniform(1, 10, 50)
scores = 40 + 5 * study_hours + np.random.normal(0, 5, 50)
scores = np.clip(scores, 0, 100)
fig, ax = plt.subplots()
scatter = ax.scatter(study_hours, scores, c=scores, cmap='viridis',
s=80, alpha=0.7, edgecolors='white', linewidth=0.5)
plt.colorbar(scatter, ax=ax, label='Score')
ax.set_xlabel('Study Hours per Day')
ax.set_ylabel('Exam Score')
ax.set_title('Relationship between Study Hours and Exam Score')
plt.tight_layout()
plt.show()
هیستوگرام (Histogram)
هیستوگرام توزیع فراوانی یک متغیر رو نشون میده. مثلاً فرض کنید میخواید ببینید سن کارمندان یه شرکت چطور توزیع شده:
np.random.seed(10)
ages = np.concatenate([
np.random.normal(30, 5, 200),
np.random.normal(45, 7, 150)
])
fig, ax = plt.subplots()
ax.hist(ages, bins=25, color='#3F51B5', edgecolor='white',
alpha=0.8, density=True)
ax.set_xlabel('Age')
ax.set_ylabel('Density')
ax.set_title('Employee Age Distribution')
ax.axvline(np.mean(ages), color='red', linestyle='--', label=f'Mean: {np.mean(ages):.1f}')
ax.legend()
plt.tight_layout()
plt.show()
خط قرمز چیندار که میانگین رو نشون میده، یه اضافه سادهست ولی اطلاعات مفیدی به نمودار اضافه میکنه.
سفارشیسازی نمودارها در Matplotlib
قدرت واقعی Matplotlib اینجا مشخص میشه: توی سفارشیسازی. برچسبها، عنوانها، رنگها، سبک خطوط، راهنماها — همهچیز قابل کنترله.
یکی از ویژگیهای خیلی باحال Matplotlib استفاده از سبکهای از پیش تعریفشده با دستور plt.style.use() هست. تو نسخه ۳.۱۰، سبک petroff10 معرفی شده که پالت رنگی مناسبی برای افراد مبتلا به کوررنگی ارائه میده. جالبه بدونید این پالت با ترکیب مدلسازی الگوریتمی اختلال بینایی رنگ و یه مدل یادگیری ماشین مبتنی بر نظرسنجی ترجیحات رنگی طراحی شده:
plt.style.use('seaborn-v0_8-whitegrid')
months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun']
product_a = [120, 135, 150, 145, 170, 190]
product_b = [90, 100, 95, 120, 130, 125]
product_c = [60, 75, 80, 95, 85, 110]
fig, ax = plt.subplots(figsize=(10, 6))
colors = ['#3274A1', '#E1812C', '#3A923A']
ax.plot(months, product_a, marker='s', linewidth=2.5, color=colors[0],
label='Product A', markersize=8)
ax.plot(months, product_b, marker='^', linewidth=2.5, color=colors[1],
label='Product B', markersize=8)
ax.plot(months, product_c, marker='D', linewidth=2.5, color=colors[2],
label='Product C', markersize=8)
ax.set_xlabel('Month', fontsize=13)
ax.set_ylabel('Sales Count', fontsize=13)
ax.set_title('Product Sales Comparison - H1 2025', fontsize=15, fontweight='bold')
ax.legend(fontsize=11, loc='upper left', frameon=True, shadow=True)
ax.set_ylim(0, 220)
ax.tick_params(axis='both', labelsize=11)
plt.tight_layout()
plt.show()
و اگه فقط میخواید سبک petroff10 رو فعال کنید، کافیه بنویسید:
plt.style.use('petroff10')
همین یه خط، کل پالت رنگی نمودارتون رو عوض میکنه.
چیدمان چند نموداری با Subplots و GridSpec
خیلی وقتها لازمه چند تا نمودار رو کنار هم نشون بدید تا مقایسه بصری راحتتر بشه. تابع plt.subplots() برای شبکههای ساده و GridSpec برای چیدمانهای پیچیدهتر به کار میاد.
import matplotlib.gridspec as gridspec
np.random.seed(42)
data = np.random.randn(1000)
fig = plt.figure(figsize=(12, 8), constrained_layout=True)
gs = gridspec.GridSpec(2, 2, figure=fig)
ax_top = fig.add_subplot(gs[0, :])
ax_top.plot(np.cumsum(data), color='#2196F3', linewidth=1.5)
ax_top.set_title('Cumulative Sum (Random Walk)', fontsize=13)
ax_top.set_xlabel('Step')
ax_top.set_ylabel('Value')
ax_top.grid(True, alpha=0.3)
ax_bl = fig.add_subplot(gs[1, 0])
ax_bl.hist(data, bins=35, color='#4CAF50', edgecolor='white', alpha=0.8)
ax_bl.set_title('Value Distribution', fontsize=13)
ax_bl.set_xlabel('Value')
ax_bl.set_ylabel('Frequency')
ax_br = fig.add_subplot(gs[1, 1])
bp = ax_br.boxplot([data[data > 0], data[data <= 0]],
labels=['Positive', 'Negative'],
patch_artist=True)
bp['boxes'][0].set_facecolor('#FF9800')
bp['boxes'][1].set_facecolor('#9C27B0')
ax_br.set_title('Box Plot by Sign', fontsize=13)
ax_br.set_ylabel('Value')
plt.show()
نکته مهم: همیشه از constrained_layout=True استفاده کنید. بدون این پارامتر، نمودارها ممکنه روی هم بیفتن و متنها قاطی بشن (و باور کنید دیباگ کردنش اصلاً خوشایند نیست).
آشنایی با Seaborn
خب، حالا بریم سراغ Seaborn. این کتابخانه مصورسازی آماری روی Matplotlib ساخته شده و مزایای خیلی خوبی داره:
- یکپارچگی با Pandas: مستقیماً با DataFrame کار میکنه و اسم ستونها رو بهعنوان برچسب محورها استفاده میکنه
- زیبایی پیشفرض: نمودارها بدون تنظیمات اضافی ظاهر حرفهای دارن
- نمودارهای آماری: انواع نمودارهای تخصصی آماری رو با یه خط کد میسازه
- پالتهای رنگی هوشمند: مجموعهای از پالتهای رنگی زیبا و کاربردی ارائه میده
بیاید یه دیتافریم نمونه بسازیم تا باهاش کار کنیم:
import seaborn as sns
sns.set_theme(style="whitegrid", palette="muted", font_scale=1.1)
np.random.seed(0)
df = pd.DataFrame({
'age': np.random.randint(20, 60, 200),
'salary': np.random.randint(3000, 15000, 200),
'department': np.random.choice(['Engineering', 'Marketing', 'Sales', 'Support'], 200),
'experience': np.random.randint(1, 25, 200)
})
df['salary'] = df['salary'] + df['experience'] * 300
print(df.head())
نمودارهای توزیعی در Seaborn
Seaborn مجموعه قدرتمندی از توابع برای بررسی توزیع دادهها ارائه میده. سه تابع اصلی histplot، kdeplot و rugplot هستن که میتونید بهصورت مجزا یا ترکیبی استفادهشون کنید:
fig, axes = plt.subplots(1, 3, figsize=(16, 5), constrained_layout=True)
sns.histplot(data=df, x='salary', kde=True, bins=30,
color='#5C6BC0', ax=axes[0])
axes[0].set_title('Salary Distribution (Histogram + KDE)')
sns.kdeplot(data=df, x='salary', hue='department',
fill=True, alpha=0.4, ax=axes[1])
axes[1].set_title('Salary Density by Department')
sns.histplot(data=df, x='age', bins=20, color='#26A69A', ax=axes[2])
sns.rugplot(data=df, x='age', color='#004D40', alpha=0.5, ax=axes[2])
axes[2].set_title('Age Distribution with Rug Plot')
plt.show()
من شخصاً ترکیب Histogram با KDE رو خیلی دوست دارم. هم توزیع کلی رو نشون میده و هم منحنی صافی از چگالی دادهها رسم میکنه.
نمودارهای رابطهای و طبقهبندی
نمودارهای رابطهای (Relational Plots)
برای بررسی رابطه بین متغیرها، توابع scatterplot و lineplot ابزارهای اصلی هستن:
fig, axes = plt.subplots(1, 2, figsize=(14, 5), constrained_layout=True)
sns.scatterplot(data=df, x='experience', y='salary',
hue='department', size='age',
sizes=(30, 200), alpha=0.7, ax=axes[0])
axes[0].set_title('Salary vs Experience')
axes[0].legend(bbox_to_anchor=(1.02, 1), loc='upper left', fontsize=8)
salary_by_exp = df.groupby('experience')['salary'].mean().reset_index()
sns.lineplot(data=salary_by_exp, x='experience', y='salary',
marker='o', color='#E53935', ax=axes[1])
axes[1].set_title('Average Salary by Experience')
axes[1].fill_between(salary_by_exp['experience'], salary_by_exp['salary'],
alpha=0.15, color='#E53935')
plt.show()
نمودارهای طبقهبندی (Categorical Plots)
نمودارهای جعبهای، ویولنی و Swarm برای مقایسه توزیع یه متغیر عددی بین دستههای مختلف فوقالعاده کارآمدن. بیاید هر سه رو کنار هم ببینیم:
fig, axes = plt.subplots(1, 3, figsize=(16, 5), constrained_layout=True)
sns.boxplot(data=df, x='department', y='salary',
palette='Set2', ax=axes[0])
axes[0].set_title('Salary Distribution by Department (Box Plot)')
axes[0].tick_params(axis='x', rotation=25)
sns.violinplot(data=df, x='department', y='salary',
palette='Set3', inner='quartile', ax=axes[1])
axes[1].set_title('Salary Distribution (Violin Plot)')
axes[1].tick_params(axis='x', rotation=25)
df_sample = df.sample(80, random_state=1)
sns.swarmplot(data=df_sample, x='department', y='salary',
palette='Dark2', size=4, ax=axes[2])
axes[2].set_title('Salary Distribution (Swarm Plot)')
axes[2].tick_params(axis='x', rotation=25)
plt.show()
نکته: برای Swarm Plot بهتره از یه نمونه کوچکتر استفاده کنید (مثل df.sample(80))، چون با دادههای زیاد نقطهها روی هم میریزن و نمودار شلوغ میشه.
نمودارهای ماتریسی: Heatmap و Clustermap
نمودارهای ماتریسی برای نمایش روابط بین متغیرهای متعدد خیلی مفیدن. ماتریس همبستگی یکی از رایجترین کاربردهای Heatmap هست و صادقانه بگم، تقریباً توی هر پروژه تحلیل دادهای بهش نیاز پیدا میکنید:
np.random.seed(7)
n = 300
data_corr = pd.DataFrame({
'temperature': np.random.normal(25, 8, n),
'humidity': np.random.normal(60, 15, n),
'wind_speed': np.random.normal(12, 4, n),
'air_quality': np.random.normal(100, 30, n),
'energy_usage': np.random.normal(500, 100, n),
})
data_corr['energy_usage'] += data_corr['temperature'] * 8
data_corr['air_quality'] -= data_corr['wind_speed'] * 3
corr_matrix = data_corr.corr()
fig, axes = plt.subplots(1, 2, figsize=(15, 5), constrained_layout=True)
sns.heatmap(corr_matrix, annot=True, fmt='.2f', cmap='RdBu_r',
center=0, square=True, linewidths=1,
cbar_kws={'shrink': 0.8}, ax=axes[0])
axes[0].set_title('Correlation Matrix (Heatmap)', fontsize=13)
mask = np.triu(np.ones_like(corr_matrix, dtype=bool))
sns.heatmap(corr_matrix, mask=mask, annot=True, fmt='.2f',
cmap='coolwarm', center=0, square=True,
linewidths=1, ax=axes[1])
axes[1].set_title('Lower Triangle Correlation', fontsize=13)
plt.show()
تابع clustermap یه قدم فراتر میره و علاوه بر نمایش ماتریسی، خوشهبندی سلسلهمراتبی هم انجام میده. یعنی متغیرهای مشابه رو خودکار کنار هم قرار میده:
g = sns.clustermap(corr_matrix, annot=True, fmt='.2f',
cmap='vlag', center=0, linewidths=0.8,
figsize=(8, 8), dendrogram_ratio=0.15)
g.fig.suptitle('Clustered Correlation Matrix', y=1.02, fontsize=14)
plt.show()
رابط اعلانی seaborn.objects
از نسخه ۰.۱۲ به بعد، Seaborn یه رابط جدید به اسم seaborn.objects معرفی کرده که رویکرد اعلانی (Declarative) برای ساخت نمودار ارائه میده. اگه با ggplot2 در زبان R آشنا باشید، این رابط براتون خیلی آشنا خواهد بود:
import seaborn.objects as so
p = (
so.Plot(df, x='experience', y='salary', color='department')
.add(so.Dot(alpha=0.6, pointsize=5))
.add(so.Line(), so.PolyFit(order=2))
.label(
x='Years of Experience',
y='Monthly Salary',
color='Department',
title='Salary Trend by Experience and Department'
)
.layout(size=(10, 6))
)
p.show()
باید بگم این رابط هنوز در مرحله توسعه فعاله و ممکنه تو نسخههای بعدی تغییر کنه. ولی رویکردش واقعاً تمیز و خواناست. از نظر من، آینده مصورسازی در Seaborn همین رابطه.
ترکیب Matplotlib و Seaborn
یکی از نقاط قوت اکوسیستم مصورسازی پایتون اینه که این دو کتابخانه کاملاً با هم سازگارن. میتونید از Seaborn برای ترسیم سریع استفاده کنید و بعد با Matplotlib جزئیات رو تنظیم کنید:
fig, ax = plt.subplots(figsize=(10, 6))
sns.boxplot(data=df, x='department', y='salary',
palette='pastel', width=0.5, ax=ax)
sns.stripplot(data=df, x='department', y='salary',
color='#333333', size=3, alpha=0.4, jitter=True, ax=ax)
ax.set_title('Salary by Department (Detailed View)',
fontsize=14, fontweight='bold', pad=15)
ax.set_xlabel('Department', fontsize=12)
ax.set_ylabel('Monthly Salary (USD)', fontsize=12)
overall_mean = df['salary'].mean()
ax.axhline(y=overall_mean, color='#E53935', linestyle='--',
linewidth=1.5, alpha=0.8)
ax.text(3.6, overall_mean + 100, f'Overall Mean: ${overall_mean:,.0f}',
color='#E53935', fontsize=10, fontweight='bold')
ax.axhspan(overall_mean - 1500, overall_mean + 1500,
alpha=0.08, color='red', label='Mean +/- 1500')
ax.legend(loc='upper right')
ax.tick_params(axis='x', rotation=15)
plt.tight_layout()
plt.show()
تو این مثال، Seaborn نمودارهای جعبهای و نقطهای رو میسازه و بعد با Matplotlib عنوان، خط میانگین و ناحیه سایهدار اضافه شده. این ترکیب بهترین ویژگیهای هر دو کتابخونه رو بهتون میده و صادقانه بگم، تو پروژههای واقعی تقریباً همیشه از همین رویکرد ترکیبی استفاده میشه.
بهترین شیوهها و نکات حرفهای
بعد از سالها کار با این کتابخانهها، چند تا اصل هست که رعایتشون نمودارهاتون رو یه سطح بالاتر میبره:
| اصل | توضیح |
|---|---|
| انتخاب نمودار مناسب | برای مقایسه از میلهای، برای روند از خطی، برای توزیع از هیستوگرام و برای همبستگی از پراکندگی استفاده کنید |
| دسترسیپذیری رنگها | از پالتهای petroff10 یا tableau-colorblind10 استفاده کنید تا نمودار برای همه قابلخواندن باشه |
| سادگی | نمودار رو شلوغ نکنید. هر عنصر بصری باید هدفی داشته باشه |
| چیدمان مناسب | همیشه از constrained_layout=True استفاده کنید تا فاصلهگذاری خودکار انجام بشه |
| ذخیره باکیفیت | هنگام ذخیره فایل از DPI بالا استفاده کنید: plt.savefig('plot.png', dpi=300, bbox_inches='tight') |
برای ذخیره نمودارها با کیفیت بالا مناسب ارائه و انتشار:
fig, ax = plt.subplots(figsize=(10, 6))
sns.histplot(data=df, x='salary', hue='department', kde=True, ax=ax)
ax.set_title('Salary Distribution by Department')
plt.savefig('plot.png', dpi=300, bbox_inches='tight', facecolor='white')
plt.savefig('plot.svg', bbox_inches='tight', facecolor='white')
plt.savefig('plot.pdf', bbox_inches='tight', facecolor='white')
plt.show()
چند نکته تکمیلی دیگه که از تجربه میگم:
- همیشه محورها رو برچسبگذاری کنید و واحد اندازهگیری رو بنویسید — باورتون نمیشه چند بار دیدم نمودارهای بدون واحد باعث سوءتفاهم شدن
- از رنگهای معنادار استفاده کنید؛ مثلاً قرمز برای هشدار و سبز برای وضعیت مثبت
- برای مجموعه دادههای بزرگ، حتماً از
alpha(شفافیت) استفاده کنید تا نقاط روی هم دیده بشن - قبل از ارائه نهایی، نمودار رو به یه نفر که با دادهها آشنا نیست نشون بدید
- به اصول طراحی ادوارد تافتی توجه کنید: نسبت داده به جوهر رو بالا نگه دارید
پرسشهای متداول
تفاوت بین Matplotlib و Seaborn چیست؟
Matplotlib یه کتابخانه سطحپایین برای ترسیم نمودار در پایتونه که کنترل کامل روی تمام جزئیات بصری رو بهتون میده. Seaborn روی Matplotlib ساخته شده و یه لایه سطحبالاتر ارائه میده که نمودارهای آماری پیچیده رو با کد کمتر ممکن میسازه.
یه مثال ساده: Matplotlib مثل آجرهای ساختمانه — با صبر و حوصله هر چیزی میشه ساخت. Seaborn مثل بلوکهای پیشساختهست — سریعتر بالا میره ولی انعطاف کمتری داره. تو عمل، بیشتر تحلیلگرها از هر دو بهصورت ترکیبی استفاده میکنن.
آیا Seaborn جایگزین Matplotlib است؟
نه، اصلاً. Seaborn مکمل Matplotlib هست نه جایگزینش. Seaborn برای کار کردن به Matplotlib نیاز داره و تو پشت صحنه از اون استفاده میکنه. وقتی نمودار Seaborn رو میسازید، در واقع یه شیء Figure از Matplotlib ساخته میشه.
Seaborn برای نمودارهای آماری مثل توزیعها و ماتریس همبستگی عالیه، ولی برای سفارشیسازی دقیق و نمودارهای خاصتر همچنان به Matplotlib نیاز دارید.
کدام کتابخانه برای مبتدیان مناسبتر است؟
توصیه من اینه که اول مبانی Matplotlib رو یاد بگیرید. مفاهیم Figure و Axes و نحوه سفارشیسازی نمودار پایهای محکم ایجاد میکنه. بعد از اون، Seaborn رو یاد بگیرید تا بتونید نمودارهای آماری حرفهایتر رو سریعتر بسازید.
البته اگه فقط دنبال ترسیم سریع هستید و با Pandas کار میکنید، Seaborn نقطه شروع راحتتریه.
چگونه نمودارهای تعاملی در پایتون بسازیم؟
Matplotlib و Seaborn عمدتاً نمودارهای ایستا تولید میکنن. برای نمودارهای تعاملی (زوم، هاور، فیلتر و غیره) گزینههای دیگهای وجود داره:
- Plotly: محبوبترین گزینه برای نمودارهای تعاملی وب و داشبورد
- Bokeh: قدرتمند برای داشبوردهای تعاملی
- Altair: رابط اعلانی و ساده
همچنین بکاند %matplotlib widget تو Jupyter امکان تعامل محدودی با نمودارهای Matplotlib فراهم میکنه.
آیا Matplotlib از نمودارهای سهبعدی پشتیبانی میکند؟
بله! از طریق ماژول mpl_toolkits.mplot3d میتونید نمودارهای سهبعدی بسازید. با پارامتر projection='3d' هنگام ایجاد Axes، نمودارهای سطحی، پراکندگی سهبعدی و میلهای سهبعدی قابل ساختن:
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(10, 7))
ax = fig.add_subplot(111, projection='3d')
x = np.random.randn(200)
y = np.random.randn(200)
z = x * 2 + y + np.random.randn(200) * 0.5
ax.scatter(x, y, z, c=z, cmap='viridis', s=40, alpha=0.7)
ax.set_xlabel('X Axis')
ax.set_ylabel('Y Axis')
ax.set_zlabel('Z Axis')
ax.set_title('3D Scatter Plot Example')
plt.tight_layout()
plt.show()
البته برای نمودارهای سهبعدی تعاملی، Plotly تجربه کاربری بهتری ارائه میده چون امکان چرخوندن و زوم کردن نمودار با ماوس رو فراهم میکنه.