C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

csvから散布図グラフの作成 /usushio (19/01/04(Fri) 15:28) #89815
Re[1]: csvから散布図グラフの作成 /Azulean (19/01/04(Fri) 22:00) #89816
  └ Re[2]: csvから散布図グラフの作成 /usushio (19/01/05(Sat) 11:08) #89817
    └ Re[3]: csvから散布図グラフの作成 /Azulean (19/01/05(Sat) 18:04) #89822
      └ Re[4]: csvから散布図グラフの作成 /usushio (19/01/07(Mon) 10:58) #89833
        └ Re[5]: csvから散布図グラフの作成 /Azulean (19/01/07(Mon) 22:10) #89839
          └ Re[6]: csvから散布図グラフの作成 /usushio (19/01/09(Wed) 11:18) #89860 解決済み


親記事 / ▼[ 89816 ]
■89815 / 親階層)  csvから散布図グラフの作成
□投稿者/ usushio (6回)-(2019/01/04(Fri) 15:28:50)

分類:[C#] 

Visual Studio2017 C# で開発を行っています。

ボタンクリックでダイアログを表示、csvファイルを選んだらOK
その後、散布図に出力とゆう処理を行いたいと思っております。
複数のグラフを表示させたい場合には、それぞれの数値を収納しておく場所を作成しなければなりませんか?

また、この処理を行う大まかな流れをご教授ください。

csvファイルは練習用として正弦波、余弦波、経過時間の3列を
1周期分のグラフを作成できる程度です。

[ □ Tree ] 返信 編集キー/

▲[ 89815 ] / ▼[ 89817 ]
■89816 / 1階層)  Re[1]: csvから散布図グラフの作成
□投稿者/ Azulean (1022回)-(2019/01/04(Fri) 22:00:08)
No89815 (usushio さん) に返信
> ボタンクリックでダイアログを表示、csvファイルを選んだらOK
> その後、散布図に出力とゆう処理を行いたいと思っております。
> 複数のグラフを表示させたい場合には、それぞれの数値を収納しておく場所を作成しなければなりませんか?
>
> また、この処理を行う大まかな流れをご教授ください。

この手のプログラムを書くとき、課題を細かく分けて、1 つずつ解決策を考えて、組み立てた方が良いことが多いです。

1. まずは 1 つのグラフ、PointF 型、KeyValuePair 型など、X と Y をペアを List 型などのリスト構造で管理することを考える。
 例:List<PointF> _pointList;
2. 続いて、その構造をさらに List 型などの構造で管理するか、数が決まっているなら決め打ちで _sin, _cos などと管理する。
 例:List<List<PointF>> _pointListList;


> csvファイルは練習用として正弦波、余弦波、経過時間の3列を
> 1周期分のグラフを作成できる程度です。

1. 1 行ずつ読み込み、正弦波の値、余弦波の値、経過時間の値により分ける。
 例:StreamReader を使って ReadLine してから、Split するとか。Csv 読み込みクラスを使うとか。
2. 分けた値をデータ構造に追加する
 例:List<ValueRecord> _records; ValueRecord 型は自作の構造体、またはクラスとする。 struct ValueRecord { public float SinValue; public float CosValue; public float Theta; } など。

一気に作ろうとすると、「答えを教えてください」「コードを書いてください」としかならないので、1 ステップずつ取り組んでください。
答えを教えてもらうことで伸びる方はいらっしゃれば、わかったつもりになって次の課題で詰まる方もいらっしゃるので…。
(上司や先輩などの出題者が回答スピードの速さから期待値を上げてしまって、お互いに不幸になることがありうる)
[ 親 89815 / □ Tree ] 返信 編集キー/

▲[ 89816 ] / ▼[ 89822 ]
■89817 / 2階層)  Re[2]: csvから散布図グラフの作成
□投稿者/ usushio (10回)-(2019/01/05(Sat) 11:08:23)
返答ありがとうございます。

質問を送信した後に、できるところまで自分なりに書いてみたのですが、


string[] row_data;
                

                //目的の文字コードのEncodingオブジェクト取得
                Microsoft.VisualBasic.FileIO.TextFieldParser ftp = new Microsoft.VisualBasic.FileIO.TextFieldParser(openFileDialog1.FileName.ToString(), System.Text.Encoding.GetEncoding(932));

                //区切り文字を  カンマ
                ftp.Delimiters = new string[] { "," };

                // 最終行までデータ確認
                while (!(ftp.EndOfData))
                {
                    // カンマ区切りデータ取得
                    csv_read_data.Add(ftp.ReadFields());
                }

                // 一行データ取得
                row_data = (string[])csv_read_data[0];
                }

            //DataTableへ行データ追加
            DataTable dt = new DataTable();

            //debug
            // 列名称 取得
            string[] row_data_name = (string[])csv_read_data[0];  //←文字列名称用ストレージ

            dt.Columns.Add(row_data_name[0], Type.GetType("System.String"));
            dt.Columns.Add(row_data_name[1], Type.GetType("System.String"));
            dt.Columns.Add(row_data_name[2], Type.GetType("System.String"));
            
            for(i = 1; i < csv_read_data.Count; i++)
            {
                string[] row_data = (string[])csv_read_data[i];  //←数値用ストレージ

                DataRow row_add_data = dt.NewRow();  //←i行のテーブル

                //時間列
                row_add_data[row_data_name[0]] = row_data[0];
                //dt.Rows.Add(row_add_data);

                //正弦波列
                row_add_data[row_data_name[1]] = row_data[1];
                //dt.Rows.Add(row_add_data);

                //余弦波列
                row_add_data[row_data_name[2]] = row_data[2];
                dt.Rows.Add(row_add_data);  //←行ごとにテーブルを作成し、追加してループ

            }


上記のものができました。
返答していただいた内容はまだ反映できていませんが、
このようなコードの場合、時間列、正弦波、余弦波のデータはどこに、どのように収納されていますか。
又、ちゃんと、分別できているものでしょうか。

[ 親 89815 / □ Tree ] 返信 編集キー/

▲[ 89817 ] / ▼[ 89833 ]
■89822 / 3階層)  Re[3]: csvから散布図グラフの作成
□投稿者/ Azulean (1023回)-(2019/01/05(Sat) 18:04:45)
2019/01/05(Sat) 18:05:09 編集(投稿者)
No89817 (usushio さん) に返信
> 質問を送信した後に、できるところまで自分なりに書いてみたのですが、
(略)
> 上記のものができました。
> 返答していただいた内容はまだ反映できていませんが、
> このようなコードの場合、時間列、正弦波、余弦波のデータはどこに、どのように収納されていますか。

「コードを書いた」といえるのは、自分で動きを作り込めた時だと、
私は思っています。
動きがわからない状態でコードができあがると言うことは、他者のコードを
真似したか、試行錯誤で書き換えてうまく動くかわからないという状態だと
思われますので、「コードを書いた」とは言えません。

最初のうちは仕方ないかもしれませんが、プログラミングは自分で動きを
作り込むことです。
切り貼りや試行錯誤ではないことを覚えておいてください。


> string[] row_data;

この行、必要ですか?

>                 // 最終行までデータ確認
>                 while (!(ftp.EndOfData))
>                 {
>                     // カンマ区切りデータ取得
>                     csv_read_data.Add(ftp.ReadFields());
>                 }

この部分は何をしているか、説明できますか?
ここが一番大事です。

>                 // 一行データ取得
>                 row_data = (string[])csv_read_data[0];

これ必要ないのでは?
(どこも使っていませんよね?)


>             //DataTableへ行データ追加
>             DataTable dt = new DataTable();

DataTable に入れていることは必要なのですか?
必要なのであれば、「どのように収納されていますか」という質問にならない気がしますが…。

[ 親 89815 / □ Tree ] 返信 編集キー/

▲[ 89822 ] / ▼[ 89839 ]
■89833 / 4階層)  Re[4]: csvから散布図グラフの作成
□投稿者/ usushio (11回)-(2019/01/07(Mon) 10:58:19)
No89822 (Azulean さん) に返信
返信、ご指摘ありがとうございます。

>>string[] row_data;

後の行にある、
// 一行データ取得
row_data = (string[])csv_read_data[0];
のために用意したもの、なので
必要のないものでした。
> この行、必要ですか?

>> // 最終行までデータ確認
>> while (!(ftp.EndOfData))
>> {
>> // カンマ区切りデータ取得
>> csv_read_data.Add(ftp.ReadFields());
>> }
では、csvのデータを文字列として、ftpに収納
ftpのデータを最後まで読み取り、Addにデータを保管という風に解釈しております。

>> //DataTableへ行データ追加
>> DataTable dt = new DataTable();
DataTableへのデータの追加は、csvファイルから一行のデータとして抜出し、
プログラム内で扱うためにDataTableへ追加しているため必要である。と解釈しております。
「どのように収納されていますか」に関しては、
保管する動作が行えているのかという、コードを正しく理解できていない故の質問でした。

おっしゃる通り、他者のコードをコピーペーストしていたため、内容を理解できていませんでした。
[ 親 89815 / □ Tree ] 返信 編集キー/

▲[ 89833 ] / ▼[ 89860 ]
■89839 / 5階層)  Re[5]: csvから散布図グラフの作成
□投稿者/ Azulean (1024回)-(2019/01/07(Mon) 22:10:04)
No89833 (usushio さん) に返信
> >> csv_read_data.Add(ftp.ReadFields());
> >> }
> では、csvのデータを文字列として、ftpに収納
> ftpのデータを最後まで読み取り、Addにデータを保管という風に解釈しております。

違います。

1.ftp という変数に対して、ReadFields メソッドを実行。
 → ftp = TextFieldParser クラスが開いているファイルの現在位置から一行分読み込み、フィールド群を読み込む。
2.その戻り値を引数にして、 csv_Read_data 変数の Add メソッドを実行。
 → List<T> に新しい行の分のフィールド群を追加。

勘所を持てていないのかもしれませんが、何に対して指示をして、どういう結果になるのかを 1 つずつ調べて知識をつけていってください。


> DataTableへのデータの追加は、csvファイルから一行のデータとして抜出し、
> プログラム内で扱うためにDataTableへ追加しているため必要である。と解釈しております。

DataTable である必然性がないのなら、DataTable を使う必要はありません。
今の説明であれば、必然性がないように思えます。
(が、その後にどのようなデータ型にする必要があるかを質問者さんが提示していないので、私には判断つきません)
[ 親 89815 / □ Tree ] 返信 編集キー/

▲[ 89839 ] / 返信無し
■89860 / 6階層)  Re[6]: csvから散布図グラフの作成
□投稿者/ usushio (12回)-(2019/01/09(Wed) 11:18:32)
No89839 (Azulean さん) に返信

何度も丁寧な説明をありがとうございます。

> DataTable である必然性がないのなら、DataTable を使う必要はありません。
> 今の説明であれば、必然性がないように思えます。
> (が、その後にどのようなデータ型にする必要があるかを質問者さんが提示していないので、私には判断つきません)

Datatableについて調べてみて、データをどう扱いたいのかを再度確認してみます。

解決済み
[ 親 89815 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -