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

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

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

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

gnuplot

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

Q&A

解決済

2回答

2058閲覧

gnuplotで3次元データをうまくプロットできない

geospace291

総合スコア6

C

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

gnuplot

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

0グッド

0クリップ

投稿2021/11/20 03:48

前提・実現したいこと

C言語で作成した3次元データをgnuplotで描画したい。

発生している問題

下図のような左から、時刻、粒子ID、質量、x座標、y座標、z座標、速度のx成分、y成分、z成分となるようなdatファイルを作成し、x,y,z座標を読ませようとしたところ、最初の1行のみしか読まないという問題が発生しました。

10000.000000 0 1988000000000000042908333899776.000000 0.000026 -0.000010 0.000000 0.000000 -0.000000 0.000000 10000.000000 1 24383105484590355054592.000000 983209937622.183350 -4659432619335.960938 0.000000 -1089.881619 -5164.835290 0.000000 10000.000000 2 28140397012168346697728.000000 2292283241544.817871 6702351589852.386719 0.000000 -1400.595057 4095.116006 0.000000 10000.000000 3 69829951971848508932096.000000 -1118131953084.082275 6342045417892.476562 0.000000 788.128701 4470.203664 0.000000 10000.000000 4 50142703982934952509440.000000 -3541276135314.052246 -3717939517355.059082 0.000000 3506.069754 -3680.903912 0.000000 10000.000000 5 67169397437400463966208.000000 5059317087988.542969 -1565888506707.762451 0.000000 -4781.536400 -1479.885771 0.000000 10000.000000 6 17542443914552017944576.000000 -1192599065619.279053 -5722159634144.584961 0.000000 972.129248 -4664.256596 0.000000 10000.000000 7 87255769987937164328960.000000 5686074461152.274414 584419709706.315918 0.000000 -4792.699804 492.589577 0.000000 10000.000000 8 78140190621772688654336.000000 1204535508451.004395 -3400932647971.008301 0.000000 -2024.683141 -5716.377368 0.000000 10000.000000 9 85898881938355562479616.000000 3284525239934.300781 3488524993635.323242 0.000000 -3607.360586 3831.327277 0.000000 10000.000000 10 90207207784891488927744.000000 1481033174327.974854 7327027777180.092773 0.000000 -834.730714 4129.567312 0.000000 10000.000000 11 53836084504688112697344.000000 -5134882892528.929688 -4393470162201.365723 0.000000 3366.846830 -2880.678571 0.000000 10000.000000 12 73357154390142691049472.000000 -5785266257310.916992 -889768729681.595093 0.000000 4705.794006 -723.735098 0.000000 10000.000000 13 55577531170296694833152.000000 -1942266140028.092041 7096870536356.378906 0.000000 1120.983094 4095.926866 0.000000 10000.000000 14 30577807221292605112320.000000 668405626935.162354 -5314209588509.741211 0.000000 -621.141441 -4938.340314 0.000000 10000.000000 15 63979424003521242988544.000000 -1453156824095.189697 6840578690506.774414 0.000000 905.135906 4260.776368 0.000000 10000.000000 16 68278748733793030373376.000000 5778933849861.779297 -3223227633602.789551 0.000000 -3910.779703 -2181.226318 0.000000

該当のソースコード

次のC言語スクリプトを用いてgnuplotに描画させています。

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <unistd.h> 4 5#define SEC 1000000 6#define WAIT (60*SEC) 7 8#define AU 1.4960e11 /* 天文単位(m) */ 9 10int main(void){ 11 FILE *gp; 12 double r; 13 14 if((gp=popen("gnuplot -persist","w"))==NULL){ 15 fprintf(stdout,"fopen error gp[%p]\n",gp); 16 exit(1); 17 } 18 19 r = 5.0*AU; 20 21 fprintf(gp,"set terminal x11\n"); 22 fprintf(gp,"set xr[%lf:%lf]\n",-r,r); 23 fprintf(gp,"set yr[%lf:%lf]\n",-r,r); 24 fprintf(gp,"set zr[%lf:%lf]\n",-r,r); 25 fprintf(gp,"set size square\n"); 26 fprintf(gp,"set grid\n"); 27 fprintf(gp,"set title \"N-body problem(4th-order HS, terrestrial planet region)\"\n"); 28 fprintf(gp,"set xlabel \'X\'\n"); 29 fprintf(gp,"set ylabel \'Y\'\n"); 30 fprintf(gp,"set zlabel \'Z\'\n"); 31 fprintf(gp,"set view equal xyz\n"); 32 fprintf(gp,"splot \"testrun-1_10.dat\" using 4:5:6\n"); 33 34 fflush(gp); 35 usleep(WAIT); 36 37 pclose(gp); 38 39 return 0; 40}

試したこと

読まれない理由が全く分からないので、意味はあまりないとは思いますが、次のような事を試しました。

0行目の質量のみ桁が大きく違うため、1列目とずれてうまく読み込めていないと考えて
ID以降の値の間にタブ空白を入れるなど、datファイルのフォーマットを整えてみましたが、うまく読み込まれませんでした。

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

Ubuntu 20.04.1 LTS
gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
gnuplot Version 5.2 patchlevel 8

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

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

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

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

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

guest

回答2

0

ベストアンサー

桁が一つ足りないのではないかな、と。

c

1 //r = 5.0*AU; 2 r = 10*5.0*AU;

splot

投稿2021/11/20 04:18

編集2021/11/20 04:19
melian

総合スコア19865

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

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

geospace291

2021/11/20 04:27

回答いただきありがとうございました。不注意によるミスにもかかわらず、わざわざ描画までしていただき、わかりやすくて大変助かりました。
guest

0

1行目以外は range (5.0AU)の範囲外で表示されていないだけでは

投稿2021/11/20 04:18

sigsegv

総合スコア895

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

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

geospace291

2021/11/20 04:27

完全に私の不注意でした。ご回答いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問