Chart

【C#】Chart 凡例の位置を変更する方法を分かりやすく解説

はじめに

Chartコントロールで、凡例の位置を変更する方法を解説します。結論を先に言ってしまうと、Legends.Positionを編集することで変更できます。

そもそもChartでグラフってどう作るの?という方は、以下の記事を先にご覧ください。

実行結果

後述するコードを実行すると、以下のように「凡例の位置を変更」することができます。比較のために変更あり/なしの結果を示します。

位置を指定しない場合

位置を指定しない場合、凡例は以下のように自動表示されます。

凡例の位置を設定しない場合、実行結果

位置を指定した場合

後述するコードで凡例の位置を指定すると、以下のように凡例の位置を変更することが出来ます。

凡例の位置を設定した場合、実行結果

全体コード

折れ線グラフを表示するコードを使って解説します。
58~63行目の、chart1.Legends[0].Positionへの設定で、凡例の位置を変更しています。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

// Chartクラス関連の変数の宣言を簡略化するために
// Usingを追加しています
using System.Windows.Forms.DataVisualization.Charting;

namespace ChartCustomize2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            // FormにChartコントロール(chart1)を
            // 貼り付け済みであることを前提にしています。


            // サンプル用のデータです。 
            double[] pointX = { 1.0, 2.0, 3.0, 4.0, 5.0 };
            double[] pointY = { 1.0, 2.0, 3.0, 4.0, 5.0 };

            //
            // 貼り付けたChartコントロールには、
            // 初期値のデータがセットされているので、一旦クリアします
            //
            chart1.ChartAreas.Clear();
            chart1.Series.Clear();
            chart1.Titles.Clear();

            // 「chartArea」という名前のエリアを生成します
            ChartArea chartArea = new ChartArea("chartArea");

            // 生成したエリアをChartコントロールに追加します
            chart1.ChartAreas.Add(chartArea);

            // チャートにタイトルを追加します
            chart1.Titles.Add("凡例の位置変更あり (手動)");
            
            // Series(系列)を生成します
            Series series = new Series();

            // 系列の種類を散布図に設定します
            series.ChartType = SeriesChartType.Line;

            // 系列の凡例を設置します
            series.LegendText = "凡例1";

            // 凡例自体の幅と高さを設定します
            chart1.Legends[0].Position.Width   = 20.0f;
            chart1.Legends[0].Position.Height  = 20.0f;

            // 位置をfloatで設定します(0~100)
            chart1.Legends[0].Position.X = 80.0f; 
            chart1.Legends[0].Position.Y = 90.0f;

            // ElementPositionオブジェクトを生成して代入しても設定できます。
            // ElementPosition posi = new ElementPosition(70.0f, 80.0f, 20.0f, 20.0f);
            // chart1.Legends[0].Position = posi;

            // 凡例の位置などの自動設定を無効化します
            chart1.Legends[0].Position.Auto = false;

            // 系列のポイント情報をセットします
            for (int i = 0; i < 5; i++)
            {
                series.Points.AddXY(pointX[i], pointY[i]);
            }

            // 生成・設定した系列をChartコントロールに追加します
            chart1.Series.Add(series);

        }
    }
}

コードのポイント

凡例の位置は Legends[0].Position.X/Y で指定

凡例の位置は chart1.Legends[0].Position.X, Y Floatで指定することで変更できます。


            // 位置をfloatで設定します(0~100)
            chart1.Legends[0].Position.X = 80.0f; 
            chart1.Legends[0].Position.Y = 90.0f;


数値はグラフエリアの左上からの相対座標(0~100)で指定します。以下のようなイメージです。

・左上 (X=0.0, Y=0.0)
・右下 (X=100.0, Y=100.0)

グラフエリアの座標を説明する画像

表示位置は、端に寄せすぎると下の画像のように文字列が隠れてしまいます。
余裕を持った位置に指定するか、後述する凡例のサイズを加味して設定してください。

位置を端にしすぎて表示されない場合の例
位置を端にしすぎた場合の例


凡例のサイズはPosition.Width / Heightで指定

凡例の大きさは、chart1.Legends[0].Position.Width, Height floatで指定します。

            // 凡例自体の幅と高さを設定します
            chart1.Legends[0].Position.Width   = 20.0f;
            chart1.Legends[0].Position.Height  = 20.0f;

凡例のサイズも、文字数に合わせないと隠れてしまうため、余裕を持った大きさに指定するか、最大文字数を加味したサイズに設定してください。

幅を短くしすぎて表示されない場合の例
幅が短すぎる 例

Position.Autoは設定 ”後” に有効化しない

前述したPositionの設定の後、 chart1.Legends[0].Position.Autoをtrueにすると、指定した値が無効化される(自動設定で上書きされる)ので注意してください。

Positionなどを手動設定(数値設定)すると、Position.Autoは「false」扱いとなるようです。不要なコードですが、記事内では説明のために明示的に「false」に設定しています。

まとめ

Chartコントロールで、凡例の位置を変更する方法を解説しました。参考になればうれしいです。

Lenovo Web広告限定ストア

エキスパートがよく使う「ThinkPad」や、コスパ抜群の「IdeaPad」がお得に購入できます。そろそろ、Macに負けない機能的なデザイン、フルカスタマイズしたPCが欲しい!とい方は以下のリンクからお得に購入してください。特別割引価格やクーポン情報がGETできます。

Lenovo

もっと詳しくChartの使い方を知る

このブログでは、Chartの他のテクニックについても解説しています。興味のある方は以下の記事もご覧ください。

応援・要望お待ちしてます

ブログを見ていて「この辺を詳しく知りたい」「このライブラリの使い方を知りたい」「こんなことで困ってる」...etc があれば、コメント・問い合わせ・Twitterで教えてください。質問・ご要望に合わせて解説記事を作ります。

ブログを気に入っていただけたり、「応援してもいいよ」という方がいたら、ブログやSNSでの紹介をお願いします。 あたたかい応援は、中の人の更新の大きな励みになります。

ABOUT ME
えす
現役のソフトウェアエンジニアです。 C++ C# Python を使ってます。10年ちょい設計/開発部門にいましたが、今はQAエンジニアっぽいことをしています。

COMMENT

メールアドレスが公開されることはありません。