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

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

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

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

Q&A

1回答

414閲覧

for文を使ってグラフを順番に表示させたい

yesman-0303

総合スコア3

Python

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

0グッド

0クリップ

投稿2022/11/18 15:37

前提

for文を使って、正規分布、t分布(自由度3)、t分布(自由度10)のグラフを順番に表したいです。
今は一つ一つのコードを書いて表示させています。
二重For文を使えば良いのでしょうか?

実現したいこと

  • グラフを順番に表示させる
  • グラフによってy軸の範囲も違うのでグラフによって範囲を変えたい

発生している問題・エラーメッセージ

エラーメッセージ

python

from scipy.stats import norm, skew, kurtosis, chi2, uniform, t import numpy as np import matplotlib.pyplot as plt n = [10, 20, 30, 50, 100, 300, 500]#樣本數 N = 10000#實驗次數 alfa = 0.05 def My_JB(X): n = X.shape[0] G1 = np.sqrt(n / 6) * skew(X) G2 = np.sqrt(n / 24) * (kurtosis(X)) JB = G1 **2 + G2 **2 p_val = 1-chi2.cdf(JB,df=2) return JB, p_val power = np.zeros(len(n)) for i in range(len(n)): X = norm.rvs(loc = 0, scale =1, size=(n[i],N)) JB_stat, p_val = My_JB(X) power[i] = (p_val <= alfa).mean() print("Power={}" .format(power)) figure, ax= plt.subplots(1) plt.plot(np.arange(len(n)), power, marker = 's') ax.set_xticks(np.arange(len(n))) ax.set_xticklabels(n) ax.set_xlabel('Sample size'), ax.set_ylabel('Power') ax.set_title('The range of $x$ is not appropriate') plt.grid(True) plt.ylim([0.00,0.07]) plt.show() for i in range(len(n)): X = t.rvs(df = 3 ,size=(n[i],N)) JB_stat, p_val = My_JB(X) power[i] = (p_val <= alfa).mean() print("Power={}" .format(power)) figure, ax= plt.subplots(1) plt.plot(np.arange(len(n)), power, marker = 's') ax.set_xticks(np.arange(len(n))) ax.set_xticklabels(n) ax.set_xlabel('X'), ax.set_ylabel('f(x)') ax.set_title('The range of $x$ is not appropriate') plt.grid(True) plt.ylim([0.00,1.10]) plt.show() for i in range(len(n)): X = t.rvs(df = 10 ,size=(n[i],N)) JB_stat, p_val = My_JB(X) power[i] = (p_val <= alfa).mean() print("Power={}" .format(power)) figure, ax= plt.subplots(1) plt.plot(np.arange(len(n)), power, marker = 's') ax.set_xticks(np.arange(len(n))) ax.set_xticklabels(n) ax.set_xlabel('X'), ax.set_ylabel('f(x)') ax.set_title('The range of $x$ is not appropriate') plt.grid(True) plt.ylim([0.00,1.10]) plt.show()

試したこと

二重for文を使って試したがうまくいかなかった

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

TakaiY

2022/11/18 15:47

for文を使いたいということですが、目的は何ですか? 3かたまりの似たようなコードが3箇所にあるからでしょうか?
yesman-0303

2022/11/18 16:27

そうです。このコードだとpythonを生かしきれてない気がして…
guest

回答1

0

おなじような処理が複数表われた場合、その部分を関数化することを考えるといいでしょう。

以下の形がが3回でてきますから、この部分を関数にして、あとから3回呼ぶのがすっきりしますね。
ただ、まったく同じではありませんから、その部分を変数にするなどして、関数の引数にして渡すのがいいと思います。

python

1power = np.zeros(len(n)) 2for i in range(len(n)): 3 X = norm.rvs(loc = 0, scale =1, size=(n[i],N)) 4 JB_stat, p_val = My_JB(X) 5 power[i] = (p_val <= alfa).mean() 6print("Power={}" .format(power)) 7figure, ax= plt.subplots(1) 8plt.plot(np.arange(len(n)), power, marker = 's') 9ax.set_xticks(np.arange(len(n))) 10ax.set_xticklabels(n) 11ax.set_xlabel('Sample size'), ax.set_ylabel('Power') 12ax.set_title('The range of $x$ is not appropriate') 13plt.grid(True) 14plt.ylim([0.00,0.07]) 15plt.show()

投稿2022/11/18 16:50

TakaiY

総合スコア12765

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問