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

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

新規登録して質問してみよう
ただいま回答率
85.35%
MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1480閲覧

pythonでのグラフのプロット

kaeruuuun

総合スコア19

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/06/03 04:19

編集2021/06/03 08:26
import time import matplotlib.pyplot as plt import math import numpy as np import matplotlib DNA ='ACGT' s = '' N=10 myBytes = {} st0_time = time.time() for n in range(5000,100000,5000): myBytes[n] = (s.join([random.choice(DNA) for i in range(n)])).encode() lap1_time =0 lap2_time =0 for j in range(N): st1_time = time.time() xR = makeSuffixArrayByInducedSorting(myBytes[n],256,0,False) et1_time = time.time() lap1_time = et1_time-st1_time +lap1_time st2_time = time.time() nR = naivelyBuildSA(myBytes[n]) et2_time = time.time() lap2_time= et2_time-st2_time + lap2_time ave1=lap1_time/N ave2=lap2_time/N print("processing time:{} {} {}".format(ave1,ave2, xR==nR)) y1 = lap1_time y2 = lap2_time x = n fig=plt.figure() fig, ax = plt.subplots(figsize=(4.5, 3.8)) ax.plot(x, y1/10, marker="o", color = "red", linestyle = "--",label = "makeSuffixArrayByInducedSorting") ax.plot(x, y2/10, marker="v", color = "blue", linestyle = ":",label = "naivelyBuildSA"); ax.legend() plt.savefig('figure.png') plt.close() ``` もともとplt.close()を付けないと<ipython-input-61-bfa60127fb8a>:31: RuntimeWarning: More than 20 figures have been opened. Figures created through the pyplot interface (`matplotlib.pyplot.figure`) are retained until explicitly closed and may consume too much memory. (To control this warning, see the rcParam `figure.max_open_warning`). fig=plt.figure() このようなエラーが出たので,plt.close()を付けたのですが,本来19点の赤と青の散布図になるはずが,取得した画像は![イメージ説明](c4357d8e5ae483cc3859fa7b5e1970e7.png) のように一点しか打たれていない画像です. うまく画像が取得できる方法を教えていただきたいです. データの取得はうまくいっているので,グラフの出力がうまくいっていない状態です. 最終結果です. ![イメージ説明](645dbf8082607a89fbc1d3253c05c0e3.png)

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/06/03 05:36 編集

DNAが「NA」のままで直っていませんよ。
kaeruuuun

2021/06/03 06:16

何度も申し訳ございません.直しました.直しても同じ結果でした.
meg_

2021/06/03 06:35

> このようなエラーが出たので,plt.close()を付けたのですが エラーではなくWarningです。plt.close()を無くすとグラフは変わりますか?
jbpb0

2021/06/03 06:43 編集

for n in range(5000,100000,5000): のループの中で、毎回同じx, y1, y2に値を上書き代入していて、その組み合わせ(xとy1, xとy2)でループの毎回でグラフを作っているので、その時点の組み合わせの二つの点だけがグラフに書かれます ループが回って19回上記が起きて、19回それぞれでグラフの点の位置は違うと思いますが、その時のそれぞれの二つの点だけがグラフに書かれます そして、毎回同じ「figure.png」というファイルにグラフを保存しているので、ループの毎回ファイルが上書き保存されるので、ループの最後の条件のグラフの画像だけ残ります
jbpb0

2021/06/03 06:43

一つのグラフに19個の点を書くには、for n...のループの中で計算しているx, y1, y2が全部残るようにしないといけません (リストか配列にするとかして) そして、 fig=plt.figure() 以降は、インデントを戻して、for n...のループの外に出します ループが全部終わって、x, y1, y2のそれぞれに19個のデータが格納されてる状態で、1回だけグラフを作ります
kaeruuuun

2021/06/03 07:26

コメントありがとうございます. >一つのグラフに19個の点を書くには、for n...のループの中で計算しているx, y1, y2が全部残るようにしないといけません (リストか配列にするとかして) 配列はy1[n] = lap1_time[n]ように定義したらエラーが表示されたのですが,ダメですか? plt.figure() plt.plot(x, y1/10, marker="o", color = "red", linestyle = "--",label = "makeSuffixArrayByInducedSorting") plt.plot(x, y2/10, marker="v", color = "blue", linestyle = ":",label = "naivelyBuildSA"); だとうまく19点が表示されたグラフが画面上に表示されるのですが,凡例やpngとして出力となるとできないといったことで今はaxにして見ています.
kaeruuuun

2021/06/03 07:31

あとは y1 = [] y2 = [] をy1=lap1_timeの上に定義して見ましたがうまくいきませんでした.
kaeruuuun

2021/06/03 07:40

y1 = lap1_time y2 = lap2_time result1 = [] result2 = [] result1.append(y1) result2.append(y2) このような形にして x = n fig=plt.figure() fig, ax = plt.subplots(figsize=(4.5, 3.8)) ax.plot(x, result1/10, marker="o", color = "red", linestyle = "--",label = "makeSuffixArrayByInducedSorting") ax.plot(x, result2/10, marker="v", color = "blue", linestyle = ":",label = "naivelyBuildSA"); ax.legend() plt.savefig('figure.png') plt.close() あとはそのままして見たのですが, unsupported operand type(s) for /: 'list' and 'int' このようなエラーが ax.plotで出ています.
jbpb0

2021/06/03 08:11 編集

for n in range(5000,100000,5000): より上に下記を追加 y1 = [] y2 = [] x = [] 下記はfor n in...ループ内 y1 = lap1_time y2 = lap2_time result1.append(y1) result2.append(y2) x = n ↓ 変更 y1.append(ave1) y2.append(ave2) x.append(n) 下記はfor n in...ループの外(終わった後) ax.plot(x, result1/10,... ax.plot(x, result2/10,... ↓ 変更 ax.plot(x, y1,... ax.plot(x, y2,... でいけるかな?? 動作未確認ですが
kaeruuuun

2021/06/03 08:16

import time import matplotlib.pyplot as plt import math import numpy as np import matplotlib DNA ='ACGT' s = '' N=10 myBytes = {} st0_time = time.time() y1 =[] y2 =[] x = [] for n in range(5000,20000,5000): myBytes[n] = (s.join([random.choice(DNA) for i in range(n)])).encode() lap1_time =0 lap2_time =0 for j in range(N): st1_time = time.time() xR = makeSuffixArrayByInducedSorting(myBytes[n],256,0,False) et1_time = time.time() lap1_time = et1_time-st1_time +lap1_time st2_time = time.time() nR = naivelyBuildSA(myBytes[n]) et2_time = time.time() lap2_time= et2_time-st2_time + lap2_time ave1=lap1_time/N ave2=lap2_time/N print("processing time:{} {} {}".format(ave1,ave2, xR==nR)) y1.append(lap1_time/N) y2.append(lap2_time/N) x.append(n) fig=plt.figure() fig, ax = plt.subplots(figsize=(4.5, 3.8)) ax.plot(x,y1/10, marker="o", color = "red", linestyle = "--",label = "makeSuffixArrayByInducedSorting") ax.plot(x, y2/10, marker="v", color = "blue", linestyle = ":",label = "naivelyBuildSA"); ax.legend() plt.savefig('figure.png') plt.close() 今全体としてこのようなプログラムです. x.appendまではfor n in ループ内 fig=からはループの外にしています.
kaeruuuun

2021/06/03 08:19 編集

ax.plot(x,y1/10)と÷10をしてしまっているので,やり直してみます. 20000点までだとできました.100000点に増やしてみます.
jbpb0

2021/06/03 08:19

ax.plot()で、y1, y2を10で割る必要は無いです y1, y2にlap1_time, lap2_timeを追加(append)する時にN(=10)で割ってるからです
kaeruuuun

2021/06/03 08:24

そうですよね.私の確認ミスでした. ただいま計算中です.多分うまくいっていると思います. 追記 うまくいきました!ありがとうございます.
kaeruuuun

2021/06/03 08:27

これに近似曲線を引こうとしたら結構面倒ですか?
kaeruuuun

2021/06/03 09:52

ありがとうございます.今回は難しそうなので,やめておきます. もしよければ,以前のコメントを回答に書いていただけますでしょうか. お手数ですが,よろしくお願いいたします.
guest

回答1

0

ベストアンサー

質問のコードでは、for n...のループの中で、毎回同じ変数x, y1, y2に値を上書き代入していて、その組み合わせ(xとy1, xとy2)でループの毎回でグラフを作っているので、その時点の組み合わせの二つの点だけがグラフに書かれます

一つのグラフに19個の点を書くには、for n...のループの各回で計算しているx, y1, y2が全部残るようにしないといけません (変数ではなく、リストか配列にするとかして)

そして、コードの最後のグラフを作るところ(fig=...以降)は、インデントを戻して、for n...のループの外に出します
ループが全部終わって、x, y1, y2のそれぞれに19個のデータが格納されてる状態で、1回だけグラフを作ります

投稿2021/06/06 10:13

jbpb0

総合スコア7653

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

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

kaeruuuun

2021/06/06 23:14

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問