Visual Basic 中学校 掲示板 投稿内容
タグのない投稿を抽出 統計 RSS

Visual Basic 中学校 > 投稿一覧 >

大量のデータの散布図作成 解決済み

Windowsフォーム グラフ グラフィック タグの編集...

投稿者 若くはないビギナー   (社会人)   投稿日時 2019/3/5 17:00:06
お世話になります。
いつもVisual Basic 中学校で勉強させていただいております初心者です。

20万程度のXY座標の組み合わせデータを用いて散布図を作りたいと考えております。


Chartオブジェクトを利用しようとしたのですがうまくいきそうな感じがありません。表示しようとして1分以上かかったのちプログラムが停止してしまいました。多分大量のデータ処理には向いていないのかと思われます。

ちなみにエクセル2016のグラフで試したのですが、表示は早いのですがデータの半分程度しかプロットできていないようでした。

VBで配列もしくはデータテーブルにデータを読み込ませるところまでは出来ているとして、その後にどうすればよいか、いい案をご存知の方、ご教授願えればとても助かります。
(できれば1秒程度で作成したいと思います)

投稿者 魔界の仮面弁士   (社会人)   投稿日時 2019/3/6 10:11:11
> 表示しようとして1分以上かかったのちプログラムが停止してしまいました。

既存の仕組みだと遅すぎるなら、いっそのこと自前で描いてしまってはどうでしょうか。


> (できれば1秒程度で作成したいと思います)

手元の環境で、ランダムな 20万の座標に
縦横 3 ピクセルなサイズの点を打ってみたところ
FillEllipse メソッドの場合で 350 ミリ秒程度、
FillRectangle メソッドなら 200 ミリ秒程度で描き終えました。


Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim r As New Random()
    Dim sz = PictureBox1.Size

    Dim sw = Stopwatch.StartNew()
    Dim bmp As New Bitmap(sz.Width, sz.Height)
    Using g = Graphics.FromImage(bmp), b As New SolidBrush(Color.FromArgb(96, Color.Red))
        g.Clear(Color.White)
        For i = 0 To 200000
            g.FillEllipse(b, r.Next(PictureBox1.Width), r.Next(PictureBox1.Height), 3, 3)
        Next
    End Using
    sw.Stop()

    Dim oldImg = PictureBox1.Image
    PictureBox1.Image = bmp
    If oldImg IsNot Nothing Then oldImg.Dispose()

    MsgBox(sw.Elapsed.ToString())
End Sub


投稿者 若くはないビギナー   (社会人)   投稿日時 2019/3/6 11:29:33
魔界の仮面弁士様

ご回答いただきまして誠にありがとうございます。
自前の方が早いとは思っておりませんでした。
ご教授頂いたプログラムを試させていただきましたが、私の環境でもFillEllipseで400mm秒程度で描画できました。
参考させていただきにプログラムにチャレンジしたいと思います。
大変助かりました。

投稿者 若くはないビギナー   (社会人)   投稿日時 2019/3/6 16:16:42
解決時チェック忘れたので投稿します。