• ベストアンサー

gnuplot でこのような濃淡グラフを書けないでしょうか?

(x座標 y座標 値)という形式のデータで次のようなものがあります 1 1 32.4 1 2 23.4 .......... .......... 1 50 65.2 2 1 23.1 2 2 91.9 .......... .......... 2 50 73.2 .......... .......... 50 49 26.8 50 50 76.8 これを、二次元(x,y)のセル上で 50×50の濃淡プロットを作るには どうすれば良いでしょうか? gnuplotでなくてもOKです。 最初はexcelでやろうとしたのですが、思いの外大変でした。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

#2の者です。 「Densityplotというのがwebで見つかったのですが、関数のプロットのよう(?)です。 質問のデータを濃淡グラフでプロットするにはどうしたらよいのでしょうか?」 DensityPlotはおっしゃるとおり関数のプロットです。リストデータの濃淡プロットにはListDensityPlotというコマンドを使います。 ここでちょっとがっかりさせてしまうかもしれませんが、ListDensityPlotが扱うデータは {x座標、y座標、値}のデータ列ではなく、値がずらずらと並んだリストです。 もし手近にmathematicaを試せる環境ならば次のようなことをやってみればわかります。 data = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12}}; ListDensityPlot[data, Mesh -> False]; 1から12までの濃度値が横3×縦4の升目に反映された図になります。 ですから、ご質問の例では、方法は二つです。 その1:{x座標、y座標、値}で並んだリストデータを値だけのリストデータに形を変えてやらねばなりません。 値だけのリストデータをmathematicaに書き込めばもちろんいいんですが、こつこつタイプインするのは50×50ではちょっと無理ですね。 リストデータを外部のテキストファイルに書き込んであるのなら、それをまずImportコマンドで読み込んで、そのあとリストデータの構造を変えて値だけのリストデータにします(リストデータの編集法は長々しい説明になってしまいますのでご勘弁ください)。 外部ファイルを作るときに値だけの羅列データにして、ずらずらと一列のデータとしてImportし、そのあとPartitionコマンドで50に区切ってやるのも良いです。 その2:{x座標、y座標、値}のデータ列からInterpolationコマンドで補間関数を作り、その補間関数をDensityPlotで描く。 正直、mathematicaはなぜ{x座標、y座標、値}のデータ列をスムーズに扱ってくれないのかちょっとうらめしく思うこともあります。ご質問の例ではきれいな直交格子にデータが並んでいるのでまだ良いのですが、座標がばらばらの(つまり直交格子から見れば歯抜けのあるような)データだとややこしいことになってしまいます。

white-tiger
質問者

お礼

ありがとうございます! 周りに mathematica に詳しい人がいないので助かりました。 Partitionというので何とかなりそうな気がします。

その他の回答 (2)

回答No.2

私も以前gnuplotで濃淡表示をできないものかなと思っていろいろ調べたものの、その種のコマンドは見つからずギブアップしたことがあります。 もしgnuplotでできるならどなたかが回答されるだろうとも思っていたのですが、ありませんね。ということはgnuplot(の少なくとも現バージョン)にはその機能は無いと判断して良いということでしょう。 splotコマンドの三次元グラフ表示ならgnuplotは優れものなんですけどね。 (私は濃淡グラフを書くのにはmathematicaを使っています。高額な数式処理ソフトなのでお勧めはしません。市販されているグラフ描きソフトは当然濃淡図機能を持っているでしょうが、私は使用経験がありませんしそれほど安くもないし。。。)

white-tiger
質問者

補足

ありがとうございます! すみません、ちょうど、mathematicaは近日中に購入予定なのです。 Densityplotというのがwebで見つかったのですが、関数のプロットのよう(?)です。 質問のデータを濃淡グラフでプロットするにはどうしたらよいのでしょうか?

noname#35109
noname#35109
回答No.1

少し大変かもしれませんが,Excelでできると思いますよ。 以外と簡単に。 gnuplot というソフトに関してはよくわかりませんが, 濃淡のグラフというのは,,関数では表せないような写真ドットのようなデータの集まりなのですよね。 関数で表せないとすると, 結局,ドット1つ1つのデータを与えて行かないとならないので, どんなソフトを使ってもここの部分が思いの外大変だと思います。 というか, Excelはデータベースソフトなので,元からデータベースを用意するもの(シート)が用意されているため, 逆に簡単で,こういう処理には モッテコイ だと思います。 Excelでマクロを使って,セルではなくオートシェイプを利用すれば, データ入力"以外"の部分は簡単だと思います。 まず, データの用意です。 A~C列を使って,2500行のデータを作成します。 この作業が一番面倒といえば面倒です。  A B  C  1  1  32.4  ←1行目  1  2  23.4  ←2行目  ..........  ..........  1  50 65.2  ←50行目  2  1  23.1  ←51行目  2  2  91.9  ←51行目  ..........  ..........  2  50 73.2  ←100行目  ..........  ..........  50 49 26.8  ←2499行目  50 50 76.8  ←2500行目 次に, 5×5ピクセル のオートシェイプの四角形を 横50,縦50 合計2500個 アクティブシート上に並べるマクロを用意します。(コピペ可) //////////////////////////////////////////////////////////////////////////// Sub Noutan1() For I = 1 To 50  For J = 1 To 50   'expression.AddShape(Type, Left, Top, Width, Height)   With ActiveSheet.Shapes.AddShape(msoShapeRectangle, _    5 * I + 150, 5 * J + 100, 5, 5)     .Name = "Square" & I & "," & J     .Line.Visible = msoFalse     .Fill.ForeColor.RGB = RGB(I * 5, J * 5, 200)   End With  Next J Next I End Sub //////////////////////////////////////////////////////////////////////////// わざと遊びで変なグラデーションの色にしていますが, .Fill.ForeColor.RGB = RGB(I * 5, J * 5, 200) の部分を, .Fill.ForeColor.RGB = RGB(I255, 255, 255) にすれば,真っ白なオートシェイプが並びます。 (低スペックなPCだと,処理に10秒以上かかるかもしれません。) これで, 「Square1,1」 ~ 「Square50,50」 という名前の付いた,5×5ピクセル の四角形がたくさん生成されるので, あとは,1,1 から順に,塗りを塗るマクロを用意します。(コピペ可) //////////////////////////////////////////////////////////////////////////// Sub Noutan2()  '濃淡100を255に変換する定数 =2.55  W = 2.55  'A・B・C列の上の行から順に値の取得  For K = 1 To 2500   Obj = "Square" & ActiveSheet.Cells(K, 1) & "," & ActiveSheet.Cells(K, 2)   Col = ActiveSheet.Cells(K, 3)   ActiveSheet.Shapes(Obj).Fill.ForeColor.RGB = RGB(Col * W, Col * W, Col * W)  Next K End Sub //////////////////////////////////////////////////////////////////////////// Noutan1() を実行して,次に Noutan2() を実行すれば, 濃淡プロットの出来上がりです。 (低スペックなPCだと,処理に10秒以上かかるかもしれません。) ※Noutan1() は1回のみ実効可能です。  オブジェクトの名称が 2回目だと重なってしまうからです。  複数回実行する場合は,作成されたオートシェイプを全て消してから実行してください。  Noutan2() は複数回実効可能です。 私は全くマクロ(VBA) の専門家ではありません。 Flash(Web上でよく見るアニメーション)を主に専門分野としていますが, Flashならこうするだろうなと言う方法を,Excelに置き換えてみました。 Flashにしても,gnuplotにしても,Excel にしても,データに関数のような関係式が無ければ, 少なくともデータ入力の部分が何かの形で必要なことは確かです。 gnuplot の場合はよくわかりませんが, Flashの場合は元々データベースソフトではないため, データを用意する部分がものすごく大変になります。 おそらく外部にデータ入りの CSV や XML などを用意して, それを Flash にロードして,処理という形になると思います。 かなり面倒です。 データはデータ。 プログラムはプログラム。 元のデータを変えればプログラムを変えずとも結果が変わる。 Excelはこういうことを専門にできるソフトなので, 他のソフトに比べれば,データを用意する箱が用意されている分,すごく楽だと思います。                       [ 作成&検証 Windows2000 Excel 2002 ] ======================================= ひょっとしたら,マクロの登録方法や使用方法がわからないかもしれないので, 念のため書いておきます。 ~~マクロの作成方法~~ [ツール] メニュー→ [マクロ]→[マクロ]でマクロダイアログボックスを出します。 [マクロ名] ボックスに、「実行するマクロの名前」 (つまり Noutan1 )を入力し,「作成」をクリック Visual Basicエディタが開くと,Module1に ---------------------- Sub Noutan1() End Sub ---------------------- がすでに用意されていると思います。ここを ---------------------- Sub Noutan1() For I = 1 To 50  For J = 1 To 50   'expression.AddShape(Type, Left, Top, Width, Height)   With ActiveSheet.Shapes.AddShape(msoShapeRectangle, _    5 * I + 150, 5 * J + 100, 5, 5)     .Name = "Square" & I & "," & J     .Line.Visible = msoFalse     .Fill.ForeColor.RGB = RGB(I * 5, J * 5, 200)   End With  Next J Next I End Sub ---------------------- のように書きかえ,一旦Visual Basicエディタを閉じます。 これでマクロの作成は終わりです。 ~マクロの実行方法~ 方法1 ショートカットから実行 再び[ツール] メニュー→ [マクロ]→[マクロ]でマクロダイアログボックスを出します。 [マクロ名] ボックスの下にある大きなボックスから 「実行するマクロの名前」を選択し「オプション」を選択し, マクロオプションダイアログボックスから ショートカットキー 「Ctrl」+「任意のキー」でショートカットを登録すれば, 次回からこのショートカットキーでマクロが実行されます。 「任意のキー」は P A C Z など日頃自分が使われているキーは避けた方が良いです。 方法2 画像から実行 自分で書いた絵やネット上のボタン画像や写真もマクロ実行のボタンとして使用できます。 ボタンにしたい画像を右クリック→「マクロの登録」で 「実行するマクロの名前」を選択→「OK」で マクロ実行ボタンの完成です。 その他,ツールバーのフォームから ボタンを作って,そのボタンにマクロを登録するなど, 色々な方法があります。

white-tiger
質問者

お礼

詳細なお返事ありがとうございます!

関連するQ&A