مصورسازی تعاملی با پلاتلی (Plotly)

196

مصورسازی یکی از کارهای اساسی در علوم داده و هوش مصنوعی است. در تحلیل داده به‌عنوان نخستین گام به مصورسازی خواهیم پرداخت تا به درک شهودی از داده‌ برسیم و حتی گاهاً الگوهای جالب و مفید برقرار در میان داده را کشف کنیم. در هوش مصنوعی نیز در مراحل مختلفی با مصورسازی مواجه هستیم که از جمله رایج‌ترین آن‌ها می‌توان به مصورسازی روند یادگیری و عملکرد مدل، رسم نمودارهای گوناگون از معیارهای ارزیابی و نمایش ماتریس درهم‌ریختگی اشاره کرد. پلاتلی (plotly) یک کتابخانه‌ی متن‌بازِ قدرتمند است که می‌توانید از آن به‌منظور تولید مصورسازی‌های زیبا، قابل‌فهم، باکیفیت و مهم‌تر از همه تعاملی بهره ببرید. اگر تاکنون با کتابخانه‌های رایج مصورسازی کار کرده باشید، می‌دانید که خروجی آن‌ها صرفاً یک تصویر ایستا است و در بسیاری از مواقع ممکن است به دلیل خوانایی ضعیف نمودار خروجی، نیاز باشد به‌صورت دستی اندازه‌ی اجزای نمودارهای خود را تنظیم کنید. اما در پلاتلی (Plotly) مصورسازی شما کاملاً تعاملی (interactive) بوده و حتی می‌توانید در میان داده‌های خود چرخ بزنید! در این مقاله با امکانات بی‌نظیر این کتابخانه بیشتر آشنا شده و همراه با مثال به مصورسازی چندین نمودار پرکاربرد در علوم داده خواهیم پرداخت.

ممکن است علاقه‌مند باشید: هوش مصنوعی (Artificial Intelligence) چیست؟

پلاتلی (plotly)

پلاتلی یک کتابخانه‌ی مصورسازی متن‌باز و رایگان است که از آن می‌توان جهت رسم بیش از 40 نوع نمودار مختلف در دامنه‌های گوناگون استفاده کرد و حتی امکان ترسیم در فضای سه‌بعدی را فراهم می‌کند. این کتابخانه برای زبان‌های برنامه‌نویسی مختلفی از جمله پایتون (Python)، متلب (Matlab)، جولیا (Julia) و آر (R) توسعه یافته و آزادانه در دسترس است. جالب است بدانید این کتابخانه در زبان‌های برنامه‌نویسی مختلف بر بستر اصلی جاوااسکریپت (plotly.js) طراحی شده و به‌عنوان مثال هرچند شما به زبان پایتون کد می‌نویسید، اما نهایتاً مصورسازی شما برپایه‌ی وب و به‌صورت جاوااسکریپت خواهد بود. همین امر باعث شده تا مصورسازی‌های تولیدی توسط پلاتلی (Plotly) از قابلیت تعاملی بهره‌مند باشند و بتوانید آن‌ها را در ژوپیتر نت‌بوک نمایش دهید، به‌عنوان فایل html ذخیره کنید یا حتی از آن‌ها در وب‌اپلیکیشن‌های خود بهره ببرید.

اما اصلی‌ترین پرسشی که پیش می‌آید این است که با توجه به وجود بسیاری از کتابخانه‌های مصورسازی دیگر همچون matplotlib ،seaborn و bokeh چرا باید به سراغ پلاتلی برویم؟ از مهم‌ترین مزیت‌های پلاتلی که باعث می‌شود هر تحلیل‌گر داده‌ای به پلاتلی روی آورد می‌توان به موارد زیر اشاره کرد:

  • مصورسازی‌های پلاتلی به‌صورت تعاملی هستند، به این معنی که می‌توانید پس از تولید نمودار نیز کارهای مختلفی را روی آن انجام دهید. به‌عنوان مثال بخشی از نمودار را انتخاب کنید، به قسمتی بزرگ‌نمایی یا کوچک‌نمایی کنید، اطلاعات هر جزء را مشاهده کنید و کارهای دیگری مانند این‌ها که در مثال‌های این مقاله مشاهده خواهید کرد.
  • شما می‌توانید از نمودار خود خروجی فایل html تولید کنید و حتی اگر خواستید آن را به همان شکل تعاملی در وب‌سایت خود به نمایش درآورید.
  • نمودارهای ترسیم‌شده از نظر کیفیت تصویر و زیبایی بسیار مطلوب هستند و می‌توانید بدون نگرانی از آن‌ها در مقالات علمی خود بهره ببرید.
  • رسم نمودارهای رایج به کمک یک پکیج سطح بالا از پلاتلی بسیار راحت شده و در تنها چند خط کد انجام می‌شود.
  • مستندات موجود در وب‌سایت پلاتلی بسیار کامل و همراه با مثال‌های متعدد است.

اما به‌جای تعریف‌های بیشتر اجازه دهید شروع به ترسیم نمودارهای مختلف با پلاتلی (Plotly) کرده و قابلیت‌های آن را در عمل مشاهده کنیم. جهت آشنایی کامل با هرکدام از انواع نمودارها و همچنین تسلط بر کتابخانه‌های مصورسازی پایه که از آن‌ها یاد شد، می‌توانید از «دوره یادگیری ماشین | تحلیل داده با پایتون» در کوئرا کالج بهره ببرید.

نصب پلاتلی (Plotly) پایتون

پلاتلی را می‌توانید به کمک pip با دستور زیر در محیط پایتون خود نصب کنید:

pip install plotly

در محیط conda نیز می‌توانید از دستور زیر استفاده کنید:

conda install -c plotly

تفاوت پلاتلی Express و Go

در پلاتلی دو پکیج متفاوت با نام‌های Express و Go وجود دارد. Plotly Express یک رابط سطح بالا از پلاتلی است تا به کمک آن بتوانید به‌سادگی و با حداقل خط کد ممکن نسبت به تولید مصورسازی‌های رایج اقدام کنید. اما اگر قصد مصورسازی‌های پیچیده‌تر یا اعمال سلیقه‌ی خود بر روی نمودارها را داشته باشید، باید به سراغ پکیج دیگر یعنی Plotly Go بروید که رابط سطح پایین حساب می‌شود. در این حالت نیاز به کدنویسی بیشتری خواهید داشت، اما دست شما برای هر تغییری کاملاً باز خواهد بود و از این بابت می‌توان پلاتلی‌گو را به کتابخانه‌ی matplotlib و پلاتلی‌اکسپرس را به seaborn تشبیه کرد.

به‌منظور واردسازی پلاتلی‌گو در پایتون می‌توانید از کد زیر استفاده کنید:

import plotly.graph_objects as go

واردسازی پلاتلی‌اکسپرس نیز به کمک کد زیر انجام خواهد گرفت:

import plotly.express as px

در ادامه نمونه‌هایی از رسم نمودارهای گوناگون در پلاتلی به کمک هر دو رویکرد معرفی‌شده را مطالعه خواهیم کرد.

دادگان

برخی از دادگان‌های مرسوم در تحلیل داده داخل کتابخانه‌ی پلاتلی گنجانده شده‌اند که لیست کامل آن‌ها را می‌توان در این سند مشاهده کرد. در مثال‌هایی که در ادامه آورده شده است از همین دادگان‌ها استفاده خواهیم کرد. لازم به ذکر است جهت واردسازی این مجموعه‌های داده باید از پلاتلی‌اکسپرس کمک بگیریم. به‌عنوان مثال جهت بارگیری دادگان مشهور gapminder می‌توان از کد زیر استفاده کرد:

df = px.data.gapminder()

لینک فایل نت‌بوک کدها و همچنین لینک مشاهده‌ی مستقیم هر نمودار به‌صورت تعاملی در انتهای این مقاله قرار داده شده است.

نمودار میله‌ای (Bar chart)

هنگامی که قصد داشته باشیم مقادیر یک ویژگی دسته‌ای را با یک ویژگی عددی مقایسه کنیم،‌ نمودارهای میله‌ای یکی از بهترین گزینه‌های ممکن مصورسازی هستند. فرض کنیم مشغول به کار بر روی دادگان gapminder هستیم و قصد داریم نمودار میله‌ای میانگین امید به زندگی هر کشور را ترسیم کنیم. برای این کار کافیست از متد px.bar کمک گرفته و دیتافریم مربوط به دادگان و نام ویژگی‌هایی (ستون‌هایی) که باید به‌عنوان اطلاعات محور افقی و عمودی استفاده شوند را برای آن مشخص کنیم.

نکته: رایج است که ورودی پلاتلی از جنس دیتافریم پانداس (pandas) باشد و دادگان‌های موجود در پلاتلی نیز از همین جنس هستند. در کدهایی که بررسی خواهید کرد نیز از توابع پانداس گوناگونی جهت آماده‌سازی داده موردنیاز هر نمودار استفاده شده است. بنابراین اگر با پانداس و توابع آن آشنایی ندارید پیشنهاد می‌کنیم به «دوره یادگیری ماشین | تحلیل داده با پایتون» کوئرا کالج مراجعه فرمایید.

df1 = df.groupby('country', as_index=False)['lifeExp'].agg('mean')

fig = px.bar(df1, x='country', y='lifeExp',
             title='Average life expectancy of each country')
fig.show()
نمودار میله‌ای در پلاتلی (Plotly)

هیستوگرام (Histogram)

به‌منظور مصورسازی توزیع داده‌های عددی می‌توانیم از نمودار معروف هیستوگرام استفاده کنیم. در پلاتلی به کمک px.histogram می‌توان به‌راحتی هیستوگرام یک دیتافریم برای یک ویژگی را ترسیم کرد. این‌بار فرض کنید قصد داریم هیستوگرام امید به زندگی کل دادگان را ترسیم کرده و مشاهده کنیم هر بازه‌ی سنی در میان داده‌ها چندبار تکرار شده است. کد و تصویر متحرک خروجی در زیر آورده شده است.

fig = px.histogram(df, x='lifeExp', nbins=12, color='continent')
fig.show()

توجه داشته باشید در اینجا آرگومان nbins به معنی تعداد بازه‌های موردنظر است و آرگومان color نیز نام یک ستون را می‌پذیرد. وقتی color را معادل contintent تنظیم کرده‌ایم به این معنی است که رنگ هر بخش با توجه به قاره‌ی آن تعیین شود. به‌عنوان مثال در بازه‌ی سنی 30 تا 35، فقط داده‌هایی از قاره‌های آفریقا و آسیا و به‌ترتیب با تعداد 25 و 6 حضور داشته‌اند.

هیستوگرام در پلاتلی

نمودار دایره‌ای (Pie chart)

به کمک نمودار دایره‌ای (کلوچه‌ای) نیز می‌توان یک مصورسازی زیبا از تعداد آیتم‌های هر دسته تولید کرد. این‌بار بگذارید به کمک پلاتلی‌گو نمودار خود را ترسیم کنیم. در این نمودار قصد داریم سهم هر قاره از تعداد کشورهای جهان را ترسیم کنیم، به این معنی که مثلاً چند درصد از کشورهای جهان متعلق به قاره‌ی آسیا هستند. با فراخوانی go.Figure یک شیء گرافیکی پلاتلی ساخته می‌شود و در آرگومان data می‌توانیم لیستی از اجزای ترسیم مختلف را مشخص کنیم. در اینجا فقط یک نمودار دایره‌ای می‌خواهیم که با go.Pie ساخته می‌شود.

df2 = df.groupby(['continent', 'country']).size()
df2 = df2.to_frame(name = 'count').reset_index()

fig = go.Figure(
    data=[
        go.Pie(labels=df2['continent'], values=df2['count'])
    ])
fig.show()
نمودار دایره‌ای در پلاتلی (Plotly)

نمودار نقطه‌ای (Scatter plot)

نمودار نقطه‌ای یک انتخاب کاربردی جهت مصورسازی ارتباط دو ویژگی عددی است. فرض کنیم می‌خواهیم ارتباط میانگین تولید ناخالص داخلی سرانه‌ی هر کشور با میانگین امید به زندگی در آن را بر روی یک نمودار نقطه‌ای نشان دهیم. برای این کار می‌توان از go.Scatter پلاتلی استفاده کرد. لازم به ذکر است که در کد زیر،‌ text=df4['country'] به این دلیل نوشته شده که هروقت موس خود را به روی نقطه‌ای بردیم، نام کشور مربوط به آن نیز نمایش داده شود. در اینجا نحوه‌ی کد نوشتن‌مان برای پلاتلی نیز فرق کرده است؛ ابتدا یک شیء گرافیکی ساخته و سپس نمودار خود را به آن اضافه کرده‌ایم و در نهایت نیز اجزای کلی نمودار مانند عنوان محورهای افقی و عمودی را مشخص کرده‌ایم.

نمودار نقطه‌ای در پلاتلی
df3 = df.groupby('country', as_index=False)['gdpPercap'].agg('mean')
df4 = pd.merge(df1, df3)

fig = go.Figure()
fig.add_trace(
    go.Scatter(
        x=df4['gdpPercap'],
        y=df4['lifeExp'],
        mode='markers',
        text=df4['country']
    ))
fig.update_layout(xaxis_title='Per-capita GDP (Gross domestic product)',
                  yaxis_title='Life expectancy at birth')

نمودار خطی (Line plot)

از نمودارهای خطی معمولاً جهت نمایش تغییرات یک متغیر عددی در طول زمان یا بازه‌های مختلف استفاده می‌شود. به عنوان مثال فرض کنیم قصد داریم تغییرات متوسط امید به زندگی در هر قاره را طبق سال‌های مختلف ترسیم کنیم. بدین منظور می‌توان از px.Line یا go.Scatter استفاده کرد. از هرکدام این رویکردها که استفاده کنید خروجی مشابهی خواهید داشت، اما نوشتن کد با پلاتلی‌اکسپرس تنها در یک خط انجام می‌شود. تفاوت میزان کد لازم برای هر دو رویکرد را می‌توانید در زیر مشاهده کنید.

نکته: درست است که از go.Scatter در مثال پیشین جهت رسم نمودار نقطه‌ای استفاده کردیم، اما توجه داشته باشید در صورتی که آرگومان mode را بر روی marker تنظیم نکنید، این نمودار به‌صورت پیش‌فرض به شکل خطی نمایش داده خواهد شد.

df5 = df.groupby(['year', 'continent'], as_index=False)['lifeExp'].agg('mean')

fig = px.line(df5, x='year', y='lifeExp', color='continent', markers=True)
fig.show()
df5 = df.groupby(['year', 'continent'], as_index=False)['lifeExp'].agg('mean')

fig = go.Figure()
for continent in df5['continent'].unique():
    fig.add_trace(
        go.Scatter(
            x=df5[df5['continent']==continent]['year'],
            y=df5[df5['continent']==continent]['lifeExp'],
            name=continent
        ))
fig.update_layout(xaxis_title='Year',
                  yaxis_title='lifeExp')
نمودار خطی در پلاتلی (Plotly)

نمودار نقطه‌ای سه‌بعدی (3D Scatter plot)

یکی از جذاب‌ترین قابلیت‌های پلاتلی امکان مصورسازی در فضای سه‌بعدی است. این بار فرض کنید می‌خواهیم ارتباط بین میانگین تولید ناخالص داخلی و میانگین امید به زندگی هر قاره را بر اساس سال‌ها ترسیم کنیم. برای این کار می‌توان از px.scatter_3d استفاده کرده و ویژگی‌هایی که باید به‌عنوان محورهای طولی، عرضی و ارتفاع استفاده شوند را به‌ترتیب در پارامترهای y ، x و z مشخص کنیم. همچنین می‌توانیم با تنظیم مقدار 'continent' برای آرگومان color، رنگ هر نقطه را با توجه به قاره‌ی آن تعیین کنیم تا داده‌های مربوط به هر قاره قابل‌تفکیک باشند.

df6 = df.groupby(['year', 'continent'], as_index=False)[['lifeExp', 'gdpPercap']].agg('mean')

fig = px.scatter_3d(df6, x='gdpPercap', y='lifeExp', z='year', color='continent')
fig.show()
نمودار نقطه‌ای سه‌بعدی پلاتلی

خروجی HTML

همان طور که در ابتدای مقاله اشاره کردیم، یک قابلیت جالب و بسیار کاربردی دیگر پلاتلی، امکان ذخیره‌ی نمودارهای تولید‌شده بر بستر وب و به‌صورت فایل html است. این کار به‌راحتی و با دستور write_html انجام می‌گیرد.

fig.write_html("file_name.html")

در این مقاله با نحوه‌ی ترسیم چند نمونه از مهم‌ترین نمودارها در پلاتلی آشنا شدیم،‌ اما نمودارهای متنوعی در پلاتلی وجود دارد که با توجه به دادگان خود می‌توانید به استفاده و سفارشی‌سازی آن‌ها اقدام کنید. انواع نمودارهای مختلفی که می‌توان با پلاتلی ترسیم کرد و مثال‌های آن‌ها را می‌توانید در این صفحه مشاهده کنید.

علاوه بر این، رویکردهای متفاوتی از کد زدن پلاتلی را مشاهده کردیم و کافیست بر همین اساس کد خود را نوشته و با تنظیم آرگومان‌های مختلف، به تولید نمودارهایی مطابق با سلیقه‌ی خود بپردازید. مستندات مربوط به توابع مختلف پلاتلی را نیز می‌توانید از این لینک مطالعه کنید.

لینک‌های مفید:

پارسا عباسی

ممکن است علاقه‌مند باشید
تاریخچه جنگو
گزارش دومین رویداد SkillUp با موضوع فرانت‌اند
مسابقه الگوریتمی شماره ۴۴ (آموزشی)
اشتراک در
اطلاع از
guest
0 دیدگاه‌
بازخورد (Feedback) های اینلاین
View all comments