قسمت سوم – نمایش نمودار Bar Chart در Matplotlib

در این مثال ، ما می خواهیم داده های یک فایل اکسل که شامل مشتری ، تعداد خرید و مبلغ خرید هست را بر روی یک Bar Chart نمایش دهیم و می خواهیم حاصل ضرب تعداد خرید در مبلغ خرید را حساب و بر روی نمودار قرار دهیم ، طبیعتا مشتری های ما چندین بار از ما خرید کرده اند پس باید داده ها گروه بندی نیز شوند همچنین طبق مثاله های قبلی برای نمایش درست فارسی از کتابخانه های دیگر نیز استفاده کرده ایم .

برای دریافت فایل مثال می توانید از این لینک استفاده کنید.

برای پیاده سازی آن ما از قطعه کد زیر استفاده کرده ایم که در ادامه به شرح آن می پردازیم

import pandas as pd
import matplotlib.pyplot as plt
from bidi.algorithm import get_display
import arabic_reshaper

# تابع برای بازسازی و مرتب‌سازی متن‌های فارسی
def reshape_text(text):
    reshaped_text = arabic_reshaper.reshape(text)  # بازسازی متن فارسی
    return get_display(reshaped_text)  # مرتب‌سازی بصری برای نمایش صحیح

# خواندن داده‌ها از فایل اکسل
filename = "data.xlsx"  # نام فایل اکسل
data = pd.read_excel(filename)

# محاسبه مجموع مبلغ خرید (مبلغ خرید × تعداد خرید) و گروه‌بندی بر اساس مشتری
data["مجموع مبلغ خرید"] = data["مبلغ خرید"] * data["تعداد خرید"]
grouped_data = data.groupby("مشتری").agg({"مجموع مبلغ خرید": "sum"}).reset_index()

# بازسازی متن‌های فارسی در ستون "مشتری"
grouped_data["مشتری"] = grouped_data["مشتری"].apply(reshape_text)

# رسم نمودار
plt.figure(figsize=(12, 7))
index = range(len(grouped_data))

# رسم ستون‌ها
bars = plt.bar(index, grouped_data["مجموع مبلغ خرید"], width=0.6, label=reshape_text("مجموع مبلغ خرید"))

# اضافه کردن مقادیر بالای ستون‌ها
for bar in bars:
    height = bar.get_height()
    plt.text(bar.get_x() + bar.get_width() / 2, height + 1, f"{int(height):,}", ha="center", fontsize=10)

# تنظیمات نمودار
plt.xlabel(reshape_text("مشتری"), fontsize=12)
plt.ylabel(reshape_text("مجموع مبلغ خرید (ریال)"), fontsize=12)
plt.title(reshape_text("مجموع مبلغ خرید هر مشتری"), fontsize=14)
plt.xticks(index, grouped_data["مشتری"], fontsize=10, rotation=45)
plt.legend()

# بهبود فاصله‌ها و نمایش نمودار
plt.tight_layout()
plt.show()
  1. وارد کردن کتابخانه‌ها
import pandas as pd
import matplotlib.pyplot as plt
from bidi.algorithm import get_display
import arabic_reshaper

pandas (pd) : برای پردازش داده‌ها، خواندن فایل‌های اکسل، و انجام عملیات‌های محاسباتی روی داده‌ها.

matplotlib.pyplot (plt): برای رسم نمودار.

bidi.algorithm.get_display :برای نمایش متن‌های فارسی به صورت صحیح در گرافیک.

arabic_reshaper : برای بازسازی متن‌های فارسی و حل مشکلات نمایش حروف فارسی.

  1. تابع برای بازسازی و مرتب‌سازی متن‌های فارسی
def reshape_text(text):
    reshaped_text = arabic_reshaper.reshape(text)  # بازسازی متن فارسی
    return get_display(reshaped_text)  # مرتب‌سازی بصری برای نمایش صحیح

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

  1. خواندن داده‌ها از فایل اکسل
filename = "data.xlsx"  # نام فایل اکسل
data = pd.read_excel(filename)

با استفاده از ()pd.read_excel، داده‌ها از فایل اکسل به یک DataFrame وارد می‌شود.

این داده‌ها ممکن است شامل اطلاعاتی مثل “مشتری”، “مبلغ خرید”، “تعداد خرید” و غیره باشند.

  1. محاسبه مجموع مبلغ خرید و گروه‌بندی بر اساس مشتری
data["مجموع مبلغ خرید"] = data["مبلغ خرید"] * data["تعداد خرید"]
grouped_data = data.groupby("مشتری").agg({"مجموع مبلغ خرید": "sum"}).reset_index()

محاسبه مجموع مبلغ خرید:

یک ستون جدید به نام “مجموع مبلغ خرید” اضافه می‌شود که در آن مبلغ خرید ضرب در تعداد خرید شده است.

این کار با استفاده از ضرب دو ستون “مبلغ خرید” و “تعداد خرید” انجام می‌شود.

گروه‌بندی داده‌ها:

داده‌ها با استفاده از groupbyمشتری بر اساس ستون “مشتری” گروه‌بندی می‌شود.

سپس با استفاده از   aggمجموع مجموع مبلغ خرید برای هر مشتری محاسبه می‌شود.

()reset_index به این منظور استفاده می‌شود که ایندکس گروه‌بندی شده به یک ستون معمولی تبدیل شود و ایندکس جدیدی به DataFrame اختصاص یابد.

در پایتون و کتابخانه پانداس، متد .()reset_index برای بازنشانی ایندکس (شاخص) یک DataFrame استفاده می‌شود. وقتی یک DataFrame از عملیات‌هایی مثل گروه‌بندی (groupby) یا فیلتر کردن به دست می‌آید، ممکن است ایندکس آن تغییر کند. با استفاده از .()reset_index، ایندکس جدیدی به DataFrame اختصاص داده می‌شود و ایندکس قبلی، اگر اطلاعات مهمی داشته باشد، به یک ستون جدید منتقل می‌شود. در واقع یک ایندکس عددی جدید (۰، ۱، ۲، …) به DataFrame اختصاص می‌دهد و به جای اینکه ستون مشتری را به عنوان ایندکس در نظر بگیرد ،  ایندکس “مشتری” را بازنشانی می‌کند و آن را به یک ستون معمولی تبدیل می‌کند.

  1. بازسازی متن‌های فارسی در ستون “مشتری”
grouped_data["مشتری"] = grouped_data["مشتری"].apply(reshape_text)

این کد برای بازسازی و مرتب‌سازی متن‌های فارسی در ستون “مشتری” استفاده می‌شود تا مطمئن شویم که متن‌های فارسی به درستی نمایش داده می‌شوند.

  1. رسم نمودار
plt.figure(figsize=(12, 7))
index = range(len(grouped_data))

در ابتدا سایز نمودار را تنظیم می کنیم (عرض ۱۲ و ارتفاع ۷). در ادامه یک فهرست از ایندکس‌ها ایجاد می کنیم که برای موقعیت هر ستون در نمودار استفاده می‌شود.

  1. رسم ستون‌ها (Bar chart)
bars = plt.bar(index, grouped_data["مجموع مبلغ خرید"], width=0.6, label=reshape_text("مجموع مبلغ خرید"))

() plt.bar برای رسم نمودار ستونی استفاده می‌شود.

index موقعیت هر ستون در محور افقی را تعیین می‌کند.

grouped_data  مجموع مبلغ خرید مقدار هر ستون را نشان می‌دهد.

width=0.6 عرض هر ستون را تنظیم می‌کند.

label=reshape_text (  مجموع مبلغ خرید) برچسبی برای ستون‌ها قرار می‌دهد که بعداً در legend استفاده خواهد شد.

  1. اضافه کردن مقادیر بالای ستون‌ها
for bar in bars:
    height = bar.get_height()
    plt.text(bar.get_x() + bar.get_width() / 2, height + 1, f"{int(height):,}", ha="center", fontsize=10)

for bar in bars: این حلقه برای اضافه کردن مقادیر به هر ستون در نمودار استفاده می‌شود.

() bar.get_height ارتفاع ستون (مقدار داده) را برمی‌گرداند.

()  plt.textبرای قرار دادن مقدار بالای هر ستون استفاده می‌شود.

bar.get_x() + bar.get_width() / 2 موقعیت افقی متن را محاسبه می‌کند.

height + 1 ا رتفاع متن را کمی بالاتر از بالای ستون قرار می‌دهد.

f”{int(height):,}”  مقدار را به صورت عدد صحیح و با فرمت عددی (جداکننده هزارگان) نمایش می‌دهد.

  1. تنظیمات نمودار
plt.xlabel(reshape_text("مشتری"), fontsize=12)
plt.ylabel(reshape_text("مجموع مبلغ خرید (ریال)"), fontsize=12)
plt.title(reshape_text("مجموع مبلغ خرید هر مشتری"), fontsize=14)
plt.xticks(index, grouped_data["مشتری"], fontsize=10, rotation=45)
plt.legend()

()plt.xlabel و() plt.ylabel  برچسب‌های محورهای X و Y را تنظیم می‌کند.

()plt.title  عنوان نمودار را تنظیم می‌کند.

() plt.xticks  برچسب‌های محور افقی را با نام مشتری‌ها قرار می‌دهد.

rotation=45 باعث می‌شود که برچسب‌ها ۴۵ درجه چرخیده و خواناتر شوند.

()  plt.legend نشان (legend) را برای نمایش برچسب‌ها اضافه می‌کند.

  1. بهبود فاصله‌ها و نمایش نمودار
plt.tight_layout()
plt.show()

()plt.tight_layoutاین دستور فاصله‌های میان اجزای نمودار را بهینه می‌کند تا هیچ قسمتی از نمودار برش نخورد.

()plt.showنمودار را نمایش می‌دهد.

نتیجه نهایی:

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

 

0 پاسخ

دیدگاه خود را ثبت کنید

تمایل دارید در گفتگوها شرکت کنید؟
در گفتگو ها شرکت کنید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *