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)
DNAが「NA」のままで直っていませんよ。
何度も申し訳ございません.直しました.直しても同じ結果でした.
> このようなエラーが出たので,plt.close()を付けたのですが
エラーではなくWarningです。plt.close()を無くすとグラフは変わりますか?
for n in range(5000,100000,5000):
のループの中で、毎回同じx, y1, y2に値を上書き代入していて、その組み合わせ(xとy1, xとy2)でループの毎回でグラフを作っているので、その時点の組み合わせの二つの点だけがグラフに書かれます
ループが回って19回上記が起きて、19回それぞれでグラフの点の位置は違うと思いますが、その時のそれぞれの二つの点だけがグラフに書かれます
そして、毎回同じ「figure.png」というファイルにグラフを保存しているので、ループの毎回ファイルが上書き保存されるので、ループの最後の条件のグラフの画像だけ残ります
一つのグラフに19個の点を書くには、for n...のループの中で計算しているx, y1, y2が全部残るようにしないといけません (リストか配列にするとかして)
そして、
fig=plt.figure()
以降は、インデントを戻して、for n...のループの外に出します
ループが全部終わって、x, y1, y2のそれぞれに19個のデータが格納されてる状態で、1回だけグラフを作ります
コメントありがとうございます.
>一つのグラフに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にして見ています.
あとは
y1 = []
y2 = []
をy1=lap1_timeの上に定義して見ましたがうまくいきませんでした.
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で出ています.
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,...
でいけるかな??
動作未確認ですが
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=からはループの外にしています.
ax.plot(x,y1/10)と÷10をしてしまっているので,やり直してみます.
20000点までだとできました.100000点に増やしてみます.
ax.plot()で、y1, y2を10で割る必要は無いです
y1, y2にlap1_time, lap2_timeを追加(append)する時にN(=10)で割ってるからです
そうですよね.私の確認ミスでした.
ただいま計算中です.多分うまくいっていると思います.
追記
うまくいきました!ありがとうございます.
これに近似曲線を引こうとしたら結構面倒ですか?
どのような近似をするかによりますが、たとえば多項式なら、こんなやり方
http://dragstar.hatenablog.com/entry/2016/05/24/145543
ありがとうございます.今回は難しそうなので,やめておきます.
もしよければ,以前のコメントを回答に書いていただけますでしょうか.
お手数ですが,よろしくお願いいたします.
回答1件
あなたの回答
tips
プレビュー