MSチャートでは、タイトルと凡例を簡単に追加できます。
アライメントでの指定では配置できる場所が限定されるようです。
もし好きな場所に配置したい場合はサンプルのように位置を指定しないといけません。
タイトルについて
アライメントではタイトルの配置位置のスペースがきちんと確保されるが、任意の位置への配置では確保されるわけではないので事前の調整が必要なようです。
またX、Yの値はチャートエリアでの位置を%で指定します。
凡例について
アライメントでは凡例の配置スペースがきちんと確保されるが、任意の位置への配置では確保されないようです。
ですので、グラフのエリアに重なるように配置する場合は線と重ならないように注意が必要です。
また任意の位置への配置を指定する時は、this.chart1.Legends[0].Position.Auto = falseも必要です。
X、Yは%ではなく座標で指定します。
C#
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
//追加分
using System.Data.SqlClient;
using System.Windows.Forms.DataVisualization.Charting;
namespace Chart_Legends
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
DataTable dt = new DataTable();
SqlConnectionStringBuilder connBldr = new SqlConnectionStringBuilder();
connBldr.DataSource = @".\SQLEXPRESS";
connBldr.InitialCatalog = "AdventureWorks2008";
connBldr.IntegratedSecurity = true;
SqlDataAdapter sda = new SqlDataAdapter();
using(SqlConnection conn = new SqlConnection(connBldr.ConnectionString))
{
using(SqlCommand cmd = new SqlCommand())
{
cmd.Connection = conn;
cmd.CommandText = "SELECT TOP 10 [ProductID],SUM([OrderQty] * [UnitPrice]) AS Sales, SUM([OrderQty]) AS Quantity FROM [AdventureWorks2008].[Sales].[SalesOrderDetail] GROUP BY [ProductID] ORDER BY [ProductID]";
sda.SelectCommand = cmd;
sda.Fill(dt);
}
}
this.dataGridView1.DataSource = dt;
this.chart1.Series[0].XValueMember = "ProductID";
this.chart1.Series[0].XAxisType = System.Windows.Forms.DataVisualization.Charting.AxisType.Primary;
this.chart1.Series[0].YValueMembers = "Sales";
this.chart1.Series[0].YValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.Double;
this.chart1.Series[0].Name = "売上金額";
Series ser2 = new Series();
ser2.Name = "売上個数";
ser2.XAxisType = AxisType.Primary;
ser2.XValueMember = "ProductID";
ser2.YAxisType = AxisType.Secondary;
ser2.YValueMembers = "Quantity";
ser2.YValueType = ChartValueType.Int32;
this.chart1.Series.Add(ser2);
ser2.ChartArea = this.chart1.ChartAreas[0].Name;
ser2.ChartType = SeriesChartType.Line;
Title tit = new Title("製品別売上");
this.chart1.Titles.Add(tit);
//アライメントでは上部にしかタイトルを置けないようです。
this.chart1.Titles[0].Alignment = ContentAlignment.TopCenter;
//上部以外にタイトルを起きたい場合は以下のように%で指定します。
//this.chart1.Titles[0].Position.X = 45;
//this.chart1.Titles[0].Position.Y = 98;
//アライメントで設定すると凡例用のスペースも考慮される。
//this.chart1.Legends[0].Alignment = StringAlignment.Center;
//自分で細かく指定したい場合は、以下のように全て設定しないといけない。
//また凡例のスペースは考慮されないのでグラフのエリアに重なる可能性が高いです。
this.chart1.Legends[0].Title = "凡例";
this.chart1.Legends[0].Position.Auto = false;
this.chart1.Legends[0].Position.Width = 15.0F;
this.chart1.Legends[0].Position.Height = 20.0F;
this.chart1.Legends[0].Position.X = 10.0F;
this.chart1.Legends[0].Position.Y = 13.0F;
this.chart1.DataSource = dt;
}
}
}
VB.NET
Imports System.Data.SqlClient
Imports System.Windows.Forms.DataVisualization.Charting
Public Class Form1
Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
Dim dt As DataTable = New DataTable()
Dim connBldr As SqlConnectionStringBuilder = New SqlConnectionStringBuilder()
connBldr.DataSource = ".\SQLEXPRESS"
connBldr.InitialCatalog = "AdventureWorks2008"
connBldr.IntegratedSecurity = True
Dim sda As SqlDataAdapter = New SqlDataAdapter()
Using conn As SqlConnection = New SqlConnection(connBldr.ConnectionString)
Using cmd As SqlCommand = New SqlCommand()
cmd.Connection = conn
cmd.CommandText = "SELECT TOP 10 [ProductID],SUM([OrderQty] * [UnitPrice]) AS Sales, SUM([OrderQty]) AS Quantity FROM [AdventureWorks2008].[Sales].[SalesOrderDetail] GROUP BY [ProductID] ORDER BY [ProductID]"
sda.SelectCommand = cmd
sda.Fill(dt)
End Using
End Using
Me.DataGridView1.DataSource = dt
Me.Chart1.Series(0).XValueMember = "ProductID"
Me.Chart1.Series(0).XAxisType = System.Windows.Forms.DataVisualization.Charting.AxisType.Primary
Me.Chart1.Series(0).YValueMembers = "Sales"
Me.Chart1.Series(0).YValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.Double
Me.Chart1.Series(0).Name = "売上金額"
Dim ser2 As Series = New Series()
ser2.Name = "売上個数"
ser2.XAxisType = AxisType.Primary
ser2.XValueMember = "ProductID"
ser2.YAxisType = AxisType.Secondary
ser2.YValueMembers = "Quantity"
ser2.YValueType = ChartValueType.Int32
Me.Chart1.Series.Add(ser2)
ser2.ChartArea = Me.Chart1.ChartAreas(0).Name
ser2.ChartType = SeriesChartType.Line
Dim tit As Title = New Title("製品別売上")
Me.Chart1.Titles.Add(tit)
'アライメントでは上部にしかタイトルを置けないようです。
Me.Chart1.Titles(0).Alignment = ContentAlignment.TopCenter
'上部以外にタイトルを起きたい場合は以下のように%で指定します。
'Me.chart1.Titles(0).Position.X = 45
'Me.chart1.Titles(0).Position.Y = 98
'アライメントで設定すると凡例用のスペースも考慮される。
'Me.chart1.Legends(0).Alignment = StringAlignment.Center
'自分で細かく指定したい場合は、以下のように全て設定しないといけない。
'また凡例のスペースは考慮されないのでグラフのエリアに重なる可能性が高いです。
Me.Chart1.Legends(0).Title = "凡例"
Me.Chart1.Legends(0).Position.Auto = False
Me.Chart1.Legends(0).Position.Width = 15.0F
Me.Chart1.Legends(0).Position.Height = 20.0F
Me.Chart1.Legends(0).Position.X = 10.0F
Me.Chart1.Legends(0).Position.Y = 13.0F
Me.Chart1.DataSource = dt
End Sub
End Class
