قسمت دوم – برطرف کردن مشکل مقادیر فارسی در matplotlib

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

مراحل حل مشکل نمایش فارسی در Matplotlib :

تنظیم فونت فارسی در Matplotlib   : باید از یک فونت پشتیبانی‌کننده زبان فارسی استفاده کنید. یکی از فونت‌های معروف برای زبان فارسی، فونت‌های مانند B Nazanin, Tahoma, یا Iran Sans هستند. در اینجا نحوه تنظیم آن‌ها آورده شده است.

استفاده از arabic_reshaper برای نمایش متون فارسی:

گاهی ممکن است حروف فارسی به درستی نمایش داده نشوند، برای رفع این مشکل می‌توانید از کتابخانه arabic_reshaper برای اصلاح نمایش متون استفاده کنید:

نصب arabic_reshaper:

pip install arabic-reshaper

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

مشکل اصلی در نمایش فارسی در Matplotlib

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

عملکرد bidi.algorithm در حل این مشکل

bidi.algorithm بخشی از کتابخانه python-bidi است که برای راست‌چین کردن متون راست‌به‌چپ و نمایش صحیح آن‌ها استفاده می‌شود. با استفاده از این کتابخانه و به کمک arabic_reshaper، می‌توانید مراحل زیر را برای نمایش صحیح متون فارسی دنبال کنید:

پیوستگی حروف فارسی با arabic_reshaper: این کتابخانه با پیوند دادن حروف، کلمات را به صورت یکپارچه درمی‌آورد تا به‌درستی کنار هم قرار بگیرند.

تنظیم راست به چپ با bidi.algorithm: بعد از شکل‌دهی حروف، bidi.algorithm ترتیب نمایش حروف را تغییر می‌دهد تا کلمات از راست به چپ (جهت صحیح) نمایش داده شوند.

چرا bidi.algorithm مهم است؟

بدون استفاده از bidi.algorithm، متن فارسی از چپ به راست نمایش داده می‌شود و حروف به جای اتصال صحیح، به‌صورت جدا جدا دیده می‌شوند. با استفاده از bidi.algorithm، متن به ترتیب صحیح و طبیعی نمایش داده می‌شود و می‌توانید به‌طور مستقیم از آن در Matplotlib و سایر محیط‌های مشابه استفاده کنید.

نصب کتابخانه python-bidi

pip install python-bidi

اما قطعه کد نمونه ما :

import arabic_reshaper
from bidi.algorithm import get_display
import matplotlib.pyplot as plt
from matplotlib import font_manager

# تنظیم فونت فارسی
font_path = 'C:\\Windows\\Fonts\\Tahoma.ttf'  # مسیر فونت
prop = font_manager.FontProperties(fname=font_path)

# متنی که می‌خواهید فارسی نمایش داده شود
title_text = 'نمودار خطی'

# اصلاح متن فارسی برای نمایش صحیح
reshaped_text = arabic_reshaper.reshape(title_text)  # اصلاح
bidi_text = get_display(reshaped_text)  # راست به چپ کردن

# ترسیم نمودار با عنوان فارسی
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]

plt.plot(x, y)
plt.title(bidi_text, fontproperties=prop)
plt.xlabel('محور X', fontproperties=prop)
plt.ylabel('محور Y', fontproperties=prop)
plt.show()
 

در قطعه کد بالا ما فقط عنوان نمودار را فارسی کردیم و محور X و Y  را تغییری ایجاد نکردیم ، مشکل این روش این است که باید به ازای هر تنظیمی که نیاز به مقدار فارسی داشته باشد این کار را انجام دهیم .
برای  این که یک به یک تنظیم فونت فارسی را انجام ندهیم ، می توانیم یک تابع ایجاد کنیم که کل متن‌ها را به صورت خودکار به فرمت مناسب (راست به چپ) تبدیل کند و این تنظیمات را به صورت پیش‌فرض برای عناوین نمودار، برچسب‌های محورها و دیگر عناصر متنی اعمال کند.
import arabic_reshaper
from bidi.algorithm import get_display
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc

# تابع تبدیل متن فارسی
def prepare_persian_text(text):
    reshaped_text = arabic_reshaper.reshape(text)
    return get_display(reshaped_text)

# تنظیم فونت فارسی

font_path = 'C:\\Windows\\Fonts\\Tahoma.ttf'  # مسیر فونت  # مسیر فونت فارسی
prop = font_manager.FontProperties(fname=font_path)
rc('font', family=prop.get_name())

# تنظیم پیش‌فرض برای متون نمودار
plt.rcParams['axes.titleweight'] = 'bold'
plt.rcParams['axes.labelweight'] = 'bold'

# حالا به راحتی از توابع زیر برای ایجاد عناوین و برچسب‌های فارسی استفاده کنید
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]

plt.plot(x, y)
plt.title(prepare_persian_text('نمودار خطی'))
plt.xlabel(prepare_persian_text('محور X'))
plt.ylabel(prepare_persian_text('محور Y'))
plt.show()

با این روش، تابع prepare_persian_text را یک بار تعریف می‌کنید و هر بار که نیاز به نمایش متن فارسی دارید، از این تابع استفاده می‌کنید تا تمام عناصر متنی نمودار به درستی نمایش داده شوند.
0 پاسخ

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

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

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

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