GrapeCity.devlog

グレープシティ株式会社のDeveloper Tools〈開発支援ツール〉の最新情報をお届けします。製品のTIPSや発売情報、イベントのお知らせなどをいち早く発信中です。

チャートの作成を完全に制御する方法

こんにちは、SPREADチームの小津です。今日はチャートについてお話ししたいと思います。 チャートには、いくつか作成方法があります:

  • Excelファイルからインポートする
  • SheetViewクラスのAddChartメソッドを使用する
  • プロットエリアを初期化してイチからチャートを作成する

多くの場合、2番目の方法のAddChartメソッドで半ば自動的にチャートを作成できます。こういう便利さは、SPREADの魅力の一つですよね。 ただ、SPREADの既定の設定が要件とマッチしないこともあります。たとえば次のデータ:

ozu_dec0

このデータを使用して、AddChartメソッドで集合棒チャートを作成したとします。作成されるチャートは次のとおりです。

ozu_dec1

※データが「本店」と「駅前支店」で分類されています。

でも、作成したいチャートは、データを「前年」と「今年」で分類した、次のようなものだったとします。

ozu_dec2

こんなときに役立つのが、プロットエリアを初期化してイチからチャートを作成する方法です。チャートの作成を完全に制御できます。以下、サンプルコードをご紹介したいと思います。 なお、以降でご紹介するコードは、ファイル冒頭に次のImports句(C#ではusing句)を追加してご利用ください。

 ' VBの場合
Imports FarPoint.Win.Chart
Imports FarPoint.Win.Spread
Imports FarPoint.Win.Spread.Model
Imports FarPoint.Win.Spread.Chart
// C#の場合
using FarPoint.Win.Chart;
using FarPoint.Win.Spread;
using FarPoint.Win.Spread.Model;
using FarPoint.Win.Spread.Chart;

Visual Basic

Dim values As Object(,) = {{"", "本店", "駅前支店"}, {"前年", 3000, 1500}, {"今年", 2500, 2200}}
FpSpread1.Sheets(0).SetArray(0, 0, values)

' SheetViewクラスのAddChartメソッドを使用した方法
'FpSpread1.ActiveSheet.AddChart(New CellRange(0, 0, 3, 3), GetType(ClusteredBarSeries), 400, 400, 10, 70)

' プロットエリアを初期化してイチからチャートを作成する方法
Dim plotArea As New YPlotArea()
Dim cSeries As New ClusteredBarSeries()
'系列(本店)の作成
Dim s1 As New BarSeries()
s1.Values.DataSource = New SeriesDataField(FpSpread1, "DataFieldValue", "Sheet1!B2:B3")
s1.CategoryNames.DataSource = New SeriesDataField(FpSpread1, "DataFieldCategoryName", "Sheet1!A2:A3", SegmentDataType.Text)
s1.SeriesNameDataSource = New SeriesDataField(FpSpread1, "DataFieldSeriesName", "Sheet1!B1", SegmentDataType.Text)

'系列(駅前支店)の作成
Dim s2 As New BarSeries()
s2.Values.DataSource = New SeriesDataField(FpSpread1, "DataFieldValue", "Sheet1!C2:C3")
s2.SeriesNameDataSource = New SeriesDataField(FpSpread1, "DataFieldSeriesName", "Sheet1!C1", SegmentDataType.Text)

cSeries.Series.Add(s1)
cSeries.Series.Add(s2)
plotArea.Series.Add(cSeries)

Dim model As New ChartModel()
model.PlotAreas.Add(plotArea)
model.LegendAreas.Add(New LegendArea())
'チャートオブジェクトの作成
Dim spChart1 As New SpreadChart() With {
 .Size = New Size(400, 400),
 .Location = New Point(10, 70),
 .Model = model
}
FpSpread1.ActiveSheet.Charts.Add(spChart1)

C#

object[,] values = { { "", "本店", "駅前支店" }, { "前年", 3000, 1500 }, { "今年", 2500, 2200 } };
fpSpread1.Sheets[0].SetArray(0, 0, values);

// SheetViewクラスのAddChartメソッドを使用した方法
//fpSpread1.ActiveSheet.AddChart(new CellRange(0, 0, 3, 3), typeof(ClusteredBarSeries), 400, 400, 10, 70);

// プロットエリアを初期化してイチからチャートを作成する方法
YPlotArea plotArea = new YPlotArea();
ClusteredBarSeries cSeries = new ClusteredBarSeries();
//系列(本店)の作成
BarSeries s1 = new BarSeries();
s1.Values.DataSource = new SeriesDataField(fpSpread1, "DataFieldValue", "Sheet1!B2:B3");
s1.CategoryNames.DataSource = new SeriesDataField(fpSpread1, "DataFieldCategoryName", "Sheet1!A2:A3", SegmentDataType.Text);
s1.SeriesNameDataSource = new SeriesDataField(fpSpread1, "DataFieldSeriesName", "Sheet1!B1", SegmentDataType.Text);

//系列(駅前支店)の作成
BarSeries s2 = new BarSeries();
s2.Values.DataSource = new SeriesDataField(fpSpread1, "DataFieldValue", "Sheet1!C2:C3");
s2.SeriesNameDataSource = new SeriesDataField(fpSpread1, "DataFieldSeriesName", "Sheet1!C1", SegmentDataType.Text);

cSeries.Series.Add(s1);
cSeries.Series.Add(s2);
plotArea.Series.Add(cSeries);

ChartModel model = new ChartModel();
model.PlotAreas.Add(plotArea);
model.LegendAreas.Add(new LegendArea());
//チャートオブジェクトの作成
SpreadChart spChart1 = new SpreadChart()
{
 Size = new Size(400, 400),
 Location = new Point(10, 70),
 Model = model
};
fpSpread1.ActiveSheet.Charts.Add(spChart1); 

なお、この方法、来年2月発売予定のSPREAD for Windows Formsの次期バージョン10Jの新機能:

この新機能を使用して、チャートからSPREADのデータを参照するときにも役立ちます。その話は、また後日!