سفارشی‌سازی محورهای نمودار در ارائه‌ها بر روی اندروید

نمای کلی

این مقاله توضیح می‌دهد چگونه محورهای نمودار را با Aspose.Slides برای Android از طریق 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 نیاز دارد که در اولین اسلاید اولین شکل آن یک نمودار باشد و سلول‌های دسته شامل مقادیر عددی تاریخ اکسل باشند. محور افقی را به محور تاریخ تغییر می‌دهد. با فراخوانی 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 تغییر دهید، نمودار دوباره به حالت خودکار برمی‌گردد.

مثال زیر به‌صورت خودکفا ۲۴ دسته و یک سری ایجاد می‌کند، سپس سه اسلاید در 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);

    // اسلاید ۲: هر برچسب سوم را نشان دهید، اما برای هر دسته یک تیک‌مارک نگه دارید.
    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);

    // اسلاید ۳: اجازه دهید نمودار دوباره هر دو فاصله را انتخاب کند.
    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): در این رندر، هر دومین برچسب دسته نمایش داده می‌شود و به دو خط می‌پیچد. نتیجه خودکار ممکن است با اندازه نمودار، فونت‌ها و رندرر متفاوت باشد.

فاصله خودکار برچسب دسته با همه ۲۴ ستون قابل مشاهده

فاصله دستی (اسلاید 2): هر سومین برچسب در یک خط نمایش داده می‌شود، در حالی که تیک‑مارک‌ها در هر فاصله دسته باقی می‌مانند. همه ۲۴ ستون، حتی آنهایی که برچسب ندارند، همان مقدار را نشان می‌دهند. اسلاید ۳ ظاهر خودکار بالا را بازمی‌گرداند.

فاصله دستی برچسب دسته به مقدار سه با همه ۲۴ ستون قابل مشاهده

انتخاب محور و فاصله صحیح

از این فاصله‌گذاری برای یک محور دسته‌بندی متنی استفاده کنید، مانند محور دسته‌بندی ستون، خط، ناحیه یا میله. در نمودار ستونی، این محور افقی است. در نمودار میله‌ای افقی، محور دسته‌بندی عمودی است، بنابراین این تنظیمات را بر روی محوری که توسط getVerticalAxis برگردانده می‌شود اعمال کنید. فاصله تیک‑مارک همچنین برای محور سری در نمودارهایی که دارند، صعود می‌کند.

از فاصله برچسب دسته برای تنظیم مقیاس عددی یک محور مقدار استفاده نکنید. در یک محور مقدار، setMajorUnit یک اختلاف مقدار را مشخص می‌کند؛ به عنوان مثال، واحد بزرگ 10 تیک‌ها را در 0، 10، 20 و غیره ایجاد می‌کند وقتی محور از صفر آغاز می‌شود. فاصله برچسب دسته 3 به جای مقادیر داده، موقعیت‌های دسته را می‌شمارد. نمودارهای پراکندگی و حباب از محورها مقادیر استفاده می‌کنند نه از محور دسته‌بندی متنی. برای محور تاریخ، از واحدهای بزرگ زمان‌محور و مقیاس‌های توصیف‌شده در بخش تغییر محور دسته‌بندی استفاده کنید.

تنظیم قالب تاریخ برای مقادیر محور دسته‌بندی

مثال داده‌های پیش‌فرض نمودار را با چهار مقدار سالانه جایگزین می‌کند. تاریخ‌ها به‌صورت شماره‌های سریال OLE Automation در اولین ورق کاری (شاخص 0) ذخیره می‌شوند که به‌عنوان تعداد روزها از 30 دسامبر 1899 محاسبه می‌شود. هر دو تقویم از UTC استفاده می‌کنند و پیش از تنظیم تاریخ‌ها پاک می‌شوند تا تغییر ساعت تابستانی و زمان فعلی بر محاسبه تأثیر نگذارد. با استفاده از setCategoryAxisType با CategoryAxisType.Date، setNumberFormatLinkedToSource را با false فراخوانی کنید و yyyy را به setNumberFormat پاس دهید تا برچسب‌های دسته سال‌های چهاررقمی را به‌صورت مستقل از قالب سلول نشان دهد.

import com.aspose.slides.*;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.TimeZone;

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);

    TimeZone timeZone = TimeZone.getTimeZone("UTC");
    Calendar baseDate = new GregorianCalendar(timeZone);
    baseDate.clear();
    baseDate.set(1899, Calendar.DECEMBER, 30);

    IChartSeries series = chart.getChartData().getSeries().add(ChartType.Line);
    for (int i = 0; i < 4; i++) {
        Calendar date = new GregorianCalendar(timeZone);
        date.clear();
        date.set(2015 + i, Calendar.JANUARY, 1);
        double serialDate = (date.getTimeInMillis() - baseDate.getTimeInMillis()) / 86400000.0;
        IChartDataCell categoryCell = workbook.getCell(0, i + 1, 0, serialDate);
        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 استفاده کنید؛ این تنظیمات مستقل از موقعیت برچسب‌ها هستند.