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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

718閲覧

テキストファイル内のデータの一部を抽出してプリント&プロットしたい

balckbell

総合スコア16

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2019/01/25 07:49

編集2019/01/25 07:53

Python3を勉強している最中に行き詰ってしまいました。お時間がある方、是非ご指導お願いいたします。

###実現したいこと

テキストファイルa.txt内のデータのうち、2列目(c1)の値がmin以上max以下であるものだけ抽出して表示&一列目(c0)の行番号を横軸、2列目の値を縦横に設定し、黒い直線としてプロットしたい。      

ソースコード↓

Python3

1import numpy as np 2import matplotlib.pyplot as plt 3 4f= 'a.txt' 5min= 0.0085 6max= 0.0090 7c0,c1,c2= np.loadtxt(f, unpack=True) 8 9infile= open(f, 'r') 10for line in infile: 11 cols=line.split() 12 c0= int(cols[0]) 13 c1= float(cols[1]) 14 c2= float(cols[2]) 15 if c1 >= min and c1 <= max: 16 plt.plot(c0, c1) 17 plt.show() 18 print(c0, c1)

a.txt にデータを書き込むためのコード↓

Python3

1import numpy as np 2 3b = np.arange(0.005, 0.05, 0.0001) 4c = np.arange(1.5, 2.51, 0.01) 5 6with open('a.txt','w') as f: 7 for a in range(1,101): 8 f.write('{:<3d} {:<3f} {:<3f}\n'.format(a,b[a-1],c[a-1])) 9 10"""" 111 0.005000 1.500000 122 0.005100 1.510000 133 0.005200 1.520000 144 0.005300 1.530000 15... 1636 0.008500 1.850000 1737 0.008600 1.860000 1838 0.008700 1.870000 1939 0.008800 1.880000 2040 0.008900 1.890000 2141 0.009000 1.900000 22... 2398 0.014700 2.470000 2499 0.014800 2.480000 25100 0.014900 2.490000 26"""" 27

###実行結果と発生した問題
問題1:抽出したいデータを正しく抽出できなかった。

ソースコードを実行すると、ターミナル上には1行目から35行目まで表示されました。抽出したかったのは、36行目から41行目までです。

問題2:表示したいグラフを正常に表示できなかった。横軸(c0)が浮動小数点数になってしまった。

実行すると、以下のようなグラフが複数個表示されました。表示されたグラフ
複数でたグラフについて、それぞれのグラフは縦軸と横軸の値が少しずつ違っていますが、何もpictureが表示されていないという点は同じです。

情報の不足があれば随時追記します。ご指導よろしくお願いいたします。

###実行環境
macOS Mojave
Atom 1.31.2

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

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

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

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

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

hayataka2049

2019/01/25 08:06

a.txt にデータを書き込むためのコードを実行してからソースコードを走らせてみましたが、質問文で説明されている状況と違った出力になるようです。質問文に何か間違いがあるのでは?
balckbell

2019/01/25 19:54

今実行し直してみたところ、確かに違う結果が得られました。混乱を生んでしまいすみません。間違いを探してみます。ご指摘ありがとうございました。
guest

回答2

0

ベストアンサー

書き直すならこんな感じですかねぇ。

python

1import numpy as np 2import matplotlib.pyplot as plt 3 4file_name= 'a.txt' # fだとわかりづらい 5min_ = 0.0085 # min, maxは組み込み関数とかぶるからやめる 6max_ = 0.0090 7c0,c1,c2= np.loadtxt(file_name, unpack=True) 8# せっかく読み込んだのに改めてopenするのは無駄…… 9 10idx = (min_ <= c1) & (c1 <= max_) # 条件に対応するboolean arrayを作れば良い 11x, y = c0[idx], c1[idx] # 作ったidxで抽出 12plt.plot(x, y) # 配列で渡せば一度のplotで可 13plt.show() # 複数回showを呼ぶと呼ぶたびに表示されるので一度だけ呼ぶ 14

投稿2019/01/25 08:14

hayataka2049

総合スコア30933

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

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

balckbell

2019/01/25 19:52

hayataka2049さん、丁寧な説明付きの回答をありがとうございます。 追っていくつか質問があります。お時間があるときにお答えいただけると助かります。 改めてopenする必要がないとのことですが、loadtxtが open file&load data という二つのタスクを行なっているという認識であっているでしょうか? また、idx=...の部分では、idxという変数に論理式を代入しているのでしょうか? line.spritが必要ないのは、loadtxtの文でunpack=Trueとして列を扱うと提示しているからでしょうか? よろしくお願いいたします。
hayataka2049

2019/01/26 06:41

>改めてopenする必要がないとのことですが、loadtxtが open file&load data という二つのタスクを行なっているという認識であっているでしょうか? はい >また、idx=...の部分では、idxという変数に論理式を代入しているのでしょうか? ブール値の配列です。実際にprintなどして確認してください。 >line.spritが必要ないのは、loadtxtの文でunpack=Trueとして列を扱うと提示しているからでしょうか? 基本的にそうですが、loadtxtの時点でnumpy配列になっているのでそもそも文字列として処理する過程が入りません。
balckbell

2019/01/26 07:35

それぞれの質問に対し丁寧にご回答くださりありがとうございます。 とても良い勉強になりました。ありがとうございました。
guest

0

描画したい座標値(点群)を保持しておいて、最後に描画すればよいです。

Python

1import numpy as np 2import matplotlib.pyplot as plt 3 4f= 'a.txt' 5min= 0.0085 6max= 0.0090 7c0,c1,c2= np.loadtxt(f, unpack=True) 8 9x,y = [],[] # ***** 10infile= open(f, 'r') 11for line in infile: 12 cols=line.split() 13 c0= int(cols[0]) 14 c1= float(cols[1]) 15 c2= float(cols[2]) 16 if c1 >= min and c1 <= max: 17 # 座標値を保持しておく 18 x.append(c0) 19 y.append(c1) 20 print(c0, c1) 21 22# 最後に描画 23plt.plot(x, y) 24plt.show()

イメージ説明

投稿2019/01/25 08:08

can110

総合スコア38262

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

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

balckbell

2019/01/25 19:43

can110さん、コメントも入れたわかりやすい回答をありがとうございます。グラフが複数個表示されたのは、pltがループの中に入っていたからなのですね。完全に見過ごしていました。 おって質問なのですが、x,y=[],[]というところでは、x,yそれぞれにリストを作成しているということでしょうか? また、x.append(c0)で、x=c0とできないのはなぜですか? お時間がある際にご回答いただければ幸いです。
can110

2019/01/25 22:00

> x,y=[],[]というところでは、x,yそれぞれにリストを作成しているということでしょうか? はい。そうです。また、x=c0(=int(cols[0]))だと単一の値しか保持できていないのでリストに複数の値を保持するようにしています。 ただ、質問コード全体をよく見てみるとすでにc0,c1,c2にデータ全体を読み込んでいますね。 よってhayataka2049さんの回答コードのほうが無駄がなくて良いと思います。
balckbell

2019/01/25 23:47

なるほど、わかりました。フォローアップまでありがとうございました。 はい、hayataka2049さんには、改めて読み込む必要はないとご指摘をいただきました。 とても勉強になりました。本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問