tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルchartの散布図 線表示について
記事No11688
投稿日: 2016/07/04(Mon) 15:41
投稿者耳たぶ黒
初めまして、VB超初心者の耳たぶの黒と申します。(まだ三ヶ月ぐらいです。)
開発環境はvisualstudio2015 proを使用しております。
VBレスキューのサイト見やすくて、分かりやすくて助かってます。

花ちゃんさんのCSVから散布図を作るサンプルプログラムに感謝してます。
質問なのですが、このプログラムで点と点を結ぶ線を表現するには、
どのようなプログラムを行えばいいのでしょうか?
花ちゃんさんのサイトにあったMSChartのときはPOINTでも
.seriese.showline=true
と書けば表現できたようですが、現行のVB2015だとshowlineが無い様なので、
手も足もでません。

最悪、折れ線のLINEにしようかとおもいましたが、サンプルプログラムもpoint
をLINEに変えても、グラフが変わらないので困っています。



サンプルプログラムのグラフの表示設定↓↓↓↓↓
'--------------------------------ここから散布図の表示設定--------------------------------
        With Chart1
            ' .Series.Clear()         '系列を初期化
            For i As Integer = 0 To colums
                'テーブルからデータを取得
                Dim x As Integer = CType(ds.Tables(0).Rows(0).Item(i), Integer)
                Dim y As Integer = CType(ds.Tables(0).Rows(1).Item(i), Integer)
                .Series.Add(CType(i, String))
                'グラフの種類をPoint(点グラフ)にして散布図を描画
                .Series(CType(i, String)).ChartType = DataVisualization.Charting.SeriesChartType.Point

                .Series(CType(i, String)).Points.AddXY(x, y)    'データを設定
                .Series(CType(i, String)).MarkerSize = 15       'マーカーを大きくして表示
                If i < 5 Then        '正しく表示されているか確認の為ポイントラベルを表示
                    .Series(CType(i, String)).Label = CStr(i) & ":#VALX" & ",#VALY"
                End If
            Next
            '.Legends(0).Enabled = False     '凡例を非表示にする
        End With

        '■------------------- X軸・Y軸のフォント・線等の設定 ----------------Start--■

知識のある方、よろしくお願いいたします。

[ツリー表示へ]
タイトルRe: chartの散布図 線表示について
記事No11689
投稿日: 2016/07/04(Mon) 17:11
投稿者shu
CharTypeがLineのSeriesを用意して
AddXYで同じ値を追加するのはどうでしょう?
X値が前後すると線の引かれかたが変になるので
X値でソートして設定する必要はあります。

[ツリー表示へ]
タイトルRe^2: chartの散布図 線表示について
記事No11690
投稿日: 2016/07/04(Mon) 19:11
投稿者耳たぶ黒
> CharTypeがLineのSeriesを用意して
> AddXYで同じ値を追加するのはどうでしょう?
> X値が前後すると線の引かれかたが変になるので
> X値でソートして設定する必要はあります。

shuさん、早いレスありがとうございます。
アドバイスを頂けたのはありがたいのですが、
私、超初心者で先週ぐらいからようやくチャートをいじり始めたもので
shuさんには当たり前のことも私には??になってしまっています。

seriesについてもほぼ知識がありませんので、
出来れば具体的な例を書いて頂けると助かります。
すいません。

[ツリー表示へ]
タイトルRe^3: chartの散布図 線表示について
記事No11691
投稿日: 2016/07/05(Tue) 08:17
投稿者shu
実際にこの辺で処理を記述されているではないですか?
これを参考にされるとよいです


.Series.Add(CType(i, String))
'グラフの種類をPoint(点グラフ)にして散布図を描画
.Series(CType(i, String)).ChartType = DataVisualization.Charting.SeriesChartType.Point

.Series(CType(i, String)).Points.AddXY(x, y)    'データを設定

線は1つのグラフでいいのでSeries.Add, ChartTypeをするタイミングはFor文の前に1度行えばよいです。

[ツリー表示へ]
タイトルRe^4: chartの散布図 線表示について
記事No11692
投稿日: 2016/07/05(Tue) 20:11
投稿者耳たぶ黒
shuさんありがとうございます。

ただ、動く状態のプログラムを走らせたときの結果が凡例がデータの数だけ増えてしまっています。
根本的にCSVファイルの読ませ方、表示の方法が違う気がしてきました。

現状のプログラム
With Chart1

            .Series.Clear()         '系列を初期化
            Dim a As Integer
            .Series.Add(CType(a, String))
            'グラフの種類をPoint(点グラフ)にして散布図を描画
            .Series(CType(a, String)).ChartType = DataVisualization.Charting.SeriesChartType.Line

            For i As Integer = 0 To rows - 1                'テーブルからデータを取得
                Dim x As Single = CType(ds.Tables(0).Rows.Item(i)(2), Single)
                Dim y As Single = CType(ds.Tables(0).Rows.Item(i)(1), Single)
                .Series.Add(CType(i, String))
                'グラフの種類をPoint(点グラフ)にして散布図を描画
                .Series(CType(i, String)).ChartType = DataVisualization.Charting.SeriesChartType.Point
                .Series(CType(i, String)).Points.AddXY(x, y)    'データを設定
                .Series(CType(i, String)).MarkerSize = 15       'マーカーを大きくして表示
                .Series(CType(i, String)).MarkerStyle = DataVisualization.Charting.MarkerStyle.Diamond
                .Series(CType(i, String)).MarkerColor = Color.Blue
                .Series(CType(i, String)).BorderDashStyle = DataVisualization.Charting.ChartDashStyle.Solid
                .Series(CType(i, String)).BorderWidth = 10
                .Series(CType(i, String)).BorderColor = Color.Blue
                If i < 5 Then        '正しく表示されているか確認の為ポイントラベルを表示
                    .Series(CType(i, String)).Label = CStr(i) & ":#VALX" & ",#VALY"
                End If
                'すべての系列についてマーカーを表示し、線を表示解除します。


            Next
            .Legends(0).Enabled = True      '凡例を非表示にする
        End With

csvデータ:http://www.fastpic.jp/images.php?file=9596415491.png
結果散布図ー誤(現状):http://www.fastpic.jp/images.php?file=3306180425.png
結果散布図ー正(エクセルで描画):http://www.fastpic.jp/images.php?file=2894168190.png
プログラムのエラー画面:http://www.fastpic.jp/images.php?file=4902074744.png

上記のCSVデータの様に列を上から下に読み込ませたいのにうまくいっていない気がする。
エクセル的に表現すると1項目にデータを読み込ませたいのに、項目をどんどん増やしている感じです。
.points.addxyがいけないのか?データの読み込ませかたが悪いのか?
アドバイスいただけるとたすかります。よろしくお願いいたします。

[ツリー表示へ]
タイトルRe^5: chartの散布図 線表示について
記事No11693
投稿日: 2016/07/06(Wed) 07:44
投稿者shu
やりたい事が見えてこないのですが
とりあえずExcelで描画と同じことをするなら

例えば以下のような感じで出来ます。

        Dim tbl As New DataTable
        With tbl.Columns
            .Add("X", GetType(Integer))
            .Add("Y", GetType(Integer))
        End With

        'Excelでの描画を基にデータを追加
        tbl.Rows.Add(0, 0)
        tbl.Rows.Add(10, 1)
        tbl.Rows.Add(20, 2)
        tbl.Rows.Add(30, 3)
        tbl.Rows.Add(40, 4)
        tbl.Rows.Add(50, 5)
        tbl.Rows.Add(60, 6)
        tbl.Rows.Add(70, 7)
        tbl.Rows.Add(80, 8)
        tbl.Rows.Add(15, 9)
        tbl.Rows.Add(5, 10)

        With Chart1
            .DataSource = tbl
            '最初から用意されているSeriesを取得
            Dim sr = .Series(0)
            sr.ChartType = DataVisualization.Charting.SeriesChartType.Line
            sr.XValueMember = "X"
            sr.YValueMembers = "Y"
            sr.MarkerSize = 15
        End With

[ツリー表示へ]
タイトルRe^6: chartの散布図 線表示について
記事No11694
投稿日: 2016/07/06(Wed) 10:03
投稿者耳たぶ黒
shuさん、ありがとうございます。
これです!こういう画がかきたかったです。
あとは4列×N行のCSVファイルから真ん中2列で散布図を描くプログラムに修正すればできそうです。
これでやってみます。

[ツリー表示へ]
タイトルRe^7: chartの散布図 線表示について
記事No11695
投稿日: 2016/07/06(Wed) 17:37
投稿者耳たぶ黒
shuさん、ありがとうございました。画を描くことができました。

アドバイスもらって気づいたんですが、.Series(x)のカッコの中の数字が凡例の数を決めているのですか?
以前私が作成プログラムはカッコの中の数字がデータ列の数まで増えていたので、凡例の数もデータの列の数だけあって、線で結ぼうとしても結べなかったのではと思いました。

大変助かりました。ありがとうございました。

[ツリー表示へ]
タイトルRe^8: chartの散布図 線表示について
記事No11696
投稿日: 2016/07/06(Wed) 21:33
投稿者shu
> shuさん、ありがとうございました。画を描くことができました。
>
> アドバイスもらって気づいたんですが、.Series(x)のカッコの中の数字が凡例の数を決めているのですか?
考え方としては逆です。Seriesというのはグラフ系列の集合(コレクション)だと思ってもらえばよいのですが
最初1つのグラフが容易されていてSeries.Addするとグラフが1つ増えるという感じです。グラフ毎に凡例が1つ対応しています。
.Series(x)で
 xを数字とした場合 → x+1番目のグラフ系列を指し示すことになります。(インデックスが0から始まるため)
  xに文字列を指定した場合 → その名前のグラフ系列を指し示すことになります。

最初に提示されていたコードでは
AddをするときにCType(i, String)としているのでiの値を文字列とした名前が系列に対し付加されます。

エラーが出たコードについては
CType(a, String)でAddしたとき"0"という名前の系列が出来ているにもかかわらず
i=0のときにCType(i, String)でAddしてしまったのでまた"0"という名前の系列を追加することになり
名前が重複してしまいエラーとなったのです。

[ツリー表示へ]
タイトルRe^9: chartの散布図 線表示について
記事No11697
投稿日: 2016/07/07(Thu) 00:12
投稿者耳たぶ黒
shuさん、エラーの解説までありがとうございます。
なるほど、そういう理由で出てたエラーだったんですね。
凄い助かりました。

[ツリー表示へ]