質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

8117閲覧

c#グラフのラベル間隔の変え方

hiro0215

総合スコア15

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

1グッド

0クリップ

投稿2020/01/19 03:25

いつも皆さんに教えていただきながらグラフを作成しています。
前回時間軸の表示方法でお世話になりました。
今回はY軸の目盛り間隔の変え方について教えてください。
visualstudioのフォームアプリで作成しています。

c#

1コードusing System; 2using System.Collections.Generic; 3using System.Drawing; 4using System.Text; 5using System.Windows.Forms; 6using System.IO; 7using System.Drawing.Imaging; 8using System.Windows.Forms.DataVisualization.Charting; 9 10namespace グラフ 11{ 12 public partial class Form1 : Form 13 { 14 public Form1() 15 { 16 InitializeComponent(); 17 } 18 19 20 21 private void button1_Click(object sender, EventArgs e) 22 { 23 24 List<string> list = new List<string>(); 25 26 //textファイル読み込み 27 StreamReader sr = new StreamReader("ファイル名", Encoding.Default); 28 while (sr.Peek() >= 0) 29 { 30 string line = ""; 31 32 while ((line = sr.ReadLine()) != null) 33 { 34 list.Add(line); 35 } 36 } 37 sr.Close(); 38 sr.Dispose(); 39 40 41 chart1.Series.Clear(); 42 chart1.Legends.Clear(); 43 chart1.ChartAreas.Clear(); 44 chart1.Hide(); 45 46 chart1.ChartAreas.Add(new ChartArea("1")); 47 48 49 50 // Seriesの作成 51 Series series1 = new Series(); 52 series1.ChartArea = "1"; 53 series1.ChartType = SeriesChartType.Line; 54 55 56 chart1.ChartAreas[0].AxisX.Minimum = DateTime.MinValue.AddHours(8).ToOADate(); 57 chart1.ChartAreas[0].AxisX.Maximum = DateTime.MinValue.AddHours(17).ToOADate(); 58 chart1.ChartAreas[0].AxisX.Interval = 1; 59 chart1.ChartAreas[0].AxisX.IntervalType = DateTimeIntervalType.Hours; 60 chart1.ChartAreas[0].AxisX.IntervalOffsetType = DateTimeIntervalType.Hours; 61 chart1.ChartAreas[0].AxisX.LabelStyle.Format = "HH:mm:ss"; 62 63 chart1.ChartAreas[0].AxisY.Maximum = 3; 64 chart1.ChartAreas[0].AxisY.Minimum = 1; 65 66 chart1.Series.Add(series1); 67 chart1.Series[0].ChartType = SeriesChartType.Line; 68 chart1.Series[0].XValueType = ChartValueType.Time; 69 chart1.Series[0].IsVisibleInLegend = false; 70 chart1.Series[0].IsValueShownAsLabel = false; 71 72 foreach (var line in list) 73 { 74 75 var xValue = DateTime.Parse("0001/01/01 " + " "+line.Split('\t')[0]); 76 var yValue = line.Split('\t')[1]; 77 var dp = new DataPoint(); 78 dp.SetValueXY(xValue, yValue); 79 dp.IsValueShownAsLabel = false; 80 chart1.Series[0].Points.Add(dp); 81 } 82 } 83 } 84}

現在Y軸の値を最低が1、最高が3で設定しているのですが、間のラベルを1.2, 2, 2.7と自分の指定した形にしたいのですが、customRavelの使い方がわからず思うように表示する事ができません。
もしかしたらcustomRavelを使うという考え方も間違えてるのかもしれませんが、やり方を教えていただけないでしょうか。
よろしくお願いします。

TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/01/19 23:46 編集

サンプルをくまなく探したが希望するものが見つからなかったと言ってますか? (そうだと言われると自分の知識の及ぶ話ではなさそうなので聞いてます)
hiro0215

2020/01/20 00:29

自分の探しかたが悪いのか、具体的なサンプルが書いてあるサイトを見つけられず、DOCS等で概要などを読んだのですが理解ができなかった次第です。
退会済みユーザー

退会済みユーザー

2020/01/20 00:54

サンプルというのは先の質問者さんのスレッド https://teratail.com/questions/230445 の私の回答の画像にあるものですが、認識は合っているでしょうか?
hiro0215

2020/01/20 01:34

前回この画像をいただいた時は、他の質問者様のところに提示してくださってるアドレスでサンプル取得のサイトも見に行ってサンプル取得を試みたのですが、どれをダウンロードしたらよいかわからず諦めてしまい、その結果、いただいた画像のコードからなんとか答えが導き出せないかと試行錯誤していました。 なので、こちらのサンプルの取得方法がわかっていません。申し訳ありません。
退会済みユーザー

退会済みユーザー

2020/01/20 06:20

ダウンロードサイトから何を入手すればよいかとインストール方法は以下の記事を見てください。 Chart Samples http://surferonwww.info/BlogEngine/post/2016/02/14/chart-samples.aspx ・・・と思ったら、ダウンロードサイトがいつの間にかリンク切れになってました。残念ながら質問者さんがダウンロードサイトを訪れた時ダウンロードしてなければサンプルを入手する手段はなさそうです。 もしその時ダウンロードだけはしていたなら、上記の記事を参考にインストールしてみてください。
BluOxy

2020/01/20 07:56

1.2, 2, 2.7と間隔の例を提示していますが、等間隔ではないのでしょうか。
BluOxy

2020/01/20 08:04

> ラベル間隔 > Y軸の目盛り間隔 ラベル間隔という表現がいまいちわかりません。と思いきや、Y軸の目盛り間隔と書いてあるので、余計わかりませんでした。グリッド線の間隔を指定したいということでしょうか。
hiro0215

2020/01/20 09:55

遅くなり申し訳ありません。 y軸のグリッド線及びラベルを等間隔ではなく上記の間隔で配置したいということです。 よろしくおねがいします。
guest

回答3

0

ベストアンサー

Chartコントロールは使ったことがないので何か間違いがあるかもしれませんが、それっぽく表示されているように思います。
アプリ画像
CustomLabel クラスの使い方がよくわかっていませんが、ラベルの値が中央に来るようにfromPositiontoPositionを選択すればいいみたいです。

  • 2を表示したい場合
    new CustomLabel(1.9, 2.1, "2",でもnew CustomLabel(1, 3, "2",でも、中央値が2になればなんでもいいみたいです(しかしnew CustomLabel(2, 2, "2",はダメです)

GridTickTypes.Allにすると普通のグリッド線のようになります。
LabelMarkStyleはよくわかりません。

cs

1using System; 2using System.IO; 3using System.Text; 4using System.Windows.Forms; 5using System.Windows.Forms.DataVisualization.Charting; 6 7namespace Questions236057 8{ 9 public partial class Form1 : Form 10 { 11 public Form1() 12 { 13 InitializeComponent(); 14 Dammy(); 15 } 16 17 private void button1_Click(object sender, EventArgs e) 18 { 19 chart1.Series.Clear(); 20 chart1.Legends.Clear(); 21 chart1.ChartAreas.Clear(); 22 //chart1.Hide(); 23 24 chart1.ChartAreas.Add(new ChartArea("1")); 25 26 chart1.ChartAreas[0].AxisX.Minimum = DateTime.MinValue.AddHours(8).ToOADate(); 27 chart1.ChartAreas[0].AxisX.Maximum = DateTime.MinValue.AddHours(17).ToOADate(); 28 chart1.ChartAreas[0].AxisX.Interval = 1; 29 chart1.ChartAreas[0].AxisX.IntervalType = DateTimeIntervalType.Hours; 30 chart1.ChartAreas[0].AxisX.IntervalOffsetType = DateTimeIntervalType.Hours; 31 chart1.ChartAreas[0].AxisX.LabelStyle.Format = "HH:mm:ss"; 32 33 chart1.ChartAreas[0].AxisY.Maximum = 3; 34 chart1.ChartAreas[0].AxisY.Minimum = 1; 35 chart1.ChartAreas[0].AxisY.CustomLabels.Add(new CustomLabel(0.9, 1.1, "1", 0, LabelMarkStyle.None, GridTickTypes.All)); 36 chart1.ChartAreas[0].AxisY.CustomLabels.Add(new CustomLabel(1.1, 1.3, "1.2", 0, LabelMarkStyle.None, GridTickTypes.All)); 37 chart1.ChartAreas[0].AxisY.CustomLabels.Add(new CustomLabel(1.9, 2.1, "2", 0, LabelMarkStyle.None, GridTickTypes.All)); 38 chart1.ChartAreas[0].AxisY.CustomLabels.Add(new CustomLabel(2.6, 2.8, "2.7", 0, LabelMarkStyle.None, GridTickTypes.All)); 39 chart1.ChartAreas[0].AxisY.CustomLabels.Add(new CustomLabel(2.9, 3.1, "3", 0, LabelMarkStyle.None, GridTickTypes.All)); 40 41 //位置があってるか検証用コード 42 //chart1.ChartAreas[0].AxisY2.Maximum = 3; 43 //chart1.ChartAreas[0].AxisY2.Minimum = 1; 44 //chart1.ChartAreas[0].AxisY2.Interval = 0.1; 45 //chart1.ChartAreas[0].AxisY2.Enabled = AxisEnabled.True; 46 47 48 var series1 = new Series 49 { 50 ChartArea = "1", 51 ChartType = SeriesChartType.Line, 52 XValueType = ChartValueType.Time, 53 IsVisibleInLegend = false, 54 IsValueShownAsLabel = false, 55 }; 56 chart1.Series.Add(series1); 57 58 var list = File.ReadAllLines("test.tsv"); 59 foreach(var line in list) 60 { 61 var xValue = DateTime.Parse("0001/01/01 " + line.Split('\t')[0]); 62 var yValue = line.Split('\t')[1]; 63 var dp = new DataPoint(); 64 dp.SetValueXY(xValue, yValue); 65 dp.IsValueShownAsLabel = false; 66 chart1.Series[0].Points.Add(dp); 67 } 68 } 69 70 private void Dammy() 71 { 72 var r = new Random(); 73 var sb = new StringBuilder(); 74 var d = DateTime.MinValue.AddHours(8); 75 while(true) 76 { 77 d += TimeSpan.FromSeconds(r.Next(60, 600)); 78 if(17 <= d.Hour) break; 79 sb.Append(d.ToString("HH:mm:ss")); 80 sb.Append("\t"); 81 sb.AppendLine((r.NextDouble() + 1.5).ToString("0.00")); 82 } 83 84 File.WriteAllText("test.tsv", sb.ToString()); 85 } 86 } 87}

投稿2020/01/21 09:18

編集2023/07/18 21:34
TN8001

総合スコア9244

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hiro0215

2020/01/22 06:52

カスタムラベルとはこう使うのですね GridTickTypesを変えるとラベルだけにしたりグリッド線だけにしたりできそうですね。 一番理想の形だったのでBAとさせていただきました。
guest

0

C#

1float[] yValues = { 1.2f, 2.0f, 2.7f }; 2foreach (var value in yValues) 3{ 4 StripLine stlipLine = new StripLine 5 { 6 Text = $"{value}", 7 TextAlignment = StringAlignment.Near, 8 TextLineAlignment = StringAlignment.Far, 9 Interval = 0, 10 IntervalOffset = value, 11 BorderWidth = 1, 12 BorderColor = Color.Blue, 13 }; 14 chart1.ChartAreas[0].AxisY.StripLines.Add(stlipLine); 15}

このようにStripLineで下図のような状態にはできます。
イメージ説明

投稿2020/01/21 03:36

YAmaGNZ

総合スコア10222

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hiro0215

2020/01/21 04:32

このような方法があったのですね。 ありがとうございます。 もう一点質問なのですが、このラベル(1.2等)を枠の外に出すことは可能でしょうか? よろしくお願いします。
YAmaGNZ

2020/01/21 04:42

StripLineでは出来ないと思います。 もし、Y軸の左側に描画するのであれば、PrePaintイベントで自分で描画する方法になるのではないかと思います。
guest

0

Y軸の目盛り間隔の変え方について教えてください。

Axis.Interval プロパティを使うことで目盛りの間隔≒グリッド線の間隔を決めることができます。

C#

1chart1.ChartAreas[0].AxisY.Interval = 0.8;

表示の差異

表示差異

追記に対する回答

y軸のグリッド線及びラベルを等間隔ではなく上記の間隔で配置したい

グリッドの間隔を任意に設定するためのプロパティが見つからないため、用意されていなければ既存のChartAreaでは実装できません。

等間隔に設定できるよう設計を変えるか、カスタムのコントロールを作る必要があると思います。

投稿2020/01/20 08:12

編集2020/01/20 10:21
BluOxy

総合スコア2663

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hiro0215

2020/01/21 02:55

調べてみたのですが、自分の調べ方が悪いのかchartのカスタムコントロールの設定方法や使い方を見つける事ができませんでした・・・。 もしよろしければ詳しく教えていただくことはできないでしょうか?
BluOxy

2020/01/21 04:05 編集

カスタムコントロールを作るのは覚えたり作ったりする手間が大きいので、YAmaGNZさんの案を採用してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問