朧の.Netの足跡
問合せ先:support@oborodukiyo.info サイト内検索はこちら 
MSチャート タイトルと凡例のカスタマイズ





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








良いやや良い普通やや悪い悪い

投稿日時評価コメント