تخصيص محاور المخططات في العروض التقديمية باستخدام Java

نظرة عامة

توضح هذه المقالة كيفية تخصيص محاور المخطط باستخدام Aspose.Slides for Java. تتضمن القيم المحسوبة للمحاور، تبديل صفوف وأعمدة المخطط، إظهار أو إخفاء المحور، فواصل تسميات الفئات وعلامات الفواصل، فئات التاريخ وتنسيقها، تدوير العنوان، موضع المحور، ووحدات العرض.

الحصول على القيم القصوى على المحور الرأسي في المخططات

أنشئ العرض التقديمي وأضف مخطط منطقة ببيانات افتراضية. استدعِ validateChartLayout قبل قراءة القيم المحسوبة للمحاور لضمان تحديث تخطيط المخطط.

اقرأ getActualMaxValue و getActualMinValue للحصول على حدود المحور، و getActualMajorUnit و getActualMinorUnit لفواصل العلامات. توفر getActualMajorUnitScale و getActualMinorUnitScale مقاييس الوحدات الزمنية، وهي ذات صلة بمحاور التاريخ. تقوم العينة بتخزين هذه القيم في متغيرات محلية وتحفظ المخطط.

import com.aspose.slides.*;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    IChart chart = slide.getShapes().addChart(ChartType.Area, 100, 100, 500, 350);
    chart.validateChartLayout();

    double maxValue = chart.getAxes().getVerticalAxis().getActualMaxValue();
    double minValue = chart.getAxes().getVerticalAxis().getActualMinValue();

    double majorUnit = chart.getAxes().getVerticalAxis().getActualMajorUnit();
    double minorUnit = chart.getAxes().getVerticalAxis().getActualMinorUnit();

    int majorUnitScale = chart.getAxes().getVerticalAxis().getActualMajorUnitScale();
    int minorUnitScale = chart.getAxes().getVerticalAxis().getActualMinorUnitScale();

    presentation.save("AxisValues_out.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

تبديل البيانات بين المحاور

استخدم switchRowColumn لتبادل أدوار السلاسل والفئات في بيانات المخطط. يصبح كل فئة سابقة سلسلة، وكل سلسلة سابقة فئة. يغيّر هذا طريقة تجميع البيانات؛ ولا يبدل المحاور الأفقية والرأسية. تستخدم العينة setRange لربط البيانات الافتراضية بـ Sheet1!A1:D5، بما في ذلك صف الرأس وعمود الفئة، قبل تبديل الصفوف والأعمدة. تحفظ مخططًا بأربع سلاسل وثلاث فئات.

import com.aspose.slides.*;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    IChart chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 100, 100, 400, 300);
    chart.getChartData().setRange("Sheet1!A1:D5");
    chart.getChartData().switchRowColumn();

    presentation.save("SwitchChartRowColumns_out.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

تعطيل المحور الرأسي لمخططات الخط

استدعِ setVisible بـ false على المحور الرأسي لإخفائه. تقوم العينة بإنشاء مخطط خط ببيانات افتراضية وتحفظه مع إخفاء المحور الرأسي.

import com.aspose.slides.*;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    IChart chart = slide.getShapes().addChart(ChartType.Line, 100, 100, 400, 300);
    chart.getAxes().getVerticalAxis().setVisible(false);

    presentation.save("HiddenVerticalAxis.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

تعطيل المحور الأفقي لمخططات الخط

استدعِ setVisible بـ false على المحور الأفقي لإخفائه. تقوم العينة بإنشاء مخطط خط ببيانات افتراضية وتحفظه مع إخفاء المحور الأفقي.

import com.aspose.slides.*;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    IChart chart = slide.getShapes().addChart(ChartType.Line, 100, 100, 400, 300);
    chart.getAxes().getHorizontalAxis().setVisible(false);

    presentation.save("HiddenHorizontalAxis.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

تغيير محور الفئة

استخدم setCategoryAxisType لاختيار محور فئة تاريخي أو نصي. تتطلب هذه العينة ملف ExistingChart.pptx، مع مخطط كأول شكل في الشريحة الأولى وخلايا الفئة التي تحتوي على قيم تاريخ Excel رقمية. يتم تحويل المحور الأفقي إلى محور تاريخ. استدعِ setAutomaticMajorUnit بـ false، وsetMajorUnit بـ 1، وsetMajorUnitScale بـ TimeUnitType.Months لتحديد الفواصل الرئيسية على أساس شهر واحد.

import com.aspose.slides.*;

Presentation presentation = new Presentation("ExistingChart.pptx");
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    IChart chart = (IChart) slide.getShapes().get_Item(0);
    chart.getAxes().getHorizontalAxis().setCategoryAxisType(CategoryAxisType.Date);
    chart.getAxes().getHorizontalAxis().setAutomaticMajorUnit(false);
    chart.getAxes().getHorizontalAxis().setMajorUnit(1);
    chart.getAxes().getHorizontalAxis().setMajorUnitScale(TimeUnitType.Months);

    presentation.save("ChangeChartCategoryAxis_out.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

التحكم في فواصل تسميات محور الفئة

عند وجود عدد كبير من الفئات في المخطط، قلل عدد تسميات المحور الظاهرة بدون إزالة الفئات أو نقاط البيانات. استدعِ setAutomaticTickLabelSpacing بـ false، ثم مرّر الفاصل الفئوي المطلوب إلى setTickLabelSpacing. بالنسبة للفئات النصية بترتيبها الطبيعي، يبدأ العد من الفئة الأولى:

الفاصل التسميات المعروضة في المثال
1 Category 1, Category 2, Category 3, … Category 24
2 Category 1, Category 3, Category 5, … Category 23
3 Category 1, Category 4, Category 7, … Category 22

فاصل 3 يعرض كل تسمية ثالثة، مع إخفاء تسميتين بين كل تسمية ظاهرة. لا يقوم هذا بإزالة الأعمدة المقابلة. يختار التباعد التلقائي فاصلًا بناءً على المساحة المتاحة؛ ولا يضمن عرض كل تسمية.

علامات الفواصل لها ضوابط منفصلة. استدعِ setAutomaticTickMarksSpacing بـ false واستخدم setTickMarksSpacing لتحديد فاصلها. على سبيل المثال، يحتفظ 1 بعلامة فاصل عند كل فاصل فئوي بينما تظهر التسميات كل فئة ثالثة فقط. استخدم setMajorTickMark بنمط مرئي لتتمكن من رؤية النتيجة. استدعاء أي من مُعدِّلات التباعد التلقائي بـ true مرة أخرى يعيد للمخطط اختيار ذلك الفاصل مرة أخرى.

تُنشئ العينة المستقلة التالية 24 فئة وسلسلة واحدة، ثم تحفظ ثلاث شرائح في CategoryAxisIntervals.pptx: تباعد تلقائي، تباعد يدوي للتسمية مع علامات فواصل مستقلة، وإعادة التباعد التلقائي. النسختان تحتفظان ببيانات المخطط الأصلية. لا يلزم عرض تقديمي كمدخل. يجعل نص التسمية الأفقي الفرق في الكثافة واضحًا.

import com.aspose.slides.*;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    IChart chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 30, 40, 660, 320);

    chart.setLegend(false);
    chart.getChartData().getCategories().clear();
    chart.getChartData().getSeries().clear();

    IChartDataWorkbook workbook = chart.getChartData().getChartDataWorkbook();
    workbook.clear(0);

    IChartSeries series = chart.getChartData().getSeries().add(ChartType.ClusteredColumn);
    for (int i = 0; i < 24; i++) {
        IChartDataCell categoryCell = workbook.getCell(0, i + 1, 0, "Category " + (i + 1));
        chart.getChartData().getCategories().add(categoryCell);
        IChartDataCell valueCell = workbook.getCell(0, i + 1, 1, 10 + i % 6 * 5);
        series.getDataPoints().addDataPointForBarSeries(valueCell);
    }

    IAxis axis = chart.getAxes().getHorizontalAxis();
    axis.setCategoryAxisType(CategoryAxisType.Text);
    axis.getTextFormat().getTextBlockFormat().setRotationAngle(0);
    axis.getTextFormat().getPortionFormat().setFontHeight(12);
    axis.setMajorTickMark(TickMarkType.Outside);
    axis.setAutomaticTickLabelSpacing(true);
    axis.setAutomaticTickMarksSpacing(true);

    // الشريحة 2: إظهار كل تسمية ثالثة، مع الحفاظ على علامة فاصل لكل فئة.
    ISlide manualSlide = presentation.getSlides().addClone(slide);
    IChart manualChart = (IChart)manualSlide.getShapes().get_Item(0);
    IAxis manualAxis = manualChart.getAxes().getHorizontalAxis();
    manualAxis.setAutomaticTickLabelSpacing(false);
    manualAxis.setTickLabelSpacing(3);
    manualAxis.setAutomaticTickMarksSpacing(false);
    manualAxis.setTickMarksSpacing(1);

    // الشريحة 3: السماح للمخطط باختيار كلا الفاصلين مرة أخرى.
    ISlide restoredSlide = presentation.getSlides().addClone(manualSlide);
    IChart restoredChart = (IChart)restoredSlide.getShapes().get_Item(0);
    restoredChart.getAxes().getHorizontalAxis().setAutomaticTickLabelSpacing(true);
    restoredChart.getAxes().getHorizontalAxis().setAutomaticTickMarksSpacing(true);

    presentation.save("CategoryAxisIntervals.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

التباعد التلقائي (الشريحة 1): في هذا العرض، تُعرض كل تسمية فئة ثانية وتُلتف إلى سطرين. قد يختلف الناتج التلقائي بناءً على حجم المخطط، الخطوط، والعارض.

تباعد تلقائي لتسميات الفئات مع رؤية جميع الأعمدة الـ24

التباعد اليدوي (الشريحة 2): تُعرض كل تسمية ثالثة على سطر واحد، بينما تظل علامات الفواصل عند كل فاصل فئوي. جميع الأعمدة الـ24، بما فيها غير المعنونة، تظل مرئية بنفس القيم. تستعيد الشريحة 3 المظهر التلقائي المعروض أعلاه.

تباعد يدوي لتسمية الفئة بثلاثة مع رؤية جميع الأعمدة الـ24

اختر المحور والفاصل الصحيح

استخدم هذا الفاصل القائم على عدد الفئات لمحور فئة نصية، مثل محور فئة عمودي، خطي، مساحي أو شريطي. في مخطط عمودي، يكون هو المحور الأفقي. في مخطط شريطي أفقي، يكون محور الفئة عموديًا، لذا طبق هذه الإعدادات على المحور المُسترجع بواسطة getVerticalAxis. ينطبق تباعد علامات الفواصل أيضًا على محور سلسلة في المخططات التي تحتوي على واحد.

لا تستخدم تباعد تسميات الفئة لتحديد المقياس الرقمي لمحور القيمة. في محور القيمة، تُحدد setMajorUnit فرق القيم: على سبيل المثال، وحدة رئيسية بقيمة 10 تُنتج علامات عند 0، 10، 20، وهكذا عندما يبدأ المحور من الصفر. فاصل تسمية الفئة 3 يعد مواقع الفئات بغض النظر عن قيمها. تستخدم مخططات التشتت والفقاعة محاور قيم بدلاً من محور فئة نصية. بالنسبة لمحور تاريخ، استخدم وحدات رئيسية زمنية ومقاييس كما هو موضح في Change a Category Axis.

تعيين تنسيق التاريخ لقيم محور الفئة

تستبدل العينة البيانات الافتراضية للمخطط بأربعة قيم سنوية. تُخزن التواريخ كأرقام تسلسلية لتقنية OLE Automation في ورقة العمل الأولى (الفهرس 0)، تُحسب كعدد الأيام منذ 30 ديسمبر 1899 لهذه التواريخ. استخدم setCategoryAxisType مع CategoryAxisType.Date، استدعِ setNumberFormatLinkedToSource بـ false، ومرّر yyyy إلى setNumberFormat لتظهر تسميات الفئة سنوات بأربع أرقام بشكل مستقل عن تنسيق الخلية.

import com.aspose.slides.*;
import java.time.LocalDate;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    IChart chart = slide.getShapes().addChart(ChartType.Line, 50, 50, 450, 300);

    chart.getChartData().getCategories().clear();
    chart.getChartData().getSeries().clear();

    IChartDataWorkbook workbook = chart.getChartData().getChartDataWorkbook();
    workbook.clear(0);

    LocalDate baseDate = LocalDate.of(1899, 12, 30);

    IChartSeries series = chart.getChartData().getSeries().add(ChartType.Line);
    for (int i = 0; i < 4; i++) {
        LocalDate date = LocalDate.of(2015 + i, 1, 1);
        IChartDataCell categoryCell = workbook.getCell(0, i + 1, 0, date.toEpochDay() - baseDate.toEpochDay());
        chart.getChartData().getCategories().add(categoryCell);

        IChartDataCell valueCell = workbook.getCell(0, i + 1, 1, i + 1);
        series.getDataPoints().addDataPointForLineSeries(valueCell);
    }

    chart.getAxes().getHorizontalAxis().setCategoryAxisType(CategoryAxisType.Date);
    chart.getAxes().getHorizontalAxis().setNumberFormatLinkedToSource(false);
    chart.getAxes().getHorizontalAxis().setNumberFormat("yyyy");

    presentation.save("DateAxisFormat.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

تعيين زاوية الدوران لعنوان محور المخطط

استدعِ setTitle بـ true على المحور الرأسي، قدم نص العنوان، واستخدم setRotationAngle لتدوير العنوان. تُقاس الزاوية بالدرجات؛ تحفظ هذه العينة مخطط عمودي بعنوان محوره القيمي مدورًا بزاوية 90 درجة.

import com.aspose.slides.*;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    IChart chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 50, 50, 450, 300);
    chart.getAxes().getVerticalAxis().setTitle(true);
    chart.getAxes().getVerticalAxis().getTitle().addTextFrameForOverriding("Value");
    chart.getAxes().getVerticalAxis().getTitle().getTextFormat().getTextBlockFormat().setRotationAngle(90);

    presentation.save("RotatedAxisTitle.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

تعيين موضع المحور على محور الفئة أو القيمة

استخدم setAxisBetweenCategories للتحكم فيما إذا كان محور القيمة يعبر محور الفئة بين الفئات أو عند علامات الفئة. ينطبق هذا الإعداد على محاور الفئة. تُعيّن العينة هذا إلى true على محور الفئة الأفقي لمخطط عمودي وتحفظ النتيجة.

import com.aspose.slides.*;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    IChart chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 50, 50, 450, 300);
    chart.getAxes().getHorizontalAxis().setAxisBetweenCategories(true);

    presentation.save("AxisBetweenCategories.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

تعيين وحدة العرض على محور قيمة المخطط

استخدم setDisplayUnit لتكبير أو تصغير تسميات محور القيمة دون تغيير البيانات الأساسية. مع ضبط DisplayUnitType على Millions، تُعرض القيمة 60,000,000 كـ 60. تنشئ العينة مخططًا عموديًا وتطبق وحدة العرض بالملايين على محوره الرأسي.

import com.aspose.slides.*;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    IChart chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 50, 50, 450, 300);
    chart.getAxes().getVerticalAxis().setDisplayUnit(DisplayUnitType.Millions);

    presentation.save("Result.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

الأسئلة المتكررة

كيف يمكنني تعيين القيمة التي يتقاطع عندها أحد المحاور مع الآخر (تقاطع المحور)؟

استخدم setCrossType لتحديد سلوك التقاطع. لتحديد قيمة تقاطع رقمية، استخدم setCrossAt. تسمح هذه الإعدادات بنقل تقاطع المحور إلى خط أساسي مناسب.

كيف يمكنني وضع تسميات العلامات بالنسبة إلى المحور؟

استدعِ setTickLabelPosition باستخدام TickLabelPositionType: Low، High، NextTo، أو None. للتحكم في علامات الفواصل نفسها، استخدم setMajorTickMark أو setMinorTickMark; هذه مستقلة عن وضع التسميات.