Pynote

Python、機械学習、画像処理について

matplotlib - bar3d() で3次元棒グラフを作成する。

概要

matplotlib の bar3d() で3次元棒グラフを作成する方法を紹介する。

基本的な使い方

bar3d(x, y, z, dx, dy, dz, color=None, zsort='average', *args, **kwargs)¶
  • x: 棒の始点の x 座標
  • y: 棒の始点の y 座標
  • z: 棒の始点の z 座標
  • dx: 棒の x 方向の長さ
  • dy: 棒の y 方向の長さ
  • dz: 棒の z 方向の長さ
  • color: 色

X, Y, Z は棒の始点の座標を1次元配列またはスカラーで指定する。
dx, dy, dz は棒の各軸方向の長さを1次元配列またはスカラーで指定する。

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure(figsize=(7, 7))
ax = fig.add_subplot(111, projection='3d')

# 棒の位置
X, Y = np.mgrid[0:4, 0:4]
X, Y = x.ravel(), y.ravel()  # 1次元配列にする必要がある。
# 棒の寸法 xy 方向の長さは1で z 方向の長さはそれぞれ異なる値を指定する。
dx, dy, dz = 1, 1, X + Y

ax.bar3d(X, Y, 0, dx, dy, dz)
plt.show()


色の指定

color='色' の場合、すべての棒を同じ色で塗る。

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure(figsize=(7, 7))
ax = fig.add_subplot(111, projection='3d')
# 棒の位置
X, Y = np.mgrid[0:4, 0:4]
X, Y = x.ravel(), y.ravel()
# 棒の寸法
dx, dy, dz = 1, 1, X + Y
# 棒の色
np.random.seed(42)
color = 'green'

ax.bar3d(X, Y, 0, dx, dy, dz, color)
plt.show()

color が棒の数の長さの配列の場合、各棒を指定した色で塗る。

color=['棒1の色', '棒2の色', ..., '棒nの色']
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure(figsize=(7, 7))
ax = fig.add_subplot(111, projection='3d')
# 棒の位置
X, Y = np.mgrid[0:4, 0:4]
X, Y = x.ravel(), y.ravel()
# 棒の寸法
dx, dy, dz = 1, 1, X + Y
# 棒の色
np.random.seed(42)
color = np.random.rand(len(X), 3)

ax.bar3d(X, Y, 0, dx, dy, dz, color)
plt.show()

color が棒の数 x 6 の長さの配列の場合、各棒の各面を指定した色で塗る。

color=['棒1の面1の色', '棒1の面2の色', '棒1の面3の色',
       '棒1の面4の色', '棒1の面5の色', '棒1の面6の色',
       '棒2の面1の色', '棒2の面2の色', '棒2の面3の色',
       '棒2の面4の色', '棒2の面5の色', '棒2の面6の色',
       ...
       '棒nの面1の色', '棒nの面2の色', '棒nの面3の色',
       '棒nの面4の色', '棒nの面5の色', '棒nの面6の色']
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure(figsize=(7, 7))
ax = fig.add_subplot(111, projection='3d')
# 棒の位置
X, Y = np.mgrid[0:4, 0:4]
X, Y = x.ravel(), y.ravel()
# 棒の寸法
dx, dy, dz = 1, 1, X + Y
# 棒の色
np.random.seed(42)
color = np.random.rand(6 * len(X), 3)

ax.bar3d(X, Y, 0, dx, dy, dz, color)
plt.show()


キーワード引数で指定できる値

キーワード引数は Poly3DCollection に渡される。

枠線の色

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure(figsize=(7, 7))
ax = fig.add_subplot(111, projection='3d')
X, Y = np.mgrid[0:4, 0:4]
X, Y = x.ravel(), y.ravel()  # 棒の位置

ax.bar3d(X, Y, 0, dx=1, dy=1, dz=X + Y, edgecolor='black')
plt.show()


枠線の太さ

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure(figsize=(7, 7))
ax = fig.add_subplot(111, projection='3d')
X, Y = np.mgrid[0:4, 0:4]
X, Y = x.ravel(), y.ravel()  # 棒の位置

ax.bar3d(X, Y, 0, dx=1, dy=1, dz=X + Y, edgecolor='black', linewidth=3)
plt.show()


枠線の種類

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure(figsize=(7, 7))
ax = fig.add_subplot(111, projection='3d')
X, Y = np.mgrid[0:4, 0:4]
X, Y = x.ravel(), y.ravel()  # 棒の位置

ax.bar3d(X, Y, 0, dx=1, dy=1, dz=X + Y, edgecolor='black', linestyle='--')
plt.show()


透過度

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure(figsize=(7, 7))
ax = fig.add_subplot(111, projection='3d')
X, Y = np.mgrid[0:4, 0:4]
X, Y = x.ravel(), y.ravel()  # 棒の位置

ax.bar3d(X, Y, 0, dx=1, dy=1, dz=X + Y, alpha=0.5)
plt.show()