LoginSignup
1
3

More than 5 years have passed since last update.

pythonで数値のファイルを読み込み、二次元グラフを書く方法

Last updated at Posted at 2018-11-28

数値がいくつか詰められたdatファイルを扱ってて、gnuplotなどで二次元のグラフ(y=sinxなど)にすることは出来るものの、pythonで二次元ヒストを作る場合どうするんだろうなぁとなって、自分なりに調べてやってみたのをサンプルコード的な感じで残しておこうと思い書いてみます。

重点を置いているのは、ファイルを読み込んでmatplotlibで2次元グラフを書くことです。

環境は
Python 3.6.4
matplotlib 2.1.2
MacOS High Sierra ver 10.13.6

1. 例としてsinxに関するdatファイルを作成する

本来は次のsin.datのような形のデータを既に持っていてそれを読み込ませるのですが、持ってない方のためにもここではまずdatファイルを作ってみます。

sin.dat
"x1軸の値" "sin(x1)の値"
"x2軸の値" "sin(x2)の値"
"x3軸の値" "sin(x3)の値"
・・・
・・・
・・・

このsin.datを作るには次のようにすればいいです。
・genesin.pyを作成

genesin.py
import math

for n in [0.1*x for x in range(70)]: 
    print(round(n,3), math.sin(n))

リスト内包表記を用いてますが何でもいいです。
range(70)は単に2πの範囲まで入れたいだけでこれも自由に変えてください。roundも無くてもいいです。

作成後、

genesin.pyと同じディレクトリで
python genesin.py>>sin.dat

のようにリダイレクトすると以下のようなsin.datファイルが作成できます。

sin.dat
0.0 0.0
0.1 0.09983341664682815
0.2 0.19866933079506122
0.3 0.2955202066613396
0.4 0.3894183423086505
0.5 0.479425538604203
0.6 0.5646424733950355
0.7 0.6442176872376911
0.8 0.7173560908995228
0.9 0.7833269096274833
1.0 0.8414709848078965
1.1 0.8912073600614354
1.2 0.9320390859672264
1.3 0.963558185417193
1.4 0.9854497299884603
1.5 0.9974949866040544
1.6 0.9995736030415051
1.7 0.9916648104524686
1.8 0.9738476308781951
1.9 0.9463000876874145
2.0 0.9092974268256817
2.1 0.8632093666488738
2.2 0.8084964038195901
2.3 0.74570521217672
2.4 0.6754631805511506
2.5 0.5984721441039564
2.6 0.5155013718214642
2.7 0.4273798802338298
2.8 0.33498815015590466
2.9 0.23924932921398198
3.0 0.1411200080598672
3.1 0.04158066243329049
3.2 -0.058374143427580086
3.3 -0.15774569414324865
3.4 -0.25554110202683167
3.5 -0.35078322768961984
3.6 -0.44252044329485246
3.7 -0.5298361409084934
3.8 -0.6118578909427193
3.9 -0.6877661591839741
4.0 -0.7568024953079282
4.1 -0.8182771110644108
4.2 -0.8715757724135881
4.3 -0.9161659367494549
4.4 -0.9516020738895161
4.5 -0.977530117665097
4.6 -0.9936910036334645
4.7 -0.9999232575641008
4.8 -0.9961646088358406
4.9 -0.9824526126243325
5.0 -0.9589242746631385
5.1 -0.9258146823277321
5.2 -0.8834546557201531
5.3 -0.8322674422239008
5.4 -0.7727644875559871
5.5 -0.7055403255703919
5.6 -0.6312666378723208
5.7 -0.5506855425976376
5.8 -0.4646021794137566
5.9 -0.373876664830236
6.0 -0.27941549819892586
6.1 -0.18216250427209502
6.2 -0.08308940281749641
6.3 0.0168139004843506
6.4 0.11654920485049364
6.5 0.21511998808781552
6.6 0.3115413635133787
6.7 0.40484992061659836
6.8 0.49411335113860894
6.9 0.5784397643882002

2. sin.dat読み込んで二次元グラフにしてみる。

と言っても、以下のコードでsin.datのpathだけ正しく変更すれば実行できるので、コードとコメント等を書いて載せておくだけに留めます。(僕自身がいつか思い出すためにコメントをたくさん書いてますが、間違えてたらすみません。)

displaysin.py
import matplotlib.pyplot as plt

'''空のリストを用意して、後にx_listにxの値を詰め、y_listにsinxの値を詰めていく'''
x_list=[]
y_list=[]

'''sin.datをファイルをテキストモードで読み込む'''
f=open('sin.dat', 'rt')

'''fから一行ずつ取ってxとsinxの値をx_listとy_listに詰め込んでいる'''
for line in f:
    data=line[:-1].split(' ') 
#    print(data) '''dataがどういう形になるか気になる方は#を外して実行してみてください。'''
    x_list.append(float(data[0]))
    y_list.append(float(data[1]))


#plt.plot(x_list, y_list,color='BLUE',linewidth=3.0) '''線でつないだ絵を見たい場合'''

plt.plot(x_list, y_list, 'o', linestyle='None')

'''横軸と縦軸のラベル付け'''
plt.xlabel('x')
plt.ylabel('y')

'''グリッド線を引く'''
plt.grid(True)

'''表示'''
plt.show()

日本語のコメントを入れたために「インデントがおかしい」みたいなエラーを吐かれたりすることもあるので、実行できない場合は日本語のコメントを削除してみるといいかも?です。

実行

これを

python displaysin.py

で実行してあげると

スクリーンショット 2018-11-29 0.40.40.png

このようなsinxの二次元散布図が出来上がります。
以上のように、スペースで区切られたdatファイルを読み込ませて二次元散布図等を作りたい場合はdisplaysin.pyのようなやつを作ればいいと思います。(他にもいいやり方はあると思いますが)

とりあえず一旦ここで終わります。
今後も追加していこうかと思っています。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3