- ベストアンサー
Pythonコードでテキストファイルからデータを抽出し、グラフを描画する方法
- Pythonのコードを使用して、テキストファイルから特定のデータを抽出する方法を教えてください。
- 抽出したデータを整数に変換し、グラフにプロットする方法を教えてください。
- x軸に抽出した行数、y軸に抽出したデータをプロットし、グラフを描画するコードを提供してください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ちょっと語気が荒かったかもしれません。すみません。 >⇒100、200、300のことでしょうか? > A、B開始の行は、統一されてると思っておりますが間違ってますでしょうか。。 私が問題だと思うのは、A・B開始の行ではなく、データブロックの開始行です。 現状、入力した3桁数字だけで開始行を認識していますね。 それは、たまたま、ブロック内に"100"・"200"・"300"というデータがないから、うまく動いているに過ぎません。 万が一そのようなデータがブロック内に含まれれば、このプログラムは間違った位置からブロックの取り込みを開始してしまいます。 また、データブロックの終了判定が省かれていますから、100でも200でも、該当行以下、データファイルの末尾まで、全て取り込んでしまうことになってしまっています。 ここで例えば、データブロックの始まりは、必ず「<数字>」にする、と決めたとしましょう。 そうすれば、「<」+キーワード+「>」 という文字列でマッチさせることにより、ブロック開始の数字と、データブロック内の数字を混同することは無くなります。 そしてデータブロックの終端を、「行頭に『<』がある」で判別できるようにもなります。 ># (1)該当する行数をどうやってカウントすればよいでしょうか? こちらの件は、結合前、すなわち元の x(リスト値) を見ればいいです。 リスト値 x の現在の要素数は、len(x) で調べることができます。 グラフの件は、ちょっと今実行環境がないので別の機会に考えてみます。
その他の回答 (1)
- asciiz
- ベストアンサー率70% (6849/9743)
ええと、、 プログラムのアルゴリズム以前の指摘事項が沢山あります。 ・なぜデータブロックの開始・終了行を統一的にしないのですか? あなたが用意するデータなんですよね? だったらデータ開始行の書式を統一したり、データ終了行を一定のものにすることで、その行数を数えることは簡単になります。 非統一データを扱おうとするとプログラムがより複雑になってしまうので、対応するプログラムが書けなくなるんです。 簡潔で信頼性のあるプログラムにするために、データの整備は大切なことです。 ・即値でコメントを書くのをやめましょう。 >'該当行数' >'データ取得 int型に変換' >'横軸の変数。縦軸の変数。' そういうプログラミングメモは、すべて # のあとにコメントとして書いてください。 確かにプログラム中に 1 とか 2 とか ‘abc’ などと書いてもpythonプログラムに影響は与えませんけど、他のプログラミング言語では無駄にオブジェクトサイズに影響が出たりして良くありません。 先日のSyntax error も閉じクォートを忘れたとかじゃないんですか。そんなバカなバグを発生しうるそんな書き方は邪道で、気持ち悪いです。やめましょう。 ・Windowsのパス区切り文字はすべて\\で書いてください。 文字列中の「\\」が、1文字の「\」を表します。 →path = 'C:\\Users\\xxxx\\Desktop\\python' ・# (1)該当する行数をどうやってカウントすればよいでしょうか? その直前で >n = ''.join(x) これをやってしまってるから、行が全て結合され、1行になっています。 結合後の文字列に\nは含まれませんから、行数カウントもできません。 値がどうなっているのか想像できなければ、「print(n)」とか「print(x)」などを入れて、表示してみてください。 プログラムがちゃんと動くようになれば、print行は削除するか、#でコメント化して除去すればいいんです。 ・ #(2)分布図ではなくて、単純にx軸:該当行数、y軸:データのグラフにしたいのですがエラーになります。 分布図が描けているならば、データはとれているわけです。 あとはプログラムでの描画次第。 取得できた(x, y) の位置に点を表示するだけだから、そりゃ散布図になります。 棒グラフにしたければ、データごとに (x, 0) から (x, y) までの棒を書かなきゃいけません。 折れ線グラフにしたければ、1つ前の(x, y)から、今回の(x, y)までの線を引かなければいけません。 どういうグラフを描きたいのですか。それに依ります。
お礼
ありがとうございます。 >だったらデータ開始行の書式を統一したり、データ終了行を一定のものにすることで、その行>数を数えることは簡単になります。 ⇒100、200、300のことでしょうか? A、B開始の行は、統一されてると思っておりますが間違ってますでしょうか。。 コメントの書き方もセンスがいりますね。。気を付けます。 >・Windowsのパス区切り文字はすべて\\で書いてください。 ⇒分かりました。 >これをやってしまってるから、行が全て結合され、1行になっています。 >結合後の文字列に\nは含まれませんから、行数カウントもできません。 ⇒これは、その後のデータを取得するために、結合しました。 はい、print確認は行っています。 >どういうグラフを描きたいのですか。それに依ります。 ⇒取得行に対して、取得したデータを表示するプロット図を描きたいと思ってます。 x軸:blockで該当する行数、y軸:各行のデータ y = dat と記載しているのも、記載したblockでの出力は該当行が3つあります。 なので、データ1(1,60)、データ2(2,340)、データ3(3,99)でグラフを作りたいと考えてます。
補足
お礼に記載したいグラフを書く場合、 x = np.arange(0, 6, 1) ⇒ x = np.arange(0, 3, 1) にしないといけないと思いますので、 行数を取得できれば、引数に変数を記載する予定です。 '計算式'をどのように書けばよいのか困ってます。
お礼
ありがとうございます。 データブロックの開始行については、”<”、”>”が開始ブロック以外にも混ざる場合があります。ので、数値だけをキーワードにしたいとしてます。 >また、データブロックの終了判定が省かれていますから、100でも200でも、該当行以下、データファイルの末尾まで、全て取り込んでしまうことになってしまっています。 ⇒仰せのとおり、これは気になってます。取り込んだファイルのデータの最終行までで 終了したいので、このままでも良いのかなと思っています。 >リスト値 x の現在の要素数は、len(x) で調べることができます。 ⇒あっ、知ってる関数でも、なかなか使用するときに出てこないものですね。 こんなことでは、なかなか使いこなすレベルへの上達は難しいですね。。 >グラフの件は、ちょっと今実行環境がないので別の機会に考えてみます。 ⇒ありがとうございます。ぜひよろしくお願いいたします。
補足
失礼しました。 x = np.arange(0,ma, 1) maにlenの値を代入するとちゃんとグラフが作成できました。 色々とありがとうございました。