🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

Q&A

解決済

2回答

12487閲覧

C# chartの目盛にtextデータの時間を使いたい

hiro0215

総合スコア15

C#

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

1グッド

0クリップ

投稿2019/12/25 08:31

編集2020/01/14 07:15

お世話になります。C#独学中の者です。
皆さんのおかげでグラフ作成までこぎ着けた物の、どうしてもわからない場所がまた出てきたので質問させてください。

C#のchartコントロールを使ってグラフを作成しているのですが、X軸の目盛を任意の時間区切りで表示する方法がわかりません。
具体的には目盛りを10:00:00,11:00:00,12:00:00と一時間区切りにしたいのです。

C#

1using System; 2using System.Collections.Generic; 3using System.Text; 4using System.Windows.Forms; 5using System.IO; 6using System.Windows.Forms.DataVisualization.Charting; 7 8namespace グラフ 9{ 10 public partial class Form1 : Form 11 { 12 public Form1() 13 { 14 InitializeComponent(); 15 } 16 17 18 19 private void button1_Click(object sender, EventArgs e) 20 { 21 //textファイルから読み込み 22 int a = 0; 23 List<string> list = new List<string>(); 24 StreamReader sr = new StreamReader("textファイルのパス", Encoding.Default); 25 while (sr.Peek() >= 0) 26 { 27 string line = ""; 28 29 while ((line = sr.ReadLine()) != null) 30 { 31 a++; 32 list.Add(line); 33 } 34 35 } 36 sr.Close(); 37 sr.Dispose(); 38 39 string legend = "グラフ1"; 40 41 chart1.Series.Clear(); //グラフ初期化 42 chart1.ChartAreas[0].AxisY.Maximum = 2.5; 43 chart1.ChartAreas[0].AxisY.Minimum = 1.5; 44 chart1.Series.Add(legend); //グラフ追加 45 chart1.Series[legend].ChartType =SeriesChartType.Line;//折れ線グラフ 46 chart1.Series[legend].LegendText = legend; //凡例に表示するテキストを指定 47 48 for (int i = 0; i < chart1.Series.Count; i++)//凡例非表示 49 { 50 chart1.Series[i].IsVisibleInLegend = false; 51 chart1.Series[i].IsValueShownAsLabel = false; 52 } 53 54 for (int n = 0; n <a; n++) 55 { 56 string[] xValues = new string[] { list[n].Substring(0,8) };//(時間部分「12:34:56」) 57 string[] yValues = new string[] { list[n].Substring(12,4) };//(数値部分「2.34」等) 58 59 for (int i = 0; i < xValues.Length; i++) 60 { 61 //グラフに追加するデータクラスを生成 62 DataPoint dp = new DataPoint(); 63 dp.SetValueXY(xValues[i], yValues[i]); //XとYの値を設定 64 dp.IsValueShownAsLabel = false ; //グラフに値を表示するように指定 65 chart1.Series[legend].Points.Add(dp); //グラフにデータ追加 66 } 67 } 68 } 69 } 70} 71 72

イメージ説明

ボタンを押すとtextファイルを読み込んでchartエリアにグラフを表示します。
textデータには「12:34:56」といった形の時間データと数値データが大量に入っています。これをListに格納後、DataPointのX軸に入れています。
現状だとグラフ作成時に勝手に配置された時間がラベルで表示されているので、時間軸の最小値や任意の時間区切りにしたいのですが、Listに入れたままだと型なのでdouble型としてX軸のMinimumなどの値に使う事ができません。

このグラフの場合ですとX軸の起点を12:00:00と表示し、その後1時間毎に目盛りと線を13:00:00,14:00:00・・・最後を17:00:00と表示したいとかんがえています。

何か良い方法は無いでしょうか?
質問の仕方がおかしいかもしれませんが、どうかよろしくおねがいします。

追記:どうやらカスタムラベルという物を使えばやりたいことが出来そうなのですが使い方がわかりません・・・。

TN8001👍を押しています

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/12/26 03:25

質問のコードで表示される現状の Chart の画像を貼れませんか? そしてそれのどこをどのような改善したいのかを説明に加えることはできませんか?
hiro0215

2020/01/09 04:04

遅くなり申し訳ありません。 X軸の14:15:00や15:55:00となってるところ(ラベル?)を一番左を12:00:00で始まり、一時間毎に目盛りを置いていきたいのです。よろしくおねがいします。
guest

回答2

0

時刻として扱いたいのであれば、DateTime型に変換しましょう。
そして、Series.XValueTypeプロパティでTimeを表示するように設定します。

それで、Chartコントロールの設定で
Axis.Intervalプロパティ
Axis.IntervalTypeプロパティ
Axis.IntervalOffsetプロパティ
Axis.IntervalOffsetTypeプロパティ
を設定し、希望の表示になるようにしてください。

追記

X軸の原点を指定する場合
Axis.Minimumプロパティを設定します。
このプロパティはdouble型となるため、DateTimeを設定する場合はdouble型に変換してやる必要があります。
DateTime型をdoubleにするにはDateTime.ToOADateメソッドで変換してやります。
ここまでで、正時をX軸の原点とできるはずです。
そして、Axis.Intervalプロパティ、Axis.IntervalTypeプロパティを設定すれば、間隔が変更されます。

投稿2019/12/26 04:00

編集2020/01/14 08:06
YAmaGNZ

総合スコア10469

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

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

hiro0215

2019/12/26 07:29

時刻にあたる部分をDateTime型には変換する事はできました。 サイトを見に行ってみたのですがSeries.XValueType プロパティを使う事によって、DateTime型が.NET Framework によっDouble値として内部的に格納されるという事はわかりました。(あってるのかな?) しかし、どのように扱ったらよいのかはわかりませんでした。 どのように扱ったらよいのか教えていただけないでしょうか? もしよろしければ、
YAmaGNZ

2019/12/26 07:36

DataPointのX側のデータとしてDateTime型でセットします。 dp.SetValueXY(xValues[i], yValues[i]);のxValues[i]のことです。 そして、Series.XValueTypeを時間として指定してやれば、X軸が時間軸となります。 そして、Interval系の設定をしてやれば、X軸の見出しを1時間毎にできます。
Wind

2019/12/26 07:37

横からですが、Double値として扱う時は24時間を0.0~1.0と扱います。 1時間は1.0/24.0=0.041666666...となります。 12時起点なら0.5を起点とし、1時間毎なら0.04166666...毎となります。
hiro0215

2020/01/16 01:01

補足までいただいてありがとうございます! どうやら変換の方法だったり数値の設定だったりと間違った部分が多数あったようです・・・。 せっかくいただいたサイトも自分の知識不足から理解できない部分も多く、他の方のコードを見てやっと少し理解できた次第です。 これからも勉強にはげんでいきたいと思います。
guest

0

ベストアンサー

Chartコントロールは使ったことがないので何か間違いがあるかもしれませんが、それっぽく表示されているように思います。

アプリ画像

cs

1using System; 2using System.IO; 3using System.Text; 4using System.Windows.Forms; 5using System.Windows.Forms.DataVisualization.Charting; 6 7namespace Questions231716 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 var list = File.ReadAllLines("test.csv"); 20 21 var legend = "グラフ1"; 22 chart1.Series.Clear(); 23 24 // Minimum Maximum ちょっと微妙 25 chart1.ChartAreas[0].AxisX.Minimum = DateTime.MinValue.AddHours(12).ToOADate(); 26 chart1.ChartAreas[0].AxisX.Maximum = DateTime.MinValue.AddHours(17).ToOADate(); 27 chart1.ChartAreas[0].AxisX.Interval = 1; 28 chart1.ChartAreas[0].AxisX.IntervalType = DateTimeIntervalType.Hours; 29 chart1.ChartAreas[0].AxisX.IntervalOffsetType = DateTimeIntervalType.Hours; 30 chart1.ChartAreas[0].AxisX.LabelStyle.Format = "HH:mm:ss"; 31 32 chart1.ChartAreas[0].AxisY.Minimum = 1.5; 33 chart1.ChartAreas[0].AxisY.Maximum = 2.5; 34 35 chart1.Series.Add(legend); 36 chart1.Series[legend].ChartType = SeriesChartType.Line; 37 chart1.Series[legend].LegendText = legend; 38 chart1.Series[legend].XValueType = ChartValueType.Time; 39 chart1.Series[legend].IsVisibleInLegend = false; 40 chart1.Series[legend].IsValueShownAsLabel = false; 41 42 foreach(var line in list) 43 { 44 // ここも微妙だが日付は固定したほうが安全そう 45 var xValue = DateTime.Parse("0001/01/01 " + line.Substring(0, 8)); 46 var yValue = line.Substring(12, 4); 47 48 var dp = new DataPoint(); 49 dp.SetValueXY(xValue, yValue); 50 dp.IsValueShownAsLabel = false; 51 chart1.Series[legend].Points.Add(dp); 52 } 53 } 54 55 private void Dammy() 56 { 57 var r = new Random(); 58 var sb = new StringBuilder(); 59 var d = DateTime.MinValue.AddHours(12); 60 while(true) 61 { 62 d += TimeSpan.FromSeconds(r.Next(60, 600)); 63 if(17 <= d.Hour) break; 64 sb.Append(d.ToString("HH:mm:ss")); 65 sb.Append(",00,"); 66 sb.AppendLine((r.NextDouble() + 1.5).ToString("0.00")); 67 } 68 69 File.WriteAllText("test.csv", sb.ToString()); 70 } 71 } 72}

投稿2020/01/14 09:14

編集2023/07/17 13:54
TN8001

総合スコア9855

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

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

hiro0215

2020/01/16 00:57

コードと画像ありがとうございます!やりたかった事はこれです。 色々と設定が足りてなかったり、データの入れ方が違ったりしたようですね。 いただいたコードを参考に何がどう作用しているのか学習したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問