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

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

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

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

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

Q&A

解決済

1回答

11635閲覧

matplotlibのsubplotにおけるxlimの軸指定方法

color_8

総合スコア20

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

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

0グッド

0クリップ

投稿2020/12/15 13:41

pythonでスパース主成分分析を行っている際に、
matplotlibのsubplotで、それぞれのグラフごとにxlim指定をしたいのですが、
うまく反映されません。

分析に使っているデータは、scikit-learnから提供されているデータセットのwineです。

python

1import matplotlib.pyplot as plt 2from sklearn.datasets import load_wine 3from sklearn.preprocessing import StandardScaler 4from sklearn.decomposition import PCA, SparsePCA 5 6# ワインのデータをインポート 7wine = load_wine() 8 9def biplot(X_2d, components, target, ax): 10 r1 = 5 11 r2 = 1.01 12 for i, coef in enumerate(components.T): 13 ax.arrow(0, 0, coef[0]*r1, coef[1]*r1, color='r') 14 ax.text(coef[0]*r1*r2, coef[1]*r1*r2, i, color='b', fontsize=8) 15 16 ax.scatter(X_2d[:,0], X_2d[:,1], c=target, cmap="rainbow") 17 18def main(): 19 wine = load_wine() 20 ss = StandardScaler() 21 X = ss.fit_transform(wine.data) 22 23 pca = PCA(n_components=2) 24 spca = SparsePCA(n_components=2, 25 max_iter=3000, 26 n_jobs=-1, 27 normalize_components=True) 28 29 fig, axes = plt.subplots(figsize=(12, 6), nrows=1, ncols=3) 30 plt.xlim(-3, 3) 31 32 X_2d = pca.fit_transform(X) 33 biplot(X_2d, pca.components_, wine.target, axes[0]) 34 axes[0].set_title("PCA") 35 36 for i,alpha in zip([1, 2], [0.5, 5]): 37 spca.set_params(alpha=alpha) 38 X_2d = spca.fit_transform(X) 39 biplot(X_2d, spca.components_, wine.target, axes[i]) 40 axes[i].set_title("SPCA alpha={:.2f}".format(alpha)) 41 # plt.savefig("result.png") 42 43 # 図と突き合わせて確認するために特徴量の名前を出力しておく 44 for i, name in enumerate(wine.feature_names): 45 print(i, name) 46 47if __name__ == "__main__": 48 main()

上記のコードの、ローカル関数(main)の中で、以下の通り、X軸を-3から3に指定しています。

python

1plt.xlim(-3, 3)

しかしこの結果、出力されたグラフは
subplotの一番右のグラフにしか、このX軸指定が反映されていません。
イメージ説明

これを、それぞれのグラフごとに個別に軸指定するコードの挿入方法をご教示いただけませんでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

xlim の指定は Axes ごとに独立しています。
pyplot.xlim() の代わりに Axes.set_xlim() でそれぞれ設定しましょう。

matplotlib.axes.Axes.set_xlim — Matplotlib 3.1.2 documentation

python

1import matplotlib.pyplot as plt 2from sklearn.datasets import load_wine 3from sklearn.preprocessing import StandardScaler 4from sklearn.decomposition import PCA, SparsePCA 5 6# ワインのデータをインポート 7wine = load_wine() 8 9 10def biplot(X_2d, components, target, ax): 11 r1 = 5 12 r2 = 1.01 13 for i, coef in enumerate(components.T): 14 ax.arrow(0, 0, coef[0] * r1, coef[1] * r1, color="r") 15 ax.text(coef[0] * r1 * r2, coef[1] * r1 * r2, i, color="b", fontsize=8) 16 17 ax.scatter(X_2d[:, 0], X_2d[:, 1], c=target, cmap="rainbow") 18 19 20def main(): 21 wine = load_wine() 22 ss = StandardScaler() 23 X = ss.fit_transform(wine.data) 24 25 pca = PCA(n_components=2) 26 spca = SparsePCA( 27 n_components=2, max_iter=3000, n_jobs=-1, normalize_components=True 28 ) 29 30 fig, axes = plt.subplots(figsize=(12, 6), nrows=1, ncols=3) 31 32 X_2d = pca.fit_transform(X) 33 biplot(X_2d, pca.components_, wine.target, axes[0]) 34 axes[0].set_title("PCA") 35 36 for i, alpha in zip([1, 2], [0.5, 5]): 37 spca.set_params(alpha=alpha) 38 X_2d = spca.fit_transform(X) 39 biplot(X_2d, spca.components_, wine.target, axes[i]) 40 axes[i].set_title("SPCA alpha={:.2f}".format(alpha)) 41 axes[i].set_xlim(-3, 3) 42 # plt.savefig("result.png") 43 44 # 図と突き合わせて確認するために特徴量の名前を出力しておく 45 for i, name in enumerate(wine.feature_names): 46 print(i, name) 47 48 49if __name__ == "__main__": 50 main()

投稿2020/12/15 14:57

tiitoi

総合スコア21956

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

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

color_8

2020/12/15 15:43

tiitoiさん 有り難うございます! コードと出力を確認できました。 大変助かりました。 今後ともよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問