BarChart
Last-modified: 2019-01-27 (日) 03:30:26 (1518d)
StarLogoは、マルチエージェント・シミュレーション・システムとして、時間と共に 変化するタートルの数や、変数の値をいくつかの形式で表示するグラフ機能が既に ありますが、ここでは、StarLogoのタートルとパッチを使って棒グラフの作成を 試みました。意味があるかどうかは別。 方針 †数値データのリストを与えたときに、その棒グラフを生成してパッチに表示する。 「棒」はタートルの軌跡として描かせる。 データ自身をを作ったり操作したりする操作とグラフの作成部分の手続きが なるべく干渉しないように、データのリストから、表示のためのタートルを 含むデータをいったん作ってから、それを使って表示します。 具体的なやりかた †グラフ用データの作成(make-visdata手続き) †データ: [200 45 666 ] ---> グラフ用データ[ [0 200][1 45][2 666] ] 新しく作った部分リスト、[0 200]の1つめの要素は、表示に使うタートルの 番号とします。 棒グラフ表示(view-barchart手続き) †データの数と、データの上限と下限の絶対値の最大値を使って 全体の表示をパッチに収まるようにしました。 データの並び替えプログラム †表示するためのデータは、適当な範囲で乱数によって生成しましたが、 それを、それをソートして確認するために、QuickSortを使いました。 また、ソートされたデータをまたばらばらにしたりするために、Shuffle手続き を作りました。 表示例 †ソートしたデータ †ばらばらに並べ替えたデータ †実装コード †試行錯誤の上作ったので、あまり、美しくなく、まだ洗練の余地もあるかと 思いますが、載せておきます。 GUI †次の様なものを配置しています。
コード †外部変数と、初期化手続き †初期化では、データの生成を行っています globals [ work dmin dmax datas ] to init set datas [] set dmin -22 set dmax 33 dotimes [:i ndata] [ set datas (lput (dmin + (random (dmax - dmin))) datas) ] end データから表示用データを作成 †; ; (d1 d2 d3) -> ((t0 d1)(t1 d2)(t3 d3)) ; to make-visdata :datas cp ct let [:vdatas []] set work [] create-turtles (length :datas) dotimes [:i (length :datas)] [ let [:data (first (sublist :datas :i :i))] ask-turtle (:i - 1) [ set work (lput (list who :data ) work ) seth 0 ] print work ] set :vdatas work print ":vdatas" print :vdatas output :vdatas end 棒グラフの表示 †to view-barchart :datas let [:dmax (max-of-list :datas)] let [:dmin (min-of-list :datas)] let [:dmax max-of-list (list (abs :dmax) (abs :dmin))] let [:ndata length(:datas)] let [:xmin (0 - screen-half-width)] let [:ymin (0 - screen-half-height)] let [:xmax (0 + screen-half-width)] let [:ymax (0 + screen-half-height)] let [:sx ((:xmax - :xmin) / :ndata)] let [:sy ((:ymax - :ymin) / :ndata)] let [:rat (:dmax / (:ymax - :ymin))] let [:vdatas (make-visdata :datas)] print ":vdatas" print :vdatas dotimes [:i :ndata][ let [:vdata (first (sublist :vdatas :i :i))] let [:t (first :vdata)] let [:d ((first (butfirst :vdata)) * :sy)] ask-turtle :t [ let [:x (:xmin + (:i * :sx)) ] let [:y :ymin] setxy :x 0 pd fd (:d / :rat / :sy * 0.5) ] ] end shuffle †リスト内の適当な二箇所のデータを入れ替えることを繰り返しています。 to shuffle :datas dotimes [:i 100][ ; magic number ... let [:rn1 ((random (length datas)) + 1)] let [:rn2 ((random (length datas)) + 1)] let [:d1 (first (sublist :datas :rn1 :rn1))] let [:d2 (first (sublist :datas :rn2 :rn2))] setitem :rn1 :datas :d2 setitem :rn2 :datas :d1 ] output :datas end テスト用 †データを並び替えて、棒グラフを表示するというものです。 test-shuffle †to test-shuffle set datas (shuffle datas) print datas view-barchart datas end test-qsort †to test-qsort set datas (qsort datas) print datas view-barchart datas end
Counter: 520,
today: 1,
yesterday: 0
|