Python
 Computer >> コンピューター >  >> プログラミング >> Python

Matplotlibで1つのチャートに複数の水平棒グラフを描画する方法

Matplotlibを使えば、1つのチャート上に複数の水平棒グラフ(横棒グラフ)を簡単に重ねて描画できます。この記事では、barh() 関数と位置オフセットを活用して、複数系列のデータを1つのグラフにまとめて表示する手順を解説します。

実装の手順

  • pandas、matplotlib、numpy の各ライブラリをインポートします。

  • 図のサイズを設定し、サブプロット間および周囲の余白(パディング)を調整します。

  • 水平棒の表示位置を格納する配列を作成します。

  • 棒の幅を表す変数 width を初期化します。

  • barh() を使って水平棒グラフを作成します。2つ目の系列は位置に幅分のオフセットを加えることで、棒が重ならないように配置します。

  • Y軸の目盛りと目盛りラベルを設定し、表示範囲(ylim)も指定します。

  • 凡例をグラフの右上に配置します。

  • show() メソッドで図を表示します。

サンプルコード

import pandas
import matplotlib.pyplot as plt
import numpy as np

# 図のサイズを設定
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True

# 水平棒の表示位置を格納する配列
ind = np.array([0, 1, 2])

# 棒の幅
width = 0.4

fig, ax = plt.subplots()

# 水平棒グラフを描画(2系列)
ax.barh(ind, np.array([4, 3, 5]), width, color='orange', label='N')
ax.barh(ind + width, np.array([2, 5, 2]), width, color='blue', label='M')

# Y軸の目盛りとラベルを設定
ax.set(yticks=ind + width, yticklabels=np.array(['A', 'B', 'C']),
ylim=[2*width - 1, len(ind)])

# 凡例を右上に配置
ax.legend(loc='upper right')

# グラフを表示
plt.show()

出力結果

このコードを実行すると、以下のようなグラフが出力されます。カテゴリA・B・Cごとに、オレンジ色の「N」と青色の「M」の2つの棒が並んで表示されます。

Matplotlibで1つのチャートに複数の水平棒グラフを描画する方法

ポイントの解説

複数の水平棒を1つのチャートに描く際の重要なポイントは、位置のオフセットです。ind + width のように2つ目の系列のY座標に棒の幅を加算することで、棒同士が重なることなく隣接して配置されます。また、yticksind + width に設定することで、目盛りラベルが2本の棒の中間に来るよう調整しています。系列が3つ以上になる場合は、同様に width の倍数ずつオフセットを増やしていけば対応できます。

  1. MatplotlibでNaN値を含むデータをプロット・操作する方法を解説

    MatplotlibでNaN値をプロット・操作する手順 Matplotlibでは、NaN(欠損値)を含むデータもそのまま可視化できます。基本的な流れは以下の3ステップです。 NumPyを使って、NaN値をいくつか含むデータ(配列)を作成します。 imshow()メソッドを使用し、カラーマップとステップ1で作成したデータを指定して、2次元の正規ラスタ上に画像として表示します。デフォルトでは、NaNの部分は自動的に空白(マスクされた領域)として描画されます。 作成した図を画面に表示するには、show()メソッドを呼び出します。 コード例 import numpy as np from matp

  2. Matplotlibを使ってPythonで3D密度マップを描画する方法を徹底解説

    MatplotlibとNumPyを組み合わせると、Pythonで簡単に3D密度マップ(濃度分布図)を作成できます。本記事では、pcolormesh()メソッドを使って擬似カラープロットとして密度マップを可視化する具体的な手順を、サンプルコード付きでわかりやすく解説します。 3D密度マップを描画する基本の手順 NumPyでデータを生成する:side、x、y、zの各データをNumPyで作成します。特にlinspace関数を使うと、指定した2点間の範囲を任意の分割数で等間隔にデータ生成できるため便利です。 座標行列を作成する:sideデータをもとにmeshgrid()を使い、座標ベクトルから2次元