[解決済み] matplotlib のサブプロットにおける行と列のヘッダ
2022-11-02 02:58:19
質問
のループで生成されたサブプロットのグリッドに行と列のヘッダを追加するベストプラクティスは何ですか?
matplotlib
? いくつか思いつきますが、特にきちんとしたものではありません。
-
カラムの場合、ループにカウンタを付けると
set_title()
を使うことができます。行の場合、これはうまくいきません。あなたはtext
をプロットの外側に描く必要があります。 - 上にサブプロットの余分な行と左にサブプロットの余分な列を追加し、そのサブプロットの真ん中にテキストを描画します。
より良い代替案を提案できますか?
どのように解決するのですか?
これを行うにはいくつかの方法があります。 簡単な方法は、プロットの y-ラベルとタイトルを利用し、その上で
fig.tight_layout()
を使ってラベルのためのスペースを確保することです。 あるいは、適切な場所に追加のテキストを配置するために
annotate
で適切な位置にテキストを配置し、半手作業でスペースを確保することもできます。
軸にyラベルがない場合、軸の最初の行と列のタイトルとyラベルを悪用するのは簡単です。
import matplotlib.pyplot as plt
cols = ['Column {}'.format(col) for col in range(1, 4)]
rows = ['Row {}'.format(row) for row in ['A', 'B', 'C', 'D']]
fig, axes = plt.subplots(nrows=4, ncols=3, figsize=(12, 8))
for ax, col in zip(axes[0], cols):
ax.set_title(col)
for ax, row in zip(axes[:,0], rows):
ax.set_ylabel(row, rotation=0, size='large')
fig.tight_layout()
plt.show()
<イグ
Yラベルがある場合、またはもう少し柔軟性がある方が良い場合は
annotate
を使用してラベルを配置することができます。 これはより複雑ですが、行と列のラベルに加えて、個々のプロットタイトル、yラベル、などを持つことができます。
import matplotlib.pyplot as plt
from matplotlib.transforms import offset_copy
cols = ['Column {}'.format(col) for col in range(1, 4)]
rows = ['Row {}'.format(row) for row in ['A', 'B', 'C', 'D']]
fig, axes = plt.subplots(nrows=4, ncols=3, figsize=(12, 8))
plt.setp(axes.flat, xlabel='X-label', ylabel='Y-label')
pad = 5 # in points
for ax, col in zip(axes[0], cols):
ax.annotate(col, xy=(0.5, 1), xytext=(0, pad),
xycoords='axes fraction', textcoords='offset points',
size='large', ha='center', va='baseline')
for ax, row in zip(axes[:,0], rows):
ax.annotate(row, xy=(0, 0.5), xytext=(-ax.yaxis.labelpad - pad, 0),
xycoords=ax.yaxis.label, textcoords='offset points',
size='large', ha='right', va='center')
fig.tight_layout()
# tight_layout doesn't take these labels into account. We'll need
# to make some room. These numbers are are manually tweaked.
# You could automatically calculate them, but it's a pain.
fig.subplots_adjust(left=0.15, top=0.95)
plt.show()
関連
-
[解決済み] 関数デコレータを作成し、それらを連鎖させるには?
-
[解決済み] staticmethodとclassmethodの違いについて
-
[解決済み] Pythonのリストメソッドであるappendとextendの違いは何ですか?
-
[解決済み] 最小限の驚き」と「変更可能なデフォルトの引数
-
[解決済み] 列の値に基づいてDataFrameから行を選択するにはどうすればよいですか?
-
[解決済み] Pandasのカラム名のリネーム
-
[解決済み] Pandas DataFrameからカラムを削除する
-
[解決済み】__str__と__repr__の違いは何ですか?
-
[解決済み】Pandas DataFrameのカラムヘッダからリストを取得する。
-
[解決済み] virtualenv の `--no-site-packages` オプションを元に戻す。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Pandasのデータフレームでタプルの列を分割するにはどうしたらいいですか?
-
[解決済み] Django のテストデータベースをメモリ上だけで動作させるには?
-
[解決済み] dict を txt ファイルに書き、それを読み取る?
-
[解決済み] 小数点以下1桁を取得する[重複]。
-
[解決済み] 古いバージョンのPythonにおける辞書のキーの並び順
-
[解決済み] Pythonでマルチプロセッシングキューを使うには?
-
[解決済み] Jupyter (IPython)ノートブックのセッションをpickleして保存する方法
-
[解決済み] Python Logging でログメッセージが2回表示される件
-
[解決済み] Django で全てのリクエストヘッダを取得するにはどうすれば良いですか?
-
[解決済み] Celeryタスクのユニットテストはどのように行うのですか?