Wahbi-AI / modules /utils /arabic_charts_optimized.py
EGYADMIN's picture
Upload 2 files
39d5fd7 verified
raw
history blame
14 kB
# -*- coding: utf-8 -*-
"""
وحدة تحسين عرض النصوص العربية في الرسوم البيانية
هذا الملف يحتوي على دوال مساعدة لتحسين عرض النصوص العربية في الرسوم البيانية
باستخدام مكتبات 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]
])
# إنشاء مصفوفة المخاطر باستخدام Plotly
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}")
# اختبار مصفوفة المخاطر باستخدام Plotly
risk_matrix = create_risk_matrix_plotly()
risk_matrix.write_image("risk_matrix_optimized.png")
print("تم إنشاء مصفوفة المخاطر باستخدام Plotly")
# اختبار المخطط الدائري باستخدام 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")
# اختبار الرسم البياني الشريطي باستخدام 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")
# اختبار الرسم البياني الخطي باستخدام 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")
# اختبار مصفوفة المخاطر باستخدام Matplotlib
risk_matrix_mpl = create_risk_matrix_matplotlib()
plt.savefig("risk_matrix_matplotlib_optimized.png", dpi=150)
print("تم إنشاء مصفوفة المخاطر باستخدام Matplotlib")
print("تم إنشاء جميع الرسوم البيانية بنجاح!")