キーワード検索結果のグラフ表示方法

このQ&Aのポイント
  • キーワード検索で対応した行の各ブロック(100、200、300)を取得し、グラフのx軸に表示させる方法について説明します。
  • テキストファイルからキーワードに対応する行を抽出し、グラフの横軸に表示させることができます。
  • 抽出した行のデータをグラフ化し、キーワードに対応する部分を視覚的に確認できます。
回答を見る
  • ベストアンサー

またまた困ってます。

◆実現したいこと。(困っていること。) 以下の内容から、生成されるグラフのx軸にキーワード検索で対応した 行の各ブロック(100、200、300)を同時に取得し、 それをグラフのx軸に表示させたいのですが、どうすればできるでしょうか? 取り込むテキストファイルの内容は以下のとおりです。 <100> A 1-1 電球,"10","1" A 2-1 テレビ,"20","2" A 3-1 エアコン,"30","3" A 4-1 コンロ,"40","4" A 5-1 せんぷうき,"50","5" A 6-10 電卓,"60","6" //200// A 1-1 とうがらし,"150","20" A 2-1 なす,"160","21" A 3-1 とまと,"210","22" A 4-1 きゃべつ,"320","23" A 5-1 だいこん,"220","24" B 6-10 あぼがど,"340","25" ・300 A 1-1 やきとり定食,"98","30" A 2-1 野菜定食,"198","31" A 3-1 とんかつ定食,"298","32" A 4-1 やきにく定食,"398","33" A 5-1 こんもり定食,"498","34" A 6-10 まかない定食,"99","35" #コード import re import numpy as np import matplotlib.pyplot as plt def extract_text_in_file(filepath, keyword): extracted_text_array = [] with open(filepath, encoding="utf-8") as f: line = f.readline() # 1行ずつ処理 while line: if re.search(keyword, line): # 抽出したいキーワード行を取り込む extracted_text_array.append(line) line = f.readline() return extracted_text_array path = 'C:\\\\Users\\xxxx\\Desktop\\python' file_name = './' + '123.txt' target = path + file_name block = input() #block = "6-10行を取り込む" x = extract_text_in_file(target, block) n = ''.join(x)  '該当行数' # (1)該当する行数をどうやってカウントすればよいでしょうか? 'データ取得 int型に変換' m = re.findall(r'\d+', n) dat = m[2::4] dat = list(map(int, dat)) print(dat) 'グラフ描画' '描画範囲の指定' 'x = np.arange(x軸の最小値, x軸の最大値, 刻み)' x = np.arange(0, 6, 1) '計算式' y = dat '横軸の変数。縦軸の変数。' plt.plot(x, y,"r-o")   #plt.plot(x,y,”色線点”) plt.xlabel("X-axis")  #x軸の名前 plt.ylabel("Y-axis")  #y軸の名前 '描画実行' plt.show()

  • Python
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • asciiz
  • ベストアンサー率70% (6633/9397)
回答No.1

すみませんがまずデータの話から。 前の回答に書こうと思ったんですが締め切られて追記できませんでしたので…。 >データブロックの開始行については、”<”、”>”が開始ブロック以外にも混ざる場合があります。 >ので、数値だけをキーワードにしたいとしてます。 別に、他の行の途中に混ざっても構いません。例えば100なら"<100>" という前後の記号込みでマッチさせることにより、確実にブロック開始行を見つけよう、というのが目的です。 "<" ">"が他の行にも表れる、しかも"<100>"という形で現れる可能性があるというなら、もっと別の開始行定義、"begin-"と"-block"でくくったもの、"begin-100-block" みたいにするんでもいいです。 とにかく、データ開始行とブロックデータ行を混同しないようにしなきゃいけません。そう思いませんか。 例えば、データの後半部分がこのようにありますが、 >A 4-1 きゃべつ,"320","23" >A 5-1 だいこん,"220","24" >B 6-10 あぼがど,"340","25" >・300 >A 1-1 やきとり定食,"98","30" >A 2-1 野菜定食,"198","31" >A 3-1 とんかつ定食,"298","32" >A 4-1 やきにく定食,"398","33" >A 5-1 こんもり定食,"498","34" >A 6-10 まかない定食,"99","35" もし「A 4-1 きゃべつ」のところにあるデータが"300","23" だった場合、数字だけの"300"をマッチさせたら、そこが300ブロックの開始行だと思ってしまうんです。 開始行を間違えば、その後のデータ取得もプロットも意味を成しません。 それとも、ブロック開始の数字は、絶対にブロックデータに含まれないことが保証されているんでしょうか? 将来にわたってそのルールをずっと覚えていられますか? データを整備すれば、異常動作を無くせます。 そしてブロック終端もきちんと判別できるので、100ブロックなら100ブロックの6行、200ブロックなら200ブロックの6行といったものを、きちんと抽出できます。 データプロット以前に、まずデータ自体をきちんと抽出できるプログラムを書きましょう。

the-man
質問者

お礼

>とにかく、データ開始行とブロックデータ行を混同しないようにしなきゃいけません。そう思いませんか。 ⇒たしかに仰せのとおりです。データの管理(ルール)も考えないといけないですね。。  基本的なことだったかもしれませんが、ご指摘ありがとうございます。。  いかにプログラムを簡易に考えられるようにするか準備するのは大事ですね。

関連するQ&A

  • 困ってます。。

    文中の(1)と(2)が分からず困ってます。。 取り込むテキストファイルの内容は以下のとおりです。 <100> A 1-1 電球,"10","1" A 2-1 テレビ,"20","2" A 3-1 エアコン,"30","3" A 4-1 コンロ,"40","4" A 5-1 せんぷうき,"50","5" A 6-10 電卓,"60","6" //200// A 1-1 とうがらし,"150","20" A 2-1 なす,"160","21" A 3-1 とまと,"210","22" A 4-1 きゃべつ,"320","23" A 5-1 だいこん,"220","24" B 6-10 あぼがど,"340","25" ・300 A 1-1 やきとり定食,"98","30" A 2-1 野菜定食,"198","31" A 3-1 とんかつ定食,"298","32" A 4-1 やきにく定食,"398","33" A 5-1 こんもり定食,"498","34" A 6-10 まかない定食,"99","35" #コード import re import numpy as np import matplotlib.pyplot as plt def extract_text_in_file(filepath, keyword): extracted_text_array = [] with open(filepath, encoding="utf-8") as f: line = f.readline() # 1行ずつ処理 while line: if re.search(keyword, line): # 抽出したいキーワード行を取り込む extracted_text_array.append(line) line = f.readline() return extracted_text_array path = 'C:\\Users\xxxx\Desktop\python' file_name = './' + '123.txt' target = path + file_name block = input() #block = "6-10行を取り込む" x = extract_text_in_file(target, block) n = ''.join(x)  '該当行数' # (1)該当する行数をどうやってカウントすればよいでしょうか? 'データ取得 int型に変換' m = re.findall(r'\d+', n) dat = m[2::4] dat = list(map(int, dat)) print(dat) 'グラフ描画' '描画範囲の指定' 'x = np.arange(x軸の最小値, x軸の最大値, 刻み)' x = np.arange(0, 6, 1) '計算式' y = dat  #(2)分布図ではなくて、単純にx軸:該当行数、y軸:データのグラフにしたいのですがエラーになります。 '横軸の変数。縦軸の変数。' plt.plot(x, y,"r-o")   #plt.plot(x,y,”色線点”) plt.xlabel("X-axis")  #x軸の名前 plt.ylabel("Y-axis")  #y軸の名前 '描画実行' plt.show()

  • さっぱり分からず困ってます。。

    読み込むテキストファイルは下記のとおりです。 <100>  A xxx  A ddd  A ccc  A vvv  B zzz //200//  A xx1  A dd1  A cc1  A vv1  A zz1 ・300  A 3xx  A 3dd  A 3cc  A 3vv  A 3zz 上記のテキストファイルから、100,200,300のキーワードで該当箇所から 次行を表示するプログラムを考えています。 下記のプログラムで実行すると、取得できるのですが、何度も繰り返し出力します。 1回で良いのですが、何度も繰り返す処理を記載しているつもりが無いのに、何故繰り返すのか意味不明で困ってます。 どうすれば、修正できるでしょうか。。 import re def extract_text_in_file(filepath, pattern_prev, pattern_next): '空のリスト生成' extracted_text_array = [] '抽出したい範囲' pattern = pattern_prev + '(.*)' + pattern_next 'ファイルオープン' with open(filepath) as f: lines = f.readlines() '改行削除、文字列に変換' lines_strip = [line.strip() for line in lines] lines_strip = "".join(lines_strip) '文字列lines_stripから抽出範囲を取得し、リストに追加' for i in lines_strip: tmp_extracted_text_array = re.findall(pattern, lines_strip) extracted_text_array.extend(tmp_extracted_text_array) return extracted_text_array path = 'C:\\Users' file_name = '/' + '***.txt' target = path + file_name pa_prev = '100' pa_next = 'B' x = extract_text_in_file(target,pa_prev,pa_next) print(x)

  • Unixサーバーを用いて

    unixサーバーを用いて以下のFortranプログラムを作成せよ。 y=x**3-5*(x**2)-2*x+24のグラフを23行80桁の画面上に描画するプログラムを作成せよ。 1)描画範囲のx(例ー1から+6まで)をキーボードから入力し、その範囲を画面全体に描画せよ。 2)描画範囲のぐらふが画面に収まるよう、y軸の描画範囲を自動的に調整せよ。 以上の問題を解けなくて困っています。 だれか解る方がいればよろしくお願いします。

  • Excelについて(グラフ作成)

    Excelでグラフを作成するときに、 例えば、x軸をA列の値、y軸をB列の値にしたいのなら2列を選択して グラフは簡単にできるのですが、それでは x軸をA列の値、y軸はある関数の値(例えばB1に入っているy=2*xのyの値)にしたいときはどうすれば良いのでしょうか? 分りやすくいうと、A列には1行目から 0 、2 、 4 、 6 、 8 、 10 、 12 ・・・・・ B1に、y = 2 * xが入っていてここから x=0 のとき y=0 x=2 のとき y=4 x=4 のとき y=8 x=6 のとき y=12 x=8 のとき y=16 x=10 のとき y=20 よりグラフを作りたいのです。 よろしくお願いします。

  • アルゴリズム : 円描画

    画像を作ってるのですが、円描画のまともな方法が分かりません。 現在は、数学っぽいサイトを検索した所円の方程式は r2乗 = X2乗 + Y2乗 と言うのが出てきたのでそれを元に作ってます。 具体的には、y軸に近い部分はx軸から。x軸に近い部分はy軸から描画を始め、 それそれ8回に分けて一つの円を描画しまてす。 イメージ的には rを定数とし、y軸の直下や真上付近ならx軸を一つづつずらし、yの値を求めます。 x軸の右側付近とかならy軸をずらします。 数学風に書くと y ** 2 = (x + n) ** 2 + r ** 2 みたいなイメージです。(n = 何個目のドットを描画しているか。**はPerlなどでべき乗)。 これの平方根を求めて端数を四捨五入してます。 この方法だと軸から遠ざかると塗りつぶすドットが飛び飛びになるので8回(もしくは4回)の描画が必要です。 問題はまず、 それが一般的な方法かどうかと言う点です。8回に分けるもんだから処理が汚いです。 さらになぜか、円も汚いです。 いや理由はだいたい分かるんですけど、ドット数に少数点とかないから四捨五入とかしてます。 すると、どうもちゃんとした円にならないです。そこドットの描画一個ズレてるだろコレ? おまえそれ、明らかに1ドットずらしたほうが綺麗な円になるぞ? みたいことが起きます。 もう一つ、他の疑問なんですがちょっと数学的な疑問で、 円を1/8づつ描画させるにはnのループ回数を n = r / (1.4140 < m < 1.4146) くらいの値に設定しなきゃならないことが分かりました。 なぜ割り算させたのかはもう覚えてません。 一つづつ手作業で確かめて絞り込んだ数値なのですが、 どうもmが2の平方根に似ている気がします。 なぜこうなるんでしょう。たぶん数学的な何かだと思うのですが。 なお数学的な知識は全然ないです。学校では一日中寝るのが特技でした。 まさかこんな技術が必要になるとは…。

  • 「系列の追加」以外でのグラフ化を行いたい

    X軸共通で凡例のYの条件がどんどん増えていく 下記のような表のグラフ化(散布図)を行う必要があります。 X 0.4 0.3 1.2 1.4 A1 1.2 1.4 1.5 1.6 A2 2.1 2.4 2.5 2.5 A3 2.2 2.4 2.5 2.7 ここで、X軸は1行目共通で、Y軸にA1、A2、A3をそれぞれ とっていくのですが、一気にグラフ化する方法はありますか? 現状、『元のデータ』⇒ 『系列の追加』⇒ Xの値、Yの値をそれぞれ 追加する方法でA1、A2、A3とグラフを作成しており、かなり時間 と手間をかけています。 エクセルのグラフは、簡便化のため、行、列のコピーペーストで 系列の追加が行えるとのことですが、今回のような場合、 (例えば)A3列をコピーして、グラフ上で ペーストすると、X軸が1行目ではなくなっており、 グラフ上でX軸の修正をする必要が出てきます。 そこで、軸を固定にして項目の追加を行う方法を ご存知でしたら教えていただきたいです。 以上、宜しくお願い致します。

  • エクセルのグラフについて

    x | y1 |y2 |y3 |x | y1 |y2 |y3 |x | y1 |y2 |y3 | x1 |a1 |b1 |c1 |x4 |a4 |b4 |c4 |x7 |a7 |b7 |c7 | x2 |a2 |b2 |c2 |x5 |a5 |b5 |c5 |x8 |a8 |b8 |c8 | x3 |a3 |b3 |c3 |x6 |a6 |b6 |c6 |x9 |a9 |b9 |c9 | というような表があって、x軸をx1~x9として、y軸に、y1のa1~a9、y2のb1~b9、y3のc1~c9のデータを載せた1つのグラフを作りたいのですが、うまく作れません。x1~x3とx4~x6とx7~X9を結びつければ作れると思い、やってみたのですがうまくできませんでした。都合上、x3の行の下には、x4の行以降のデータを持ってこれないので、できれば、上のような表があったときのグラフの作り方を教えていただきたいのです。よろしくお願い致します。

  • Matlab 2行の行列をプロットしたいのですが

    こんにちは、Matlabを使い始めのものです。 二行の行列(2x10とか2x40など)にについて、一行目をx座標、二行目をy座標としてグラフ化したいのですが、うまくいきません。 自動的にx座標は列の番号となり、二つのグラフが現れてしまいます:y座標に一行目、二行目、両方がプロットされてしまいます。どうにか、一行目をx、二行目をy座標としてグラフ化できないでしょうか。おそらく、とても単純なことなのかもしれないのですが、どうしてもわからず、とても歯がゆい思いをしています・・・。どうかご教示ください。 何をしたいかといいますと、音声データをMatlabで取り込んだのですが、振幅データがずらっと並んだ、1x500000とかの行列が得られます。 これを、プロットすると、x軸はサンプル番号が並ぶわけですが、本当はx軸は時間であって欲しいため、音声データの行列にひとつ行を足して、時間軸を作ってあげました。つまり、今手元にあるのは、2x500000の行列で、一行目が時間、二行目が振幅となっています。これをx軸が時間軸、でy軸が振幅となるようにグラフ化してあげたいと考えています。 文章がわかり辛くて申し訳ないのですが、何卒よろしくお願いします。

  • Fortranの出力の改行について

    Fortran超初心者です。 test1.csvのファイルには、x,yの変数がずっと続いています。 test2.datのファイルには、a,bの変数がずっと続いています。 この2つのファイルの変数を元に、d,eの値を求め、それをtest3.csvというファイルに出力したいのです。 test1.csvとtest2.datの計算はできていたのですが、test3.csvの出力は最後の計算結果のみしか出力されていません。 多分毎回出力はしているのですが、計算を繰り返すと上書きされ消えてしまうという仕組みになっているのだと思います。 どうやったら上書きされずに、csvファイルの次の行に次のデータを入力できますか? 以下私が考えたFortran90のプログラムです。 open (10, file='test1.csv', status='old')  do   read (10, *, iostat=ios) x, y   open (11, file='test2.dat', status='old')   do    read (11, *, iostat=jos) a, b    d = x +a    e = y + b    if (jos .lt. 0) exit   enddo   open (12, file='test3.csv', status='replace')   write (12, *) x, y, a, b, d, e   close (12)   close (11)   if (ios .lt. 0) exit  enddo close (10) 本当に始めたばかりで、いまいち意味の分かっていない部分もあるのですが、問題点を指摘してくれたら助かります。 わかりにくいので、具体的に少し書くと、 test1.csvには 1,2 9,3 6,4 とデータが続くとします。 test2.datには 80,50 10,20 90,60 とデータが続くとします。 test3.datには 1,2,80,50,81,52 1,2,10,20,11,22 1,2,90,60,91,62 9,3,80,50,89,53 9,3,10,20,19,23 9,3,90,20,99,23 6,4,80,60,86,64 6,4,10,20,16,24 6,4,90,20,96,24 と出力されるようにしたいのです。 実際のデータや変数名も違いますが、プログラムの構造は同じです。 よろしくおねがいします。

  • 数学についての質問です。

    添付した画像中の3行目から4行目への式変形についての質問です。 F(x,y)にはΣが含まれているのに、F(x,y)を代入したあとの式では消えているのでしょうか?下の方の式でG(x,y)を代入したところでも同様にΣが消えています。 もしよろしければ、F(x,y)にsin(mπx/a)・sin(nπy/a)をかけて、xとyでそれぞれ0→aまで積分することでDmが導き出せる原理も教えてください。 http://www.fastpic.jp/images.php?file=5751812154.jpg

専門家に質問してみよう