matplotlibでサーファイスプロットする

schwefel.png:

  1. surf = ax.plot_surface(x, y, z)
    • 三次元プロット
  2. fig.colorbar(surf)
    • カラーバーの表示
  • plot_surface関数のキーワード(一部)
    • cmap: カラーマップの指定 (hot, gray, coolwarm など)
    • cstride: x方向の色のプロットのステップ数(デフォルト値: 10)
    • rstride: y方向の色のプロットのステップ数(デフォルト値: 10)
  • colorbar関数のキーワード
    • shrink: カラーバーを縦の長さを何倍にするか (デフォルト値: 1.0)
    • aspect: カラーバーの横の長さ(値が大きいほど細くなる) (デフォルト値: 20)
#!/usr/bin/env python
#coding:utf-8


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


def schwefel(x, y):
    return 418.9829 * 2 - (x * np.sin(np.sqrt(abs(x))) + \
                           y * np.sin(np.sqrt(abs(y))))


def work():
    N = 100
    MIN_X = -500
    MAX_X =  500

    x = np.linspace(MIN_X, MAX_X, N)
    y = np.linspace(MIN_X, MAX_X, N)
    x, y = np.meshgrid(x, y)
    z = schwefel(x, y)
    
    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1, projection="3d")

    surf = ax.plot_surface(x, y, z, cstride=1, rstride=1, cmap=cm.coolwarm, linewidth=0, antialiased=False)
    
    fig.colorbar(surf, shrink=0.5, aspect=10)

    ax.set_title("Schwefel")

    fig.savefig("schwefel.png", bbox_inches="tight")
    

if __name__ == "__main__":
    work()