Android のプレゼンテーションでチャート軸をカスタマイズ
概要
この記事では、Aspose.Slides for Android via 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();
}
軸間のデータを入れ替える
swapRowColumn を使用して、チャートデータ内の系列とカテゴリの役割を入れ替えます。元のカテゴリは系列になり、元の系列はカテゴリになります。これはデータのグループ化方法を変更しますが、水平軸と垂直軸を入れ替えるわけではありません。例では setRange を使用してデフォルトデータを Sheet1!A1:D5(ヘッダー行とカテゴリ列を含む)にバインドし、行と列を入れ替える前に設定します。結果として、4 系列と 3 カテゴリを持つチャートが保存されます。
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();
}
折れ線グラフの垂直軸を非表示にする
垂直軸に対して false を指定して setVisible を呼び出し、軸を非表示にします。例ではデフォルトデータの折れ線グラフを作成し、垂直軸を非表示にした状態で保存します。
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();
}
折れ線グラフの水平軸を非表示にする
水平軸に対して false を指定して setVisible を呼び出し、軸を非表示にします。例ではデフォルトデータの折れ線グラフを作成し、水平軸を非表示にした状態で保存します。
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 日付が格納されているものです。水平軸を日付軸に変更します。false を指定して setAutomaticMajorUnit を呼び出し、setMajorUnit に 1、setMajorUnitScale に TimeUnitType.Months を指定すると、主要目盛りが 1 ヶ月間隔で配置されます。
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 |
カテゴリ 1, カテゴリ 2, カテゴリ 3, … カテゴリ 24 |
2 |
カテゴリ 1, カテゴリ 3, カテゴリ 5, … カテゴリ 23 |
3 |
カテゴリ 1, カテゴリ 4, カテゴリ 7, … カテゴリ 22 |
3 の間隔は 3 番目ごとのラベルだけを表示し、表示されたラベルの間に 2 つのラベルが非表示になります。対応する列は削除されません。自動間隔は利用可能なスペースに基づいて間隔を選択しますが、必ずしもすべてのラベルが表示されるわけではありません。
目盛りには個別の設定があります。setAutomaticTickMarksSpacing に false を渡し、setTickMarksSpacing で間隔を設定します。たとえば 1 を指定すると、すべてのカテゴリ間隔に目盛りが配置されますが、ラベルは 3 番目ごとにしか表示されません。可視スタイルで setMajorTickMark を使用すると結果が確認できます。自動間隔設定を true に戻すと、チャートが再び自動的に間隔を決定します。
以下の自己完結型サンプルは 24 個のカテゴリと 1 系列を作成し、CategoryAxisIntervals.pptx に3枚のスライドを保存します:自動間隔、ラベル間隔を手動で設定したもの(目盛りは独立)、自動間隔に戻したものです。2 つのコピーは元のチャートデータを保持します。入力プレゼンテーションは不要です。水平ラベルテキストにより、密度の違いが見やすくなります。
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);
// Slide 2: 3番目ごとのラベルを表示し、各カテゴリに目盛りを残す。
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);
// Slide 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): このレンダリングでは、2 番目のカテゴリラベルごとに表示され、2 行に折り返されます。自動結果はチャートのサイズ、フォント、レンダラにより変わります。

手動間隔 (スライド 2): 3 番目ごとのラベルが 1 行に表示され、目盛りはすべてのカテゴリ間隔に残ります。ラベルがない列も含め、すべての 24 列が同じ値で表示されます。スライド 3 は上記の自動表示に戻ります。

正しい軸と間隔を選択する
このカテゴリ数間隔は、列、折れ線、エリア、棒グラフなどのテキストカテゴリ軸に使用します。列グラフでは水平軸です。水平棒グラフではカテゴリ軸が垂直になるため、getVerticalAxis が返す軸に対して設定を適用します。目盛り間隔は、シリーズ軸を持つチャートのシリーズ軸にも適用できます。
カテゴリラベル間隔を使用して値軸の数値スケールを設定しないでください。値軸では、setMajorUnit が値の差を指定します。たとえば主要単位が 10 の場合、軸が 0 から開始すると 0、10、20… のように目盛りが配置されます。カテゴリラベル間隔 3 はデータ値に関係なくカテゴリ位置を 3 つごとにカウントします。散布図やバブルチャートはテキストカテゴリ軸ではなく値軸を使用します。日付軸の場合は、カテゴリ軸を変更する で説明した時間ベースの主要単位とスケールを使用してください。
カテゴリ軸値の日時書式を設定する
この例ではデフォルトのチャートデータを 4 年間の値に置き換えます。日付は最初のワークシート(インデックス 0)に OLE Automation のシリアル番号として格納され、1899 年 12 月 30 日からの日数として計算されます。両方のカレンダーは UTC で設定され、日付設定前にクリアされるため、夏時間や現在の時刻が計算に影響しません。setCategoryAxisType に CategoryAxisType.Date を指定し、setNumberFormatLinkedToSource に false、setNumberFormat に yyyy を渡すことで、セルの書式設定に関係なくカテゴリラベルが 4 桁の年で表示されます。
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();
}
チャート軸タイトルの回転角度を設定する
垂直軸に対して true を渡して setTitle を呼び出し、タイトルテキストを設定し、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();
}
FAQ
軸が他方の軸と交差する位置(軸交差点)をどのように設定しますか?
setCrossType を使用して交差動作を選択します。数値の交差位置を指定する場合は setCrossAt を使用します。これらの設定により、軸交差点を適切な基準線に移動できます。
目盛りラベルの位置を軸に対してどのように設定しますか?
TickLabelPositionType の Low、High、NextTo、None のいずれかを使用して、setTickLabelPosition を呼び出します。目盛り自体を制御するには、setMajorTickMark または setMinorTickMark を使用します。これらはラベル位置設定とは別です。