質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

gnuplot

gnuplot(ニュープロット)は、2次元や3次元のグラフ作成ができるソフトウェアです。さまざまな数式やデータ集計などのグラフを描写することが可能で、特に2次元グラフを描画する機能は強力です。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Q&A

解決済

2回答

6745閲覧

gnuplotのpm3dを用いたグラフ描画ができません。

noukanokurashi

総合スコア4

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

gnuplot

gnuplot(ニュープロット)は、2次元や3次元のグラフ作成ができるソフトウェアです。さまざまな数式やデータ集計などのグラフを描写することが可能で、特に2次元グラフを描画する機能は強力です。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

0グッド

0クリップ

投稿2021/12/04 07:28

編集2022/01/13 01:19

前提・実現したいこと

温度分布の計算のプログラムをディリクレ条件のガウス・ザイデル法を用いて数値計算をし、温度分布のグラフを作成したい。

ガウス・ザイデル法を用いて、ある行列の値が収束していくようなプログラムを作成します。(main_01.cを参照)

その数値計算を行った後にその行列をdat形式(g-s_result.datを参照)で出力し、gnuplotで温度分布のグラフを描画します。(g-s_method.pltを参照)

発生している問題・エラーメッセージ

現在つまづいていている点として、main_01.cの実行後に出力されるdat形式のファイルをgnuplotでpm3dを用いてsplotしても以下のようにグラフが全く表示されない点です。
イメージ説明

またgnuplot上で以下のエラーが表示されます。

Warning: Single isoline (scan) is not enough for a pm3d plot. Hint: Missing blank lines in the data file? See 'help pm3d' and FAQ.

###追記1
描画結果1
イメージ説明
描画できるようにはなりましたが、直線になってしまいます。

###追記2
描画結果2
配列の描画なのでsplot 'XXX.dat' matrixとすれば描画できる。
イメージ説明
軸の範囲を0<=x<=2、0<=y<=1にしたいが、描画範囲をそのように指定すると、当然だが範囲が狭まるので正しい表示にはならない。
軸の範囲が0<=x<=200、0<=y<=100になっているのは配列(行列)サイズがa[100][200]となっているためですが、軸は0<=x<=2、0<=y<=1としなければいけない制約があります。また、格子間隔(離散した間隔)が0.01という制約もあるためa[1/0.01][2/0.01]としております。この配列サイズを維持したまgnuplot上での軸を0<=x<=2、0<=y<=1と表示するにはどうすればよいのでしょうか。

試したこと

pm3dを用いてグラフが表示されない原因をいろいろとインターネットで調べたところ、出力されるdatファイルに問題があると思います。

参照サイト
このサイトの

3.10 pm3d によるデータファイルの splot で何も表示されません

によるとdatファイルに2つのつながっている線 (孤立線) を分離する空行がないと描画できないとありましたが、今回私が作成しようとしているプログラムで出力されるdatファイルのどのタイミングで空行を入れるのかわかりません。つきましては、プログラムmain_01.cにてdatファイルを出力している箇所に適切な空行を入れる命令をご提示いただけますでしょうか。
または、main_01.cのアルゴリズムが間違えていましたら、ご指摘いただければ幸いです。

かれこれ4時間以上考えたり、インターネットで調べてみましたが解決できませんでした。よろしくお願いいたします。

該当のソースコード

gnuplot

1cd 'C:\Users\%USERNAME%\Desktop\gnuplot' 2 3set pm3d 4set pm3d map 5set pm3d interpolate 5, 5 6set ticslevel 0 7#set cbrange[0:1] 8#set xrange [0:200] 9#set yrange [100:0] 10set autoscale xfix 11set autoscale yfix 12set yrange [] reverse 13set autoscale cbfix 14set palette defined(0"#00008b",1"#2ca9e1",2"#38b48b",3.5"#ffff00",5"#eb6101",5.3"#c9171e") 15splot 'g-s_result.dat' matrix nonuniform

###最終結果
イメージ説明

補足情報(FW/ツールのバージョンなど)

以下の環境で実施しております。
Visual Studio 2019 (C言語の実行環境)
Visual Studio Code
gnuplot 5.4(グラフ描画ソフト)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jbpb0

2021/12/04 09:44

http://www.natural-science.or.jp/article/20091028205740.php に、「"座標1"の値が変化する場合には、1行空白が必要となる。」と書かれてます 質問に掲載されてる「g-s_result.dat」では一番左の「座標1」が全て異なっているので、それらを全部空行で分離した -0.000028 0.395250 0.581139 0.682899 0.745610 0.787775 0.817980 0.840656 0.858298 0.872410 0.883954 0.893570 0.901703 0.908670 0.914705 という内容のファイルを作ってもダメでしたが、同じ内容の行を2行ずつにして、それらを空行で分離した -0.000028 0.395250 0.581139 -0.000028 0.395250 0.581139 0.682899 0.745610 0.787775 0.682899 0.745610 0.787775 0.817980 0.840656 0.858298 0.817980 0.840656 0.858298 0.872410 0.883954 0.893570 0.872410 0.883954 0.893570 0.901703 0.908670 0.914705 0.901703 0.908670 0.914705 という内容のファイルを作ったら描画されました でもそれは、質問者さんが要望してるグラフ描画では無いような気もします
jbpb0

2021/12/04 10:28

http://www-ise2.ist.osaka-u.ac.jp/~shinkai/gnuplot/#pm3d の、「これは例を見た方が分かりやすいでしょう.」と書かれてるところの「データファイル」の例を見ると、空行で分離するのは一番左の「座標1」が変わるところじゃなくてもいいみたいです
noukanokurashi

2021/12/04 12:12

ご回答、ありがとうございます。 たしかに出力されるdatファイルに適当に空行を入れると描画されますが、意図したグラフ(上の見本のグラフ)にはならないです・・・ xの範囲は0から2、yの範囲は0から1の範囲なのに、datで出力される値はx,yともに-1から1までの値しかないので、出力している値が間違っているのでしょうか。 または、上の見本図のような温度分布のグラフを作成するのにあたって、pm3dを用いるのが誤りなのでしょうか。
jbpb0

2021/12/05 08:23 編集

質問の画像のような長方形の領域内が全部埋まってる描画を「pm3d」でするには、長方形の領域内全部のデータが必要です gnuplotのコマンドを set pm3d set pm3d map set pm3d interpolate 100, 100 splot 'データファイル名' with pm3d として、データファイルが下記の二種類の場合で描画の違いを確認してみてください データファイル一つ目 (長方形内全部埋まる) 0 0 0 0 0.5 1 0 1 0 1 0 0 1 0.5 1 1 1 0 2 0 0 2 0.5 1 2 1 0 データファイル二つ目 (長方形内が埋まらない) 0 0 0 0 0.5 1 1 0.25 0 1 0.75 1 2 0.5 0 2 1 1 【追記】 上記「長方形の領域」は、質問の画像に合わせて下記を想定して書いたので、そのように解釈してください ・横軸:0〜2 ・縦軸:0〜1
noukanokurashi

2021/12/05 07:33

ご返信いただき、ありがとうございます。 いろいろとネットで調べていて、ふと気がついたのですすが、今回私が描画させる配列は行列でしたので、gnuplotで描画する際にmatrixを使えばいいと気づきました。お手数をかけてしまい申し訳ございません。長方形の領域内全部のデータがない状態で描画しても長方形にならないことはおっしゃる通りでした。 さて最後になりますが、あと問題が1つ残っています。それは軸の範囲が0<=x<=200、0<=y<=100になっているところです。これは配列(行列)サイズがa[100][200]となっているためですが、軸は0<=x<=2、0<=y<=1としなければいけない制約があります。また、格子間隔(離散した間隔)が0.01という制約もあるためa[1/0.01][2/0.01]としております。この配列サイズを維持したまgnuplot上での軸を0<=x<=2、0<=y<=1と表示するにはどうすればよいのでしょうか。
jbpb0

2021/12/05 08:15

編集前の質問に掲載されてた「g-s_result.dat」は各行に三つ数値があったのですが、それの左から二つは座標では無かった、ということですか?
guest

回答2

0

ベストアンサー

gnuplot上での軸を0<=x<=2、0<=y<=1と表示

gnuplot: 2D plot of a matrix of data
の例のように、データファイルの1行目と1列目に座標を記入します
一番左上(上記例では「4」)は、データの列数です

投稿2021/12/05 08:47

編集2021/12/07 01:09
jbpb0

総合スコア7653

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

noukanokurashi

2021/12/07 03:43

ご返信が遅くなってしまい、申し訳ございません。datファイルの1行目、1列目に0.01、0.02、・・・と記述し、autoscaleで描画すればよいということですね。ありがとうございます。一番左上はデータの列数というと、例えば今回の場合、100*200の配列なので200と記述すればよいということでしょうか。 只今、外出中なため、帰宅後に試してみます。
jbpb0

2021/12/07 08:59 編集

splot 'データファイル名' matrix nonuniform と、「nonuniform」を付けます そうしないと、1行目と1列目が普通のデータとして扱われます > 一番左上はデータの列数というと、例えば今回の場合、100*200の配列なので200と記述すればよいということでしょうか。 そうです
noukanokurashi

2021/12/07 10:43

ありがとうございます。無事に軸も私の望み通りになりました。
guest

0

以下の awk スクリプト (例えば addblanks.awk と呼ぶことにします) は有用で、データファイルに、 第 1 列目の数が変更したときに空行を追加してくれます。

/[:blank:]*#/ {next} # コメント行 (# で始まる行) は無視
NF < 3 {next} # 3 列未満しかない行も無視
$1 != prev {printf "\n"; prev=$1} # 空行を出力
{print} # その行自体を出力

投稿2021/12/04 09:49

編集2021/12/05 08:00
melian

総合スコア20655

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

noukanokurashi

2021/12/04 12:25

ご回答、ありがとうございます。 描画できるコードのご提示いただき、本当にありがとうございます。私も該当箇所をそのコードで書き換えてみましたが、直線みたいのが表示されてしまいます。(描画範囲を広げてみました)しかし、その直線のグラデーションが見本の温度分布のグラフのグラデーションに近づいたような気がします。なので、ガウス・ザイデル法による分布は正しいと思われます。 ここで、この直線になっている分布を維持したまま左右に広げて描画したいのですが、gnuplotでそのような設定はあるのでしょうか? お手数おかけしますが、よろしくお願いいたします。
noukanokurashi

2021/12/04 12:31

描画結果を追記いたしました。
noukanokurashi

2021/12/05 07:37

ご返信いただき、ありがとうございます。 いろいろとネットで調べていて、ふと気がついたのですすが、今回私が描画させる配列は行列でしたので、gnuplotで描画する際にmatrixを使えばいいと気づきました。datファイルに空行を入れるプログラムを作成してくださったにもかかわらず、お手数をかけてしまい申し訳ございません。 さて最後になりますが、あと問題が1つ残っています。それは軸の範囲が0<=x<=200、0<=y<=100になっているところです。これは配列(行列)サイズがa[100][200]となっているためですが、軸は0<=x<=2、0<=y<=1としなければいけない制約があります。また、格子間隔(離散した間隔)が0.01という制約もあるためa[1/0.01][2/0.01]としております。この配列サイズを維持したまgnuplot上での軸を0<=x<=2、0<=y<=1と表示するにはどうすればよいのでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問