# ---
# jupyter:
#   jupytext:
#     text_representation:
#       extension: .py
#       format_name: light
#       format_version: '1.5'
#       jupytext_version: 1.14.4
#   kernelspec:
#     display_name: Python 3 (ipykernel)
#     language: python
#     name: python3
# ---

# # data-hub:
#
# *   [Website](https://data-hub.ir/)
# *   [Youtube](https://www.youtube.com/channel/UCrBcbQWcD0ortWqHAlP94ug)
# *   [Github](https://github.com/datahub-ir)
# *   Telegram Channel: @**data_hub_ir**
# *   Telegram Group:    **@data_jobs**

# + [markdown] colab_type="text" id="PqdtdLcGZdzy"
#
# <div dir='rtl' id="intro">
# <h2>
# مقدمه
#     </h2>
# </div> 
# <hr/>
# <br>
# <div dir='rtl'>
#     مصورسازی داده بخش مهمی از تجزیه و تحلیل داده است. مصورسازی به ما کمک می کند تا روابط بین متغیرها را بشناسیم و همچنین تشخیص دهیم کدام متغیرها مهم هستند یا می‌توانند در مقدار متغیر دیگری تاثیر بگذارند.
# </div>
# <br>
# <div dir='rtl'>کتابخانه <code>matplotlib</code> یکی از کتابخانه‌های ترسیم در زبان برنامه‌سازی پایتون است. مجموعه <code>matplotlib.pyplot</code> شامل توابعی است که به ما کمک می‌کنند با مشخص کردن بخش های اساسی یک نمودار، آن را رسم کنیم.</div>

# + [markdown] colab_type="text" id="dB0TvnlwZdz2"
# <div dir='rtl'>در این آموزش ما از مجموعه داده  <a href="http://fueleconomy.gov">mpg</a> استفاده می‌کنیم. این مجموعه شامل اطلاعات جمع‌آوری شده از ۲۳۴ خودرو است. ستون‌های این مجموعه داده عبارت‌اند از:</div>
#
#
# > * model: نام مدل
# > * displ: اندازه موتور
# > * year: سال ساخت
# > * cyl: تعداد سیلندر
# > * hwy: مسافت طی‌شده با یک گالن سوخت در بزرگراه
# > * cty: مسافت طی‌شده با یک گان سوخت در شهر
# > * fl: نوع سوخت
# > * class: کلاس ماشین

# + [markdown] colab_type="text" id="4Bq4vxIEZdz7"
# <div dir='rtl' id="installation">
#  <h2>
# نصب کتابخانه matplotlib
#     </h2>
# </div>
# <hr/>
# <br>
# <div dir='rtl'>برای نصب یا بروزرسانی کتاب‌خانه <code>matplotlib</code> می‌توانید دستور زیر را در محیط <code>command line</code> وارد کنید:</div>

# + [markdown] colab_type="text" id="6YCXxEf_Zdz9"
# ```bash
# pip install matplotlib
# ```
# -

# !python --version

# !pip install matplotlib

pip show matplotlib

# + [markdown] colab_type="text" id="-F6iIi2FZdz-"
#
# <div dir='rtl'>پس از اتمام فرایند نصب ، برای استفاده از آن لازم است کتاب‌خانه را به کد اضافه کنید؛ توجه داشته باشید برای سهولت استفاده، مخفف <code>plt</code> را برای فراخوانی <code>matplotlib.pyplot</code> تعریف می‌کنیم.</div>

# + colab={} colab_type="code" id="a1SivckAZd0A"
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# + [markdown] colab_type="text" id="v33_18jlZd0L"
#
# <div dir='rtl' id="plot">
#  <h2>
#     تابع plot
#     </h2>
# </div>
#
# -

x = np.linspace(0, 25, 250)

plt.plot(x, np.sin(x))
plt.plot(x, np.cos(x), '--')
plt.plot(x, np.cos(x)+.1)
plt.show()

plt.scatter(x[:10], x[:10]+2)
plt.show()

plt.scatter(x, np.sin(x))
plt.show()

#
# <div dir='rtl'>برای رسم هر تابع دلخواه می‌توان از تابع <code>plot</code> استفاده کرد. این تابع با ورودی گرفتن مجموعه مقادیر <code>x</code> و <code>y</code> تابعی را با استفاده از آن‌ها رسم می‌کند.
# در مثال زیر تابع <code>sin</code> در پنچاه نقطه در بازه‌ی $[-\pi, \; \pi]$ رسم شده است.</div>

# + colab={"base_uri": "https://localhost:8080/", "height": 265} colab_type="code" id="eIwOts-MZd0N" outputId="30fcb413-1453-43a2-e082-af1f170e9b11"
pi = np.pi
x = np.linspace(start=-pi, stop=pi, num=10)
y = np.sin(x)
plt.plot(x, y)
plt.show()

# + [markdown] colab_type="text" id="gflerBgzZd0S"
# <div dir='rtl'>برای نمایش نمودار از تابع <code>show</code> استفاده می‌کنیم.</div>
# <br>
# <div dir='rtl'>در نمودار زیر با تغییر پارامتر‌های <code>markersize</code>، <code>marker</code>، ‍<code>linewidth</code>، <code>linestyle</code> و <code>color</code> صورت‌های مختلف نمودار قبلی را رسم کنید.</div>
# <div dir='rtl'>پارامتر‌های <code>markersize</code>  و <code>linewidth</code> عدد طبیعی‌اند. همچنین در جدول زیر برخی از مقادیر ممکن برای پارامتر‌های <code>marker</code> و <code>linestyle</code> آمده است.</div>

# + [markdown] colab_type="text" id="tCwaJ7mXZd0T"
#
# | پارامتر    |مقدار |
# |:----------|:------------------:|
# | `marker`      |         '.'  '*'  '+' |
# | `linestyle`       |          '-'  '--'  '-.'  ':'         |
#

# + colab={"base_uri": "https://localhost:8080/", "height": 265} colab_type="code" id="9zSUmeevZd0V" outputId="95ac5e9b-b4c6-47f4-93fe-e0a3ae553e6a"
plt.plot(x, y, color='red', linewidth=1, linestyle=':', marker='+', markersize=10)
plt.show()

# + [markdown] colab_type="text" id="SwOI33KSZd0X"
# <div dir='rtl'>همان‌طور که احتمالا متوجه شدید با تعیین پارامتر <code>marker</code> می‌توان مکان دقیق داده‌ها را در نمودار نشان داد.</div>
# -

age = [21,12,32,45,37,18,28,52,5,40,48,15]
height = [160,135,170,165,173,168,175,159,105,171,155,158]

# +
# Set figure size
plt.figure(figsize=(12,6))

# Add a main title
plt.title("Plot of Age vs. Height (in cms)\n", fontsize=20, fontstyle='italic')

# X- and Y-label with fontsize
plt.xlabel("Age (years)", fontsize=16)
plt.ylabel("Height (cms)", fontsize=16)

# Turn on grid
plt.grid(True)

# Set Y-axis value limit
plt.ylim(100,200)

# X- and Y-axis ticks customization with fontsize and placement
plt.xticks([i*5 for i in range(12)], fontsize=15)
plt.yticks(fontsize=15)

# Main plotting function with choice of color, marker size, and marker edge color
plt.scatter(x=age, y=height, c='orange', s=150, edgecolors='k')

# Adding bit of text to the plot
plt.text(x=15, y=105, s="Height increaes up to around \n20 years and then tapers off", fontsize=15, 
         rotation=30, linespacing=2)
plt.text(x=22, y=185, s="Nobody has a height beyond 180 cm", fontsize=15)

# Adding a vertical line
plt.vlines(x=20, ymin=100, ymax=180, linestyles='dashed', color='blue', lw=3)

# Adding a horizontal line
plt.hlines(y=180, xmin=0, xmax=55, linestyles='dashed', color='red', lw=3)

# Adding a legend
plt.legend(['Height in cms'], loc=2, fontsize=14)

# Final show method
plt.show()

# + [markdown] colab_type="text" id="G5n1cXtxZd0Z"
# <div dir='rtl' id="scatterplot">
#  <h2>
# نمودار پراکندگی (scatter plot)
#     </h2>
# </div>
#
# <hr/>
# <br>
# <div dir='rtl'>در نمودار پراکندگی می‌توان داده‌ها را با استفاده از دو یا سه ویژگی عددی در دستگاه مختصات رسم کنیم. برای این کار از تابع <code>scatter</code> استفاده می‌کنیم.
#     <br>
# ابتدا مجموعه داده mpg را می‌خوانیم.</div>

# + colab={} colab_type="code" id="9hqHkQeaZ8R0"
mpg_csv = "mpg.csv"

# + colab={"base_uri": "https://localhost:8080/", "height": 204} colab_type="code" id="1XovJTBNZd0Z" outputId="e01eead9-49eb-4f7d-e7ae-e96691164462"
df = pd.read_csv(mpg_csv)
df.head()

# + [markdown] colab_type="text" id="fuvQnVG9Zd0c"
# <br>
# <br>
# <div dir='rtl'>به عنوان مثال نمودار پراکندگی مقدار مسافت طی‌شده با یک گالن سوخت (hwy) نسبت به اندازه موتور خودرو (displ) را رسم می‌کنیم.</div>
#

# + colab={"base_uri": "https://localhost:8080/", "height": 295} colab_type="code" id="azIDARniZd0f" outputId="1a09814e-9dc6-4bc9-b3ee-007f9ef5511d"
plt.scatter(x=df['displ'], y=df['hwy'], c='blue', alpha=0.4)
plt.title('hwy - displ')
plt.xlabel('displ')
plt.ylabel('hwy')
plt.show()

# + [markdown] colab_type="text" id="LKdfc7ZAZd0h"
# <br>
# <div dir='rtl'>برای استفاده از تابع <code>scatter</code> لازم است مقادیر هر بعد را مشخص نماییم. از طرفی با استفاده از پارامتر <code>alpha</code> میزان شفافیت هر نشان را مشخص می‌کنیم. بنابراین در مکان‌هایی که نشان پررنگ‌تر است، در واقع داده‌های بیشتری رو هم قرار گرفته‌اند.
# برای تعیین عنوان نمودار از تابع <code>title</code> و برای نام‌گذاری محور‌ها از توابع <code>xlabel</code> و  <code>ylabel</code> استفاده می‌کنیم.</div>
# <br>
# <br>

# +
rng = np.random.RandomState(0)
colors = rng.rand(len(df))
sizes = 1000 * rng.rand(len(df))

#size متناسب با بزرگی اعداده
plt.scatter(x=df['displ'], y=df['hwy'], c=colors, s=sizes, alpha=0.3,
            cmap='viridis')
plt.colorbar()

# + [markdown] colab_type="text" id="FyzJAl3XZd0i"
# <div dir='rtl'>حال می‌خواهیم با استفاده از ویژگی تعداد سیلندر داده‌ها را رنگ کنیم.</div>
# -

df.head()

# + colab={"base_uri": "https://localhost:8080/", "height": 295} colab_type="code" id="CWvuQUBFZd0j" outputId="1f28a2cf-07ac-48d5-be5d-c03670e703bc"
plt.scatter(x=df['displ'], y=df['hwy'], c=df['cyl'],alpha=0.5)
plt.title('hwy - displ')
plt.xlabel('displ')
plt.ylabel('hwy')
plt.colorbar()
plt.show()

# + [markdown] colab_type="text" id="oKNYsScbZd0l"
# <div dir='rtl'>به کمک تابع colorbar می‌توانیم طیف رنگ را نمایش دهیم. همان طور که انتظار داشتیم، خودرو‌های با تعداد سیلندر بیشتر مصرف سوخت بیشتری دارند.</div>
# <br>
# <br>
# -

# In Matplotlib, the figure (an instance of the class plt.Figure) can be thought of as a single container that contains all the objects representing axes, graphics, text, and labels. The axes (an instance of the class plt.Axes) is what we see above: a bounding box with ticks and labels, which will eventually contain the plot elements that make up our visualization. Throughout this book, we'll commonly use the variable name fig to refer to a figure instance, and ax to refer to an axes instance or group of axes instances.

# +
fig = plt.figure()
ax = plt.axes()

x = np.linspace(0, 10, 1000)
ax.plot(x, np.sin(x))
# -

# Alternatively, we can use the pylab interface and let the figure and axes be created for us in the background
# (see [Two Interfaces for the Price of One](04.00-Introduction-To-Matplotlib.ipynb#Two-Interfaces-for-the-Price-of-One) for a discussion of these two interfaces):

plt.plot(x, np.sin(x))

x = np.linspace(0, 10, 1000)
fig, ax = plt.subplots()
ax.plot(x, np.sin(x), '-b', label='Sine')
ax.plot(x, np.cos(x), '--r', label='Cosine')
ax.axis('equal')
leg = ax.legend()

ax.legend(loc='upper left', frameon=False)
fig

ax.legend(frameon=False, loc='lower center', ncol=2)
fig

# + [markdown] colab_type="text" id="mxvWzLnvZd0l"
# <div dir='rtl' id="3D">
#  <h2>
# نمودار سه‌بعدی
#     </h2>
# </div>
#
# <hr/>
# <br>
#
# <div dir='rtl'>در این بخش مجموعه دادگان mpg را با استفاده از سه ویژگی عددی در دستگاه مختصات رسم می‌کنیم. به این منظور از ابزار <code>mplot3d</code> در کنار <code>matplotlib</code> استفاده می‌کنیم.</div>

# + colab={"base_uri": "https://localhost:8080/", "height": 248} colab_type="code" id="W585be9aZd0l" outputId="347745c5-38e7-4e2e-ba30-585c0aa81906"
from mpl_toolkits import mplot3d
fig = plt.figure()
ax = plt.axes(projection='3d')
ax.scatter3D(df['displ'], df['hwy'], df['cyl'])
plt.show()
# -

ax = plt.axes(projection='3d')
ax.scatter3D(df['displ'], df['hwy'], df['cyl'], c=df['cyl'])
plt.show()

# + [markdown] colab_type="text" id="PtrpUW1oZd0n"
# <div dir='rtl'>همان‌طور که مشاهده‌ می‌شود با اضافه کردن ویژگی تعداد سیلندر داده‌ها به خوبی خوشه‌بندی شده‌اند.</div>
# <br>
# <br>
# -

fig.savefig('my_figure.png')

# + [markdown] colab_type="text" id="IZXyaXNEZd0n"
# <div dir='rtl' id="barplot">
#   <h2>
# نمودار میله‌ای (bar plot)
#      </h2>
# </div>
# <hr/>
# <br>
# <div dir='rtl'>با استفاده از این نمودار می‌توان کمیت عددی مربوط به مقادیر متفاوت یک کمیت دسته‌ای را نمایش داد و با هم مقایسه کرد.</div>

# + colab={"base_uri": "https://localhost:8080/", "height": 279} colab_type="code" id="_Ik5KGUvZd0o" outputId="07983cef-9567-44fa-ce80-1555c74b6c9b"
groups = ['G1', 'G2', 'G3', 'G4', 'G5']
scores = [20, 34, 30, 32, 27]
bar_width = 0.3
plt.bar(groups, scores, width=bar_width, color='black')
plt.xlabel('Groups')
plt.ylabel('Scores')
plt.show()

# + [markdown] colab_type="text" id="Ev3ryF3xZd0p"
# <br>
# <div dir='rtl'>در نمودار میله‌ای بعد میانگین hwy و cty را برای کلاس‌های متفاوت خودرو‌ها به صورت همزمان نشان می‌دهیم.</div>
# -

df['class'].unique()

# + colab={"base_uri": "https://localhost:8080/", "height": 265} colab_type="code" id="DKqqZ_p_Zd0q" outputId="49e05b77-970b-4757-9fed-1d6093a07c3a"
classes = df['class'].unique()
barwidth = 0.3
cty_mean = []
hwy_mean = []
for x in classes:
    cty_mean.append(df[df['class'] == x]['cty'].mean())
    hwy_mean.append(df[df['class'] == x]['hwy'].mean())
# -

index = pd.factorize(classes)[0] + 1
index

plt.bar(index, cty_mean, barwidth, color='black', label='mean city miles per gallon')
plt.legend()
plt.show()

plt.bar(index, cty_mean, barwidth, color='black', label='mean city miles per gallon')
plt.legend()
plt.xticks(index, classes)
plt.show()

plt.bar(index, hwy_mean, barwidth, color='red', label='mean highway miles per gallon')
plt.legend()
plt.xticks(index, classes)
plt.show()

plt.bar(index, cty_mean, barwidth, color='black', label='mean city miles per gallon')
plt.bar(index + barwidth, hwy_mean, barwidth, color='purple', label='mean highway miles per gallon')
plt.xticks(index + barwidth / 2, classes)
plt.legend()
plt.show()

# + [markdown] colab_type="text" id="vloc3yxZZd0r"
# <div dir='rtl'>تابع <code>xticks</code> با گرفتن مکان دسته‌ها و نامشان، آن‌ها را روی محور x نمایش می دهد.
# هنگامی که چند نمودار را در یک شکل رسم می‌کنیم، می‌‌توان با تعیین پارامتر <code>label</code> برای نمودار‌ها و فراخوانی تابع <code>legend</code>، برچسب تعیین شده برای هر نمودار را در شکل نشان دهیم.
# دقت کنید در این شکل ما دو نمودار را به صورت همزمان به تصویر کشیدیم. در حالت کلی می‌توانیم تعداد دلخواهی نمودار با نوع مطلوب در یک شکل رسم کنیم.</div>
# <br>
# <br>
# -

# ### Histogram

weight = [55,35,77,68,70,60,72,69,18,65,82,48]

import numpy as np
plt.figure(figsize=(5,5))
# Main plot function 'hist'
plt.hist(weight, color='red', edgecolor='k', alpha=0.75, bins=7)
plt.title("Histogram of patient weight", fontsize=18)
plt.xlabel("Weight in kgs", fontsize=15)
plt.xticks(fontsize=15)
plt.yticks(fontsize=15)
plt.show()

# + [markdown] colab_type="text" id="yyfoO9mxZd0s"
# <div dir='rtl' id="boxplot">
#   <h2>
# نمودار جعبه‌ای (box plot)
#      </h2>
# </div>
#
# <hr/>
# <br>
# <div dir='rtl'>در نمودار جعبه‌ای خلاصه‌ای از دادگان شامل کمینه، چارک اول، میانه، چارک سوم و بیشینه نمایش داده می‌شود.</div>
# <br>
#
# <br>
# <br>

# + [markdown] colab_type="text" id="M9Ign8a9Zd0s"
# <div dir='rtl'>در کد زیر از توابع تعریف شده روی dataframe برای کشیدن نمودار استفاده شده است. برای مطالعه‌ی بیشتر می‌توانید به این <a href="https://pandas.pydata.org/pandas-docs/stable/reference/frame.html#plotting">لینک</a> مراجعه کنید.</div>
# -

df.describe()

# + colab={"base_uri": "https://localhost:8080/", "height": 265} colab_type="code" id="R2QHEaBhZd0s" outputId="c747f8e5-d2cb-4924-a245-7d83c36a2092"
plt.style.use('ggplot')
df.boxplot(column=['cty', 'hwy'],showmeans=True)
plt.show()

# + [markdown] colab_type="text" id="i38zbKFRZd0v"
# <br>
# <br>
# <div dir='rtl'>در نمودار زیر داده‌ها ابتدا بر حسب ویژگی class گروه‌بندی شده‌اند، سپس نمودار جعبه‌ای برای هر دسته رسم شده است.</div>

# + colab={"base_uri": "https://localhost:8080/", "height": 301} colab_type="code" id="J33CuBE9Zd0w" outputId="643534ef-b071-41ab-b16b-c8a53aec3b6d"
df.boxplot(column=['hwy'], by='class')
plt.show()
# -

# ## Pandas DataFrames support some visualizations directly!

df.plot.scatter('displ', 'hwy')
plt.show()

df['hwy'].plot.hist(bins=5,figsize=(5,5),edgecolor='k')
plt.xlabel('hwy percentage')
plt.show()





StarcoderdataJupyterScriptsDedupFiltered