|
|
|
""" |
|
وحدة تحسين عرض النصوص العربية في الرسوم البيانية |
|
|
|
هذا الملف يحتوي على دوال مساعدة لتحسين عرض النصوص العربية في الرسوم البيانية |
|
باستخدام مكتبات arabic-reshaper و python-bidi مع خطوط عربية احترافية. |
|
""" |
|
|
|
import arabic_reshaper |
|
from bidi.algorithm import get_display |
|
import matplotlib.pyplot as plt |
|
import matplotlib.font_manager as fm |
|
import plotly.graph_objects as go |
|
import plotly.express as px |
|
import numpy as np |
|
import os |
|
import sys |
|
from arabic_font_config import ArabicFontManager, get_display_arabic, setup_arabic_fonts |
|
|
|
|
|
font_manager = ArabicFontManager() |
|
BEST_ARABIC_FONT = font_manager.get_best_font() |
|
|
|
def create_risk_matrix_plotly(risk_levels=None, width=450, height=450, font_family=BEST_ARABIC_FONT): |
|
""" |
|
إنشاء مصفوفة المخاطر باستخدام Plotly مع دعم اللغة العربية |
|
|
|
المعلمات: |
|
risk_levels: مصفوفة مستويات المخاطر (اختياري) |
|
width: عرض الرسم البياني |
|
height: ارتفاع الرسم البياني |
|
font_family: عائلة الخط المستخدمة |
|
|
|
العوائد: |
|
كائن الرسم البياني Plotly Figure |
|
""" |
|
|
|
if risk_levels is None: |
|
risk_levels = np.array([ |
|
[1, 2, 3], |
|
[2, 4, 6], |
|
[3, 6, 9] |
|
]) |
|
|
|
|
|
fig = go.Figure() |
|
|
|
|
|
colorscale = [ |
|
[0, '#1a9850'], |
|
[0.3, '#91cf60'], |
|
[0.5, '#ffffbf'], |
|
[0.7, '#fc8d59'], |
|
[1, '#d73027'] |
|
] |
|
|
|
|
|
fig.add_trace(go.Heatmap( |
|
z=risk_levels, |
|
x=[get_display_arabic('منخفض'), get_display_arabic('متوسط'), get_display_arabic('عالي')], |
|
y=[get_display_arabic('منخفضة'), get_display_arabic('متوسطة'), get_display_arabic('عالية')], |
|
text=risk_levels, |
|
texttemplate="%{text}", |
|
textfont={"size":20}, |
|
colorscale=colorscale, |
|
showscale=True, |
|
colorbar=dict( |
|
title=get_display_arabic("درجة الخطورة"), |
|
tickfont=dict(size=12), |
|
) |
|
)) |
|
|
|
|
|
fig.update_layout( |
|
title=get_display_arabic("مصفوفة المخاطر"), |
|
height=height, |
|
width=width, |
|
margin=dict(l=50, r=50, t=50, b=50), |
|
xaxis=dict( |
|
title=get_display_arabic("التأثير"), |
|
tickfont=dict(size=12), |
|
), |
|
yaxis=dict( |
|
title=get_display_arabic("الاحتمالية"), |
|
tickfont=dict(size=12), |
|
), |
|
font=dict( |
|
family=font_family, |
|
size=14 |
|
) |
|
) |
|
|
|
return fig |
|
|
|
def create_pie_chart_plotly(labels, values, title="توزيع البيانات", width=400, height=380, font_family=BEST_ARABIC_FONT): |
|
""" |
|
إنشاء مخطط دائري باستخدام Plotly مع دعم اللغة العربية |
|
|
|
المعلمات: |
|
labels: تسميات البيانات |
|
values: قيم البيانات |
|
title: عنوان الرسم البياني |
|
width: عرض الرسم البياني |
|
height: ارتفاع الرسم البياني |
|
font_family: عائلة الخط المستخدمة |
|
|
|
العوائد: |
|
كائن الرسم البياني Plotly Figure |
|
""" |
|
|
|
arabic_labels = [get_display_arabic(label) for label in labels] |
|
|
|
|
|
fig = go.Figure() |
|
|
|
|
|
colors = ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#8c564b'] |
|
|
|
fig.add_trace(go.Pie( |
|
labels=arabic_labels, |
|
values=values, |
|
textinfo='percent', |
|
insidetextorientation='radial', |
|
marker=dict(colors=colors[:len(labels)]), |
|
hole=0.4, |
|
textfont=dict( |
|
family=font_family, |
|
size=14 |
|
) |
|
)) |
|
|
|
|
|
fig.update_layout( |
|
title=get_display_arabic(title), |
|
height=height, |
|
width=width, |
|
margin=dict(l=0, r=0, t=40, b=0), |
|
font=dict( |
|
family=font_family, |
|
size=14 |
|
), |
|
legend=dict( |
|
orientation="h", |
|
yanchor="bottom", |
|
y=-0.2, |
|
xanchor="center", |
|
x=0.5, |
|
font=dict( |
|
family=font_family, |
|
size=12 |
|
) |
|
) |
|
) |
|
|
|
return fig |
|
|
|
def create_bar_chart_plotly(x_data, y_data, x_title="الفئات", y_title="القيم", title="رسم بياني شريطي", width=450, height=400, font_family=BEST_ARABIC_FONT): |
|
""" |
|
إنشاء رسم بياني شريطي باستخدام Plotly مع دعم اللغة العربية |
|
|
|
المعلمات: |
|
x_data: بيانات المحور الأفقي |
|
y_data: بيانات المحور الرأسي |
|
x_title: عنوان المحور الأفقي |
|
y_title: عنوان المحور الرأسي |
|
title: عنوان الرسم البياني |
|
width: عرض الرسم البياني |
|
height: ارتفاع الرسم البياني |
|
font_family: عائلة الخط المستخدمة |
|
|
|
العوائد: |
|
كائن الرسم البياني Plotly Figure |
|
""" |
|
|
|
if isinstance(x_data[0], str): |
|
x_data = [get_display_arabic(x) for x in x_data] |
|
|
|
|
|
fig = go.Figure() |
|
|
|
fig.add_trace(go.Bar( |
|
x=x_data, |
|
y=y_data, |
|
marker_color='#1f77b4', |
|
text=y_data, |
|
textposition='auto', |
|
textfont=dict( |
|
family=font_family, |
|
size=12 |
|
) |
|
)) |
|
|
|
|
|
fig.update_layout( |
|
title=get_display_arabic(title), |
|
height=height, |
|
width=width, |
|
margin=dict(l=50, r=50, t=50, b=50), |
|
xaxis=dict( |
|
title=get_display_arabic(x_title), |
|
tickfont=dict( |
|
family=font_family, |
|
size=12 |
|
), |
|
), |
|
yaxis=dict( |
|
title=get_display_arabic(y_title), |
|
tickfont=dict( |
|
family=font_family, |
|
size=12 |
|
), |
|
), |
|
font=dict( |
|
family=font_family, |
|
size=14 |
|
) |
|
) |
|
|
|
return fig |
|
|
|
def create_line_chart_plotly(x_data, y_data, x_title="الزمن", y_title="القيم", title="رسم بياني خطي", width=450, height=400, font_family=BEST_ARABIC_FONT): |
|
""" |
|
إنشاء رسم بياني خطي باستخدام Plotly مع دعم اللغة العربية |
|
|
|
المعلمات: |
|
x_data: بيانات المحور الأفقي |
|
y_data: بيانات المحور الرأسي |
|
x_title: عنوان المحور الأفقي |
|
y_title: عنوان المحور الرأسي |
|
title: عنوان الرسم البياني |
|
width: عرض الرسم البياني |
|
height: ارتفاع الرسم البياني |
|
font_family: عائلة الخط المستخدمة |
|
|
|
العوائد: |
|
كائن الرسم البياني Plotly Figure |
|
""" |
|
|
|
if isinstance(x_data[0], str): |
|
x_data = [get_display_arabic(x) for x in x_data] |
|
|
|
|
|
fig = go.Figure() |
|
|
|
fig.add_trace(go.Scatter( |
|
x=x_data, |
|
y=y_data, |
|
mode='lines+markers', |
|
marker=dict(size=8), |
|
line=dict(width=2) |
|
)) |
|
|
|
|
|
fig.update_layout( |
|
title=get_display_arabic(title), |
|
height=height, |
|
width=width, |
|
margin=dict(l=50, r=50, t=50, b=50), |
|
xaxis=dict( |
|
title=get_display_arabic(x_title), |
|
tickfont=dict( |
|
family=font_family, |
|
size=12 |
|
), |
|
), |
|
yaxis=dict( |
|
title=get_display_arabic(y_title), |
|
tickfont=dict( |
|
family=font_family, |
|
size=12 |
|
), |
|
), |
|
font=dict( |
|
family=font_family, |
|
size=14 |
|
) |
|
) |
|
|
|
return fig |
|
|
|
def create_risk_matrix_matplotlib(risk_levels=None, figsize=(6, 5), font_family=BEST_ARABIC_FONT): |
|
""" |
|
إنشاء مصفوفة المخاطر باستخدام Matplotlib مع دعم اللغة العربية |
|
|
|
المعلمات: |
|
risk_levels: مصفوفة مستويات المخاطر (اختياري) |
|
figsize: حجم الشكل (العرض، الارتفاع) بالإنش |
|
font_family: عائلة الخط المستخدمة |
|
|
|
العوائد: |
|
كائن الرسم البياني Matplotlib Figure |
|
""" |
|
|
|
setup_arabic_fonts(font_family) |
|
|
|
|
|
if risk_levels is None: |
|
risk_levels = np.array([ |
|
[1, 2, 3], |
|
[2, 4, 6], |
|
[3, 6, 9] |
|
]) |
|
|
|
|
|
fig, ax = plt.subplots(figsize=figsize) |
|
|
|
|
|
cmap = plt.cm.get_cmap('RdYlGn_r') |
|
|
|
|
|
im = ax.imshow(risk_levels, cmap=cmap) |
|
|
|
|
|
for i in range(len(risk_levels)): |
|
for j in range(len(risk_levels[0])): |
|
ax.text(j, i, risk_levels[i, j], ha='center', va='center', color='white', fontsize=14, fontfamily=font_family) |
|
|
|
|
|
ax.set_title(get_display_arabic("مصفوفة المخاطر"), fontsize=16, fontfamily=font_family) |
|
ax.set_xlabel(get_display_arabic("التأثير"), fontsize=14, fontfamily=font_family) |
|
ax.set_ylabel(get_display_arabic("الاحتمالية"), fontsize=14, fontfamily=font_family) |
|
|
|
|
|
ax.set_xticks(np.arange(len(risk_levels[0]))) |
|
ax.set_yticks(np.arange(len(risk_levels))) |
|
ax.set_xticklabels([get_display_arabic(label) for label in ['منخفض', 'متوسط', 'عالي']], fontfamily=font_family) |
|
ax.set_yticklabels([get_display_arabic(label) for label in ['منخفضة', 'متوسطة', 'عالية']], fontfamily=font_family) |
|
|
|
|
|
cbar = fig.colorbar(im) |
|
cbar.set_label(get_display_arabic("درجة الخطورة"), fontsize=14, fontfamily=font_family) |
|
|
|
|
|
plt.tight_layout() |
|
|
|
return fig |
|
|
|
|
|
if __name__ == "__main__": |
|
|
|
print(f"الخط العربي المستخدم: {BEST_ARABIC_FONT}") |
|
|
|
|
|
risk_matrix = create_risk_matrix_plotly() |
|
risk_matrix.write_image("risk_matrix_optimized.png") |
|
print("تم إنشاء مصفوفة المخاطر باستخدام Plotly") |
|
|
|
|
|
labels = ["المنتجات المحلية", "الخدمات المحلية", "القوى العاملة المحلية", "غير محلي"] |
|
values = [40, 20, 30, 10] |
|
pie_chart = create_pie_chart_plotly(labels, values, "توزيع المحتوى المحلي") |
|
pie_chart.write_image("pie_chart_optimized.png") |
|
print("تم إنشاء المخطط الدائري باستخدام Plotly") |
|
|
|
|
|
x_data = ["الربع الأول", "الربع الثاني", "الربع الثالث", "الربع الرابع"] |
|
y_data = [20, 35, 25, 40] |
|
bar_chart = create_bar_chart_plotly(x_data, y_data, "الفترة", "المبيعات", "مبيعات السنة") |
|
bar_chart.write_image("bar_chart_optimized.png") |
|
print("تم إنشاء الرسم البياني الشريطي باستخدام Plotly") |
|
|
|
|
|
x_data = ["يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو"] |
|
y_data = [10, 15, 13, 17, 20, 25] |
|
line_chart = create_line_chart_plotly(x_data, y_data, "الشهر", "الإيرادات", "إيرادات النصف الأول") |
|
line_chart.write_image("line_chart_optimized.png") |
|
print("تم إنشاء الرسم البياني الخطي باستخدام Plotly") |
|
|
|
|
|
risk_matrix_mpl = create_risk_matrix_matplotlib() |
|
plt.savefig("risk_matrix_matplotlib_optimized.png", dpi=150) |
|
print("تم إنشاء مصفوفة المخاطر باستخدام Matplotlib") |
|
|
|
print("تم إنشاء جميع الرسوم البيانية بنجاح!") |
|
|