|
■No100171 (さくらい さん) に返信
> また、指定した範囲に四角を表示するサンプルもありませんでした。
Chart Feature > Annotations > Annotations Types にいろいろサンプルコードがあり
ますが見ましたか?
サイズは Annotation.Width, Annotation.Height プロパティで設定しますが、それぞ
れ Chart.Width, Chart.Height のパーセントで指定しています。
位置は Annotation.X, Annotation.Y プロパティで設定しますが、これもやはり
Chart.Width, Chart.Height のパーセントで Chart の左上端からの位置を固定できる
ようです。
以下のコードで検証してみました。
using System;
using System.Data;
using System.Windows.Forms.DataVisualization.Charting;
using System.Windows.Forms;
namespace WindowsFormsChart
{
public partial class Form2 : Form
{
private Chart chart1;
private DataTable table;
public Form2()
{
InitializeComponent();
chart1 = new Chart
{
Location = new System.Drawing.Point(50, 50),
Width = 600
};
Controls.Add(chart1);
}
private void Form2_Load(object sender, EventArgs e)
{
// ここでは Chart は作らない。
// 下の「コンボボックスの初期値を設定」のところで
// ComboBox.SelectedIndexChangedイベントが発生するので
// ここで Chart を作ると、イベントハンドラでも Chart が作られて
// 意味不明な動きになるので。
table = new DataTable();
// データ名をつける
table.Columns.Add("A", typeof(double));
table.Columns.Add("B", typeof(double));
table.Columns.Add("C", typeof(double));
// 表にデータを格納
table.Rows.Add(new Object[] { 1, 5000000, 55 });
table.Rows.Add(new Object[] { 2, 4000000, 44 });
table.Rows.Add(new Object[] { 3, 3000000, 33 });
// コンボボックスに項目名を格納
comboBox1.Items.AddRange(new string[] { "A", "B", "C" });
comboBox2.Items.AddRange(new string[] { "A", "B", "C" });
//コンボボックスの初期値を設定
comboBox1.SelectedIndex = 0;
comboBox2.SelectedIndex = 0;
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
//コンボボックスで選び直したデータ名を読み込む
object Select_X = comboBox1.SelectedItem;
object Select_Y = comboBox2.SelectedItem;
// Form_Load の comboBox1.SelectedIndex = 0; でイベントが発生
// した時は comboBox2.SelectedItem は null なので何もしない
if (Select_X == null || Select_Y == null) return;
var X_Data = Select_X.ToString();
var Y_Data = Select_Y.ToString();
chart1.Series.Clear();
chart1.ChartAreas.Clear();
// グラフを描く空間を生成
ChartArea chartArea = new ChartArea();
chart1.ChartAreas.Add(chartArea);
// グラフの元となるデータの格納場所を生成
Series series1 = new Series();
//尋ねたデータ名を軸ラベルにする
chart1.ChartAreas[0].AxisX.Title = X_Data;
chart1.ChartAreas[0].AxisY.Title = Y_Data;
//データをグラフにプロット
for (int i = 0; i < table.Rows.Count; i++)
{
series1.Points.AddXY(table.Rows[i][X_Data], table.Rows[i][Y_Data]);
}
chart1.Series.Add(series1);
chart1.Annotations.Clear();
chart1.Annotations.Add(CreateRectangleAnnotation());
}
private void comboBox2_SelectedValueChanged(object sender, EventArgs e)
{
//コンボボックスで選び直したデータ名を読み込む
object Select_X = comboBox1.SelectedItem;
object Select_Y = comboBox2.SelectedItem;
// Form_Load の「コンボボックスの初期値を設定」順であれば null になる
// ことはなさそうだが念のため
if (Select_X == null || Select_Y == null) return;
var X_Data = Select_X.ToString();
var Y_Data = Select_Y.ToString();
chart1.Series.Clear();
chart1.ChartAreas.Clear();
// グラフを描く空間を生成
ChartArea chartArea = new ChartArea();
chart1.ChartAreas.Add(chartArea);
// グラフの元となるデータの格納場所を生成
Series series1 = new Series();
//尋ねたデータ名を軸ラベルにする
chart1.ChartAreas[0].AxisX.Title = X_Data;
chart1.ChartAreas[0].AxisY.Title = Y_Data;
//データをグラフにプロット
for (int i = 0; i < table.Rows.Count; i++)
{
series1.Points.AddXY(table.Rows[i][X_Data], table.Rows[i][Y_Data]);
}
chart1.Series.Add(series1);
chart1.Annotations.Clear();
chart1.Annotations.Add(CreateRectangleAnnotation());
}
private RectangleAnnotation CreateRectangleAnnotation()
{
RectangleAnnotation annotation = new RectangleAnnotation();
// 以下があると X, Y の意味が違ってくる(X 軸、Y 軸の数字に
// 関連してくる)のでコメントアウト
//annotation.AnchorDataPoint = chart1.Series[0].Points[2];
annotation.X = 20d; // Chart の左端から 20% 右の位置
annotation.Y = 20d; // Chart の上端から 20% 下の位置
annotation.Width = 50d; // Chart.Width の 50% の幅
annotation.Height = 50d; // Chart.Height の 50% の高さ
annotation.Text = "I am a\nRectangleAnnotation";
annotation.ForeColor = System.Drawing.Color.Black;
annotation.Font = new System.Drawing.Font("Arial", 12); ;
annotation.LineWidth = 2;
annotation.BackColor = System.Drawing.Color.PaleGreen;
annotation.LineDashStyle = ChartDashStyle.Dash;
return annotation;
}
}
}
結果は以下の画像のようになります。ComboBox の選択を変えるとグラフの表示が変わります
が RectangleAnnotation の位置は固定されます。試してみてください。
http://surferonwww.info/BlogEngine/image.axd?picture=2022%2f7%2f0708chart.jpg
|