ホームページ >バックエンド開発 >Python チュートリアル >PythonでMatplotlibを使って3Dグラフを描画する方法の紹介

PythonでMatplotlibを使って3Dグラフを描画する方法の紹介

巴扎黑
巴扎黑オリジナル
2017-09-05 11:21:414002ブラウズ

この記事では主に Python で 3D 画像を描画するための Matplotlib のサンプルコードを紹介します。興味のある方は学習してください。

Matplotlib は 2 次元の画像を描画することもできます。 -次元画像。主に mplot3d モジュールを通じて実装されます。ただし、Matplotlib を使用して 3 次元画像を描画すると、実際には 2 次元のキャンバスに表示されるため、一般に 3 次元画像を描画する場合は、pyplot モジュールも読み込む必要があります。
mplot3d モジュールには主に 4 つの主要なカテゴリが含まれています: )

  • mpl_toolkits。 mplot3d.proj3d()

  • このうち、axes3d()には主に描画を実装するための様々なクラスやメソッドが含まれています。 axis3d() には主に座標軸に関するクラスとメソッドが含まれています。 art3d() には、2D 画像を変換し、3D 描画に使用するクラスとメソッドが含まれています。 proj3d() には、3 次元ベクトルの長さの計算など、いくつかの断片化されたクラスとメソッドが含まれています。

  • 一般に、最もよく使用するのは mpl_toolkits.mplot3d.axes3d() の mpl_toolkits.mplot3d.axes3d.Axes3D() クラスで、Axes3D() の下には、さまざまなタイプの 3D グラフィックスを描画するためのメソッドがあります。 Axes3D() は次の方法でインポートできます。

  • from mpl_toolkits.mplot3d.axes3d import Axes3D または from mpl_toolkits.mplot3d import Axes3D
  • 三次元散布図

まず、データのセットをランダムに生成するために numpy をインポートします。


import numpy as np

# x, y, z 均为 0 到 1 之间的 100 个随机数
x = np.random.normal(0, 1, 100)
y = np.random.normal(0, 1, 100)
z = np.random.normal(0, 1, 100)

次に、絵を描き始めます。最初のステップは、2D および 3D 描画モジュールをロードすることです。

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
2 番目のステップは、Axes3D() を使用して 3D グラフィックス オブジェクトを作成することです。

fig = plt.figure()
ax = Axes3D(fig)

最後に、散布図描画メソッドを呼び出して描画し、表示します。

ax.scatter(x, y, z)
plt.show()

三次元折れ線グラフ

折れ線グラフは散布図に似ており、x、y、z の 3 つの座標の値を渡す必要があります。詳細なコードは以下の通りです。

# 载入模块
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

# 生成数据
x = np.linspace(-6 * np.pi, 6 * np.pi, 1000)
y = np.sin(x)
z = np.cos(x)

# 创建 3D 图形对象
fig = plt.figure()
ax = Axes3D(fig)

# 绘制线型图
ax.plot(x, y, z)

# 显示图
plt.show()


三次元棒グラフ

折れ線グラフを描画した後、引き続き三次元棒グラフを描画してみます。実際、描画手順も上記と非常に似ています。

# 载入模块
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

# 创建 3D 图形对象
fig = plt.figure()
ax = Axes3D(fig)

# 生成数据并绘图
x = [0, 1, 2, 3, 4, 5, 6]
for i in x:
  y = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  z = abs(np.random.normal(1, 10, 10))
  ax.bar(y, z, i, zdir='y', color=['r', 'g', 'b', 'y'])
plt.show()


三次元曲面グラフ

次に描画する必要がある三次元曲面グラフは、データに対して行列処理を行う必要があります。実際、もう 1 つの次元が追加されることを除けば、これは 2 次元の等高線マップを描画するのと非常に似ています。

# 载入模块
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# 创建 3D 图形对象
fig = plt.figure()
ax = Axes3D(fig)

# 生成数据
X = np.arange(-2, 2, 0.1)
Y = np.arange(-2, 2, 0.1)
X, Y = np.meshgrid(X, Y)
Z = np.sqrt(X ** 2 + Y ** 2)

# 绘制曲面图,并使用 cmap 着色
ax.plot_surface(X, Y, Z, cmap=plt.cm.winter)

plt.show()

cmap=plt.cm.Winter は、冬の配色が使用されることを意味します。これは、下の図のグラデーション色です。

混合グラフ描画

混合グラフとは、1つのグラフの中に2種類のグラフを描画することです。一般に、混合図を描くには前提条件があります。つまり、2 つの異なるタイプの図の範囲がほぼ同じであるということです。そうでないと、深刻な比例不調和が発生し、混合図が無意味になってしまいます。


# -*- coding: utf-8 -*
# 载入模块
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt

# 创建 3D 图形对象
fig = plt.figure()
ax = Axes3D(fig)

# 生成数据并绘制图 1
x1 = np.linspace(-3 * np.pi, 3 * np.pi, 500)
y1 = np.sin(x1)
ax.plot(x1, y1, zs=0, c='red')

# 生成数据并绘制图 2
x2 = np.random.normal(0, 1, 100)
y2 = np.random.normal(0, 1, 100)
z2 = np.random.normal(0, 1, 100)
ax.scatter(x2, y2, z2)

# 显示图
plt.show()

サブプロットの描画

# -*- coding: utf-8 -*
# 载入模块
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

# 创建 1 张画布
fig = plt.figure()

#===============

# 向画布添加子图 1 
ax1 = fig.add_subplot(1, 2, 1, projection='3d')

# 生成子图 1 数据
x = np.linspace(-6 * np.pi, 6 * np.pi, 1000)
y = np.sin(x)
z = np.cos(x)

# 绘制第 1 张图
ax1.plot(x, y, z)

#===============

# 向画布添加子图 2
ax2 = fig.add_subplot(1, 2, 2, projection='3d')

# 生成子图 2 数据
X = np.arange(-2, 2, 0.1)
Y = np.arange(-2, 2, 0.1)
X, Y = np.meshgrid(X, Y)
Z = np.sqrt(X ** 2 + Y ** 2)

# 绘制第 2 张图
ax2.plot_surface(X, Y, Z, cmap=plt.cm.winter)

# 显示图
plt.show()

これらのコードを見てみましょう。 2つのサブピクチャは1つのキャンバスに描画されるため、事前にキャンバスを作成する必要があります。次に、.add_subplot() を使用してサブプロットを追加します。サブプロットのシリアル番号は 2 次元描画の場合と同様です。ただし、3D 描画を実行する場合は、projection='3d' パラメーターを追加する必要があります。

以上がPythonでMatplotlibを使って3Dグラフを描画する方法の紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。