تستنسخ HotXLS تسميات معادلة خط الاتجاه و R-squared في Excel داخل Delphi عبر XLSTrendlineEquationLabel في وحدة lxStandard. تلائم الدالة نقاط السلسلة المالكة لخطوط الاتجاه الخطي والأس واللوغاريتمي ومتعدد الحدود (الدرجة من 2 إلى 6) والقوي والمتوسط المتحرك، وتعيد النص نفسه الذي يبلّغ عنه Excel في DataLabel.Text نقطة كود بنقطة كود، أو False عندما تكون الملاءمة غير معرفة
سبب حاجتنا أصلاً إلى دالة هو أن التسمية ليست في الملف. يخزن مخطط XLSX عنصر c:trendline مع c:trendlineType ومفتاحي c:dispEq و c:dispRSqr و c:trendlineLbl اختيارياً للموضع والتنسيق، لكن ECMA-376 DrawingML Charts لا يمنح التسمية نصاً خاصاً بها. يعيد Excel حساب y = 1.96x + 0.14 كل مرة يرسم فيها المخطط. أي كود ديلفي يريد عرض ذلك النص أو تصديره أو بحثه أو مقارنته دون تشغيل Excel عليه أن يعيد حسابه أيضاً، ويعيد حسابه بالطريقة التي يفعلها Excel، حتى إلى التباعد حول علامة السالب
لماذا لا تنسّق معاملات الانحدار بنفسك فحسب؟
المعاملات المنسقة يدوياً لا تطابق تسمية Excel غالباً، لأن التسمية تتبع عدة اصطلاحات صغيرة يسهل فواتها ويسهل التحقق ضدها. جمّدت HotXLS تلك الاصطلاحات من قراءات COM حية لـ DataLabel.Text في Excel على مخطط تبعثر، ثم كتبت المنسق مقابل ذلك المرجع لا مقابل الحدس
الاصطلاحات التي تعض في الممارسة:
- الأسس محارف عادية في نص التسمية. تقرأ تسمية متعدد الحدود
x2لاx²، وتقرأ تسمية القويx0.9732؛ والمظهر المرتفع خاصية عرض للمخطط لا جزءاً من السلسلة - المحرف الوحيد خارج ASCII هو الأس اثنان U+00B2 في بادئة
R² = - المعامل 1 أو -1 بالضبط يُسقط، فتكتب Excel
y = x + 3لاy = 1x + 3 - تضم الحدود بعلاماتها بمسافات (
+و-)، بينما يأخذ المعامل السالب البادئ سالباً مجرداً، كما فيy = -0.0429x2 + 2.2171x - 0.16 - عندما تعرض Excel السطرين معاً تضمهما
DataLabel.Textبـ U+000B، علامة جدولة رأسية، لا بزوج CR/LF
تنسيق الأعداد محدود أيضاً. تطبع XLSTrendlineEquationLabel الصفر بوصفه 0، وتتحول إلى ترميز علمي بخانة واحدة مثل 2E+06 عندما تقل المقدار عن 0.0001 أو بلغت 1000000، وإلا استخدمت الترميز الثابت بأربع منازل عشرية حتى 99.9999، بواحد أقل لكل خانة صحيحة إضافية، والأصفار اللاحقة مقطوعة. ولهذا يظهر 1.96 بوصفه 1.96 لا 1.9600
استدعاء XLSTrendlineEquationLabel من Delphi
تأخذ XLSTrendlineEquationLabel نوع خط الاتجاه عدداً ترتيبياً صحيحاً من TXLSXChartTrendlineType، ودرجة متعدد حدود، ومصفوفة مفتوحة من سجلات TXLSTrendlineLabelPoint بحقلي X و Y، ومفتاحي العرض. وتعيد سلسلتي المعادلة و R-squared عبر معاملات out بوصفهما WideString، تاركة سلسلة فارغة عندما يكون مفتاحها مطفأً. وسيط الدرجة لا يهم إلا لـ xlsxTrendPolynomial؛ مرر 0 للأنواع الأخرى
uses
lxStandard, lxHandleX;
procedure ShowFiveTrendlines;
const
YS: array[0..4] of Double = (2.1, 3.9, 6.2, 8.1, 9.8);
var
Points: array[0..4] of TXLSTrendlineLabelPoint;
Eq, R2: WideString;
I: Integer;
begin
for I := 0 to 4 do
begin
Points[I].X := I + 1;
Points[I].Y := YS[I];
end;
// خطي: Eq = 'y = 1.96x + 0.14' و R2 = 'R' + #$00B2 + ' = 0.9976'
if XLSTrendlineEquationLabel(Ord(xlsxTrendLinear), 0, Points,
True, True, Eq, R2) then
Writeln(Eq, ' | ', R2);
// متعدد حدود درجة 2: 'y = -0.0429x2 + 2.2171x - 0.16' و R2 0.9983
if XLSTrendlineEquationLabel(Ord(xlsxTrendPolynomial), 2, Points,
True, True, Eq, R2) then
Writeln(Eq, ' | ', R2);
// أسي: 'y = 1.6767e0.3812x' و R2 0.9386
if XLSTrendlineEquationLabel(Ord(xlsxTrendExponential), 0, Points,
True, True, Eq, R2) then
Writeln(Eq, ' | ', R2);
// النص نفسه الذي يضعه Excel في DataLabel.Text عند عرض السطرين معاً
Eq := Eq + #$000B + R2;
end;
القيم الخمس في تلك العينة هي مرجع Excel المجمّد الذي يفحصه مختبر اختبارات HotXLS لكل عائلة. يعود الملاءمة اللوغاريتمية بـ y = 4.7635ln(x) + 1.4589 مع R² = 0.9519، وملاءمة القوي بـ y = 2.0719x0.9732 مع R² = 0.9978. وإن اختلف مخرجك عن Excel على البيانات نفسها فالمكتبة والمرجع متعارضان، وذلك خطأ يستحق الإبلاغ لا تفضيل تقريب
كيف تحسب Excel قيمة R-squared لخطي الاتجاه الأسي والقوي؟
في تسمية خط الاتجاه تكون R-squared ارتباط بيرسون تربيعاً بين القيم الملائمة وقيم Y الفعلية في فضاء البيانات الأصلي، وتحسبه XLSTrendlineEquationLabel بالطريقة نفسها. معاملات الملاءمة الأسية أو اللوغاريتمية أو القوية ما تزال قادمة من المربعات الصغرى العادية على بيانات محولة لوغاريتمياً: ln(y) مقابل x للأسي، و y مقابل ln(x) لللوغاريتمي، و ln(y) مقابل ln(x) للقوي. الرقم الوحيد المقاس في المجال الطبيعي مجدداً هو جودة الملاءمة
هذا هو التفصيل الذي تخطئ فيه معظم إعادة التطبيقات، لأن المقاربة الكتابية تقيس R-squared في الفضاء المحول الذي مُلئم فيه الخط. على مجموعة المرجع يظهر الفرق أصلاً في المنزلة العشرية الثانية. يعطي الملاءمة الأسية في الفضاء المحول 0.9477، بينما تسمية Excel، مقروءة حية، تقول R² = 0.9386، وهو ارتباط المجال الطبيعي. مولد تسميات يعيد استخدام إحصاءات انحداره في الفضاء المحول سيطبع الرقم الخطأ على أول مخطط يقارنه مستخدم
حالتان خاصتان تغيران الصيغة. خط اتجاه خطي بجزء ثابت مثبت عند صفر يستخدم الصيغة المتبقية غير الممركزة، 1 ناقص مجموع مربعات البواقي على مجموع قيم Y المربعة، وهو ما يطابق ما تعرضه Excel لذلك الإعداد. مجموعة قيم Y فيها متساوية كلها لا تملك تبايناً ليُفسر، فالنتيجة R² = #N/A بجوار معادلة ثابتة مثل y = 5. ومجموعة غير ثابتة صادف أن ميل ملائمتها صفر تحصل بدلاً من ذلك على R² = 0
الأجزاء الثابتة والصيغة الزائدة الثانية
تضيف الصيغة الزائدة الثانية لـ XLSTrendlineEquationLabel InterceptSet: Boolean و Intercept: Double قبل معاملات المخرجات، وهي تحاكي عنصر c:intercept لخط الاتجاه وخاصيتي InterceptSet و Intercept في TXLSXChartTrendline. لا تقدم Excel جزءاً ثابتاً إلا لخطوط الاتجاه الخطية والأسية ومتعددة الحدود، وتفرض الدالة القاعدة نفسها: جزء ثابت على ملاءمة لوغاريتمية أو قوية يعيد False، وتحتاج الملاءمة الأسية جزءاً ثابتاً موجباً لأن الملاءمة تعمل بلوغاريتمه
procedure LabelForTrendline(Trend: TXLSXChartTrendline;
const Points: array of TXLSTrendlineLabelPoint);
var
Eq, R2: WideString;
begin
if not XLSTrendlineEquationLabel(Ord(Trend.TrendlineType), Trend.Order,
Points, Trend.DispEq, Trend.DispRSqr, Trend.InterceptSet,
Trend.Intercept, Eq, R2) then
begin
// ملاءمة غير معرفة: لا تخترع تسمية
Writeln('No label for this trendline');
Exit;
end;
if Eq <> '' then Writeln(Eq);
if R2 <> '' then Writeln(R2);
end;
procedure AddQuadraticThroughOrigin(Series: TXLSXChartSeries);
var
Trend: TXLSXChartTrendline;
begin
Trend := Series.AddTrendline(xlsxTrendPolynomial);
Trend.Order := 2;
Trend.DispEq := True;
Trend.DispRSqr := True;
Trend.InterceptSet := True;
Trend.Intercept := 0;
end;
تغذية خصائص خط الاتجاه نفسه مباشرة في الصيغة الزائدة تبقي التسمية مواكبة لما سيخبر به المصنف Excel أن يرسم. عندما تكون InterceptSet مساوية False تُتجاهل قيمة Intercept، فتمرير الخاصية بلا شرط آمن. ويخفض الجزء الثابت أيضاً شرط النقاط واحداً: متعدد حدود من الدرجة n يحتاج عادة n + 1 نقطة، لكن n فقط عندما يُثبّت الحد الثابت
أي قيم X يستخدم خط اتجاه مخطط Line فعلاً؟
ملاءمة خط الاتجاه على مخطط Line عادي تجري مقابل موضع الفئة ذي الأساس 1، لا تسمية الفئة، حتى عندما تكون التسميات أعداداً. تعامل Excel المحور الأفقي لمخطط Line معاملة محور فئات، فسلسلة مرسومة على الأعوام 2019 إلى 2023 تلائم بوصفها x = 1..5 ويعكس جزء المعادلة الثابت ذلك. مخططات Scatter و Bubble مختلفة: تلائم مقابل قيم X العددية المطابقة لكل نقطة
تعلمت HotXLS هذا بالطريقة الصعبة. قرأت أول نسخة من إسقاط اللقطات الدلالية نص الفئة العددي بوصفه x الفعلي، فأنتجت معادلة صحيحة رياضياً لن تعرضها Excel قط. نقل الإصلاح اللاحق ملاءمات Line إلى موضع الفئة الأصلي لكل فئة، عددياً كانت أو لا، وحسم أيضاً ما يحدث مع الفجوات: خلية Y فارغة تُترك خارج الملاءمة، لكن النقاط اللاحقة تحفظ فهرسها الأصلي بدل الانزلاق لسد الثقب. والتمييز نفسه بين مواضع الفئات والقيم الحقيقية يقف خلف علامات محور التاريخ الدقيقة تقويمياً في مخططات HotXLS
uses
Math, lxStandard, lxHandleX;
// تحمل Values سلسلة Line بترتيب الفئات؛ و NaN تميز خلية فارغة
function LinePointsFromCategories(const Values: array of Double):
TArray<TXLSTrendlineLabelPoint>;
var
I, N: Integer;
begin
SetLength(Result, Length(Values));
N := 0;
for I := 0 to High(Values) do
begin
if IsNan(Values[I]) then
Continue; // تجاوز الفارغة، واحفظ الفهارس اللاحقة
Result[N].X := I + 1; // موضع فئة ذي أساس 1
Result[N].Y := Values[I];
Inc(N);
end;
SetLength(Result, N);
end;
أخطئ في هذه الخطوة وأهدرت كل اصطلاح آخر في هذه المقالة، لأن التسمية ستكون نصاً منسقاً بشكل صحيح لانحدار خاطئ. تطبق لقطات المصنف الدلالية في HotXLS القاعدة لكل مجموعة رسم أصلاً عند بثّ خاصيتي EquationText و RSquaredText، فلقطة مخطط مستورد تحمل نص التسمية الذي سيعرضه Excel بجوار بقية ChartML المحفوظ للمخططات المستوردة من Excel
متى تعيد XLSTrendlineEquationLabel القيمة False؟
تعيد XLSTrendlineEquationLabel False وتترك السلسلتين فارغتين كلما كانت الملاءمة غير معرفة، بدل نشر تسمية جزئية أو مخمَّنة. لا تبث الدالة نصف معادلة قط، فنتيجة True تعني دوماً أن السلسلتين المطلوبتين تامتان
- أقل من نقطتين، أو نوع اتجاه خارج 0..5، أو درجة متعدد حدود خارج 2..6
- قيمة X غير موجبة لملاءمة لوغاريتمية أو قوية، أو قيمة Y غير موجبة لملاءمة أسية أو قوية، لأن كليهما يحتاج لوغاريتم
- مدخلات NaN أو لانهائية، أو أي X أو Y أو جزء ثابت بمقدار فوق 1E50
- نقاط أقل مما تحتاجه درجة متعدد الحدود، أو قيم X كلها متساوية لملاءمة غير متعددة حدود بلا جزء ثابت، أو نظام متعدد حدود شاذ
- قيم ملائمة تغادر المدى المنتهي (فوق 1E100) أو أسس سيفيض تمثيلها
المتوسط المتحرك هو الاستثناء المقصود. لا تكشف Excel نص معادلة أو R-squared لخط اتجاه متوسط متحرك حتى مع تشغيل المفتاحين المخزنين dispEq و dispRSqr، فتعيد الدالة True والسلسلتان فارغتان، بما يخبر المستدعي بشكل صحيح أنه لا شيء يُرسم
الاستقرار العددي والحدود الحالية
خطوط الاتجاه متعددة الحدود هي حيث تفقد الأكواد الساذجة خاناتها. المعادلات النظامية الخام لملاءمة من الدرجة السادسة على قيم X بالآلاف سيئة الشرط، فمركزّ HotXLS قيم X ويقيسها قبل بناء النظام، ويحله بحذف Gauss-Jordan والتدوير الجزئي، ثم يوسع المعاملات عائدة إلى المتغير الأصلي عندئذ فقط. وتستخدم الملاءمات الخطية وارتباط R-squared التراكم التزايدي للمتوسط والتباين للسبب نفسه، والجزء الثابت الذي هو مجرد ضجيج فاصلة عائمة نسبة إلى البيانات يُقرَّب إلى صفر كي لا تنتهي التسمية بـ + 4E-17
الحدود الأمينة في التنسيق. تنتج الدالة أعداد تسميات Excel الافتراضية؛ و LabelNumberFormat المخصصة على تسمية خط الاتجاه يحفظها TXLSXChartTrendline لكنه لا يطبق على النص المحسوب. تنسيق الأسس المرتفعة في المخرجات المعروضة والموضع التلقائي للتسمية عمل منفصل، وملاءمات ذات درجة عالية جداً على بيانات ذات إزاحة كبيرة أو شبه مستقيمة قد ترفض بوصفها شاذة بدل أن تُحل. لمكتبة مقصود أن توافق Excel، الرفض هو الفشل الأأمن
FAQ
هل يخزن ملف XLSX نص معادلة خط الاتجاه
لا. يخزن عنصر c:trendline نوع الملاءمة والدرجة أو الفترة والجزء الثابت الاختياري والتنبؤات ومفتاحي c:dispEq و c:dispRSqr، ويخزن c:trendlineLbl تخطيط التسمية وتنسيقها. تحسب Excel نص المعادلة و R-squared وقت العرض، ولهذا تحسبه HotXLS بواسطة XLSTrendlineEquationLabel
لماذا تعرض تسمية متعدد الحدود x2 بدل أس مرتفع
لأن ذلك ما تحويه DataLabel.Text في Excel. الأس رقم عادي في السلسلة وتطبق Excel التنسيق المرتفع عندما ترسم المخطط. ومحرف U+00B2 لا يظهر إلا في بادئة R² = لسطر R-squared
هل يمكن حساب التسميات لمخططات بُنيت بمحرك XLS الكلاسيكي
تسكن XLSTrendlineEquationLabel في lxStandard وتتشاركه محركا HotXLS كلاهما، فتعمل مع أي مجموعة نقاط تستطيع استخلاصها. الإسقاط التلقائي لنص التسمية إلى اللقطات الدلالية يغطي حالياً مخططات OOXML؛ وللمصادر الأخرى ابنِ مصفوفة TXLSTrendlineLabelPoint بنفسك واتبع قاعدة موضع الفئة لمخططات Line
حساب تسميات خطوط الاتجاه وتأليف المخططات وبقية نموذج كائنات Excel متوفرة في HotXLS، مكون جداول البيانات الأصلي لـ Delphi لملفات XLS و XLSX، دون تثبيت Excel وقت التشغيل