Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

数値がいくつか詰められた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のようなやつを作ればいいと思います。(他にもいいやり方はあると思いますが)

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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away