[Python] matplotlibでC曲線を描画する方法
C曲線はフラクタルの一種で、再帰的に直角に折れ曲がる線を描画します。
Pythonのmatplotlibを使用してC曲線を描画するには、再帰関数を定義し、各再帰ステップで線分を回転・縮小して描画します。
基本的な手順として、初期の直線を描き、再帰的にその線を2つの短い線に分割し、90度回転させて描画します。
matplotlibのplot関数
を使って各ステップの線分を描画し、show関数
で結果を表示します。
C曲線とは何か
C曲線は、フラクタル幾何学の一種で、自己相似性を持つ図形です。
最初は単純な形状から始まり、再帰的に複雑な形状へと変化していきます。
C曲線は、特にコンピュータサイエンスや数学の分野で、再帰的なアルゴリズムやデータ構造の理解を深めるために利用されます。
C曲線は、特定の規則に従って線分を繰り返し描画することで生成され、視覚的に美しいパターンを形成します。
この特性から、アートやデザインの分野でも注目されています。
matplotlibの基本的な使い方
matplotlibとは
matplotlibは、Pythonでデータを可視化するための強力なライブラリです。
2Dおよび3Dのグラフや図を簡単に作成でき、科学技術計算やデータ分析の分野で広く使用されています。
特に、データのトレンドやパターンを視覚的に表現するのに適しています。
matplotlibは、柔軟性が高く、さまざまなスタイルやフォーマットでグラフをカスタマイズできる点が特徴です。
matplotlibのインストール方法
matplotlibは、Pythonのパッケージ管理ツールであるpipを使用して簡単にインストールできます。
以下のコマンドを実行することでインストールが可能です。
pip install matplotlib
基本的な描画の流れ
matplotlibを使用してグラフを描画する基本的な流れは以下の通りです。
ステップ | 説明 |
---|---|
1 | 必要なライブラリをインポートする |
2 | データを準備する |
3 | グラフを作成する |
4 | グラフを表示する |
plot関数の使い方
plot関数
は、matplotlibで最も基本的な描画関数です。
x軸とy軸のデータを指定することで、折れ線グラフを描画します。
以下は、plot関数
の基本的な使用例です。
import matplotlib.pyplot as plt
# データの準備
x = [1, 2, 3, 4, 5]
y = [2, 3, 5, 7, 11]
# 折れ線グラフの描画
plt.plot(x, y)
plt.title("サンプルグラフ")
plt.xlabel("x軸")
plt.ylabel("y軸")
show関数で描画を表示する
show関数
は、作成したグラフを画面に表示するための関数です。
plot関数
でグラフを描画した後にshow関数
を呼び出すことで、実際にグラフを確認できます。
以下のように使用します。
# グラフを表示する
plt.show()
このように、matplotlibを使うことで簡単にデータを可視化することができます。
C曲線を描画するための準備
再帰関数の基本
再帰関数は、関数が自分自身を呼び出すことで問題を解決する手法です。
C曲線のようなフラクタル図形を生成する際に非常に有効です。
再帰関数は、基本ケース(終了条件)と再帰ケース(自己呼び出し)を持つ必要があります。
基本ケースが満たされると、再帰が終了し、結果が返されます。
以下は、再帰関数の基本的な構造の例です。
def recursive_function(n):
if n == 0: # 基本ケース
return
else: # 再帰ケース
recursive_function(n - 1)
C曲線の再帰的な生成方法
C曲線は、再帰的に線分を描画することで生成されます。
基本的なアイデアは、線分を4つの部分に分割し、それぞれを回転させて新しい線分を作成することです。
再帰的にこのプロセスを繰り返すことで、複雑な形状が形成されます。
以下は、C曲線を生成するための再帰関数の例です。
def draw_C_curve(ax, start, end, depth):
if depth == 0:
ax.plot([start[0], end[0]], [start[1], end[1]], color='black')
else:
# 中点を計算
mid = [(start[0] + end[0]) / 2, (start[1] + end[1]) / 2]
# 新しい点を計算
new_point = [mid[0] - (end[1] - start[1]) / 4, mid[1] + (end[0] - start[0]) / 4]
# 再帰的に描画
draw_C_curve(ax, start, new_point, depth - 1)
draw_C_curve(ax, new_point, end, depth - 1)
座標系の設定
C曲線を描画する際には、座標系を適切に設定することが重要です。
matplotlibでは、axis関数
を使用して描画範囲を指定できます。
C曲線は通常、正方形の範囲内に収まるように描画されるため、x軸とy軸の範囲を同じに設定することが推奨されます。
以下は、座標系の設定の例です。
import matplotlib.pyplot as plt
# 座標系の設定
plt.axis('equal') # x軸とy軸のスケールを同じにする
plt.xlim(-1, 1) # x軸の範囲
plt.ylim(-1, 1) # y軸の範囲
線分の回転と縮小の考え方
C曲線を描画する際には、線分を回転させたり縮小したりする必要があります。
具体的には、線分の中点を基準にして、特定の角度で回転させることで新しい線分を生成します。
また、線分の長さを縮小することで、再帰的に描画する際の形状を調整します。
回転行列を使用して、点の座標を変換することができます。
以下は、回転を行うための関数の例です。
import math
def rotate_point(point, angle):
x, y = point
rad = math.radians(angle) # 角度をラジアンに変換
new_x = x * math.cos(rad) - y * math.sin(rad)
new_y = x * math.sin(rad) + y * math.cos(rad)
return [new_x, new_y]
このように、C曲線を描画するための準備として、再帰関数の理解や座標系の設定、線分の回転と縮小の考え方が重要です。
これらの要素を組み合わせることで、C曲線を効果的に描画することができます。
C曲線を描画するPythonコード
C曲線の再帰関数の実装
C曲線を描画するための再帰関数は、線分を描画するための基本的なロジックを持っています。
以下のコードは、C曲線を生成するための再帰関数の実装例です。
def draw_C_curve(ax, start, end, depth):
if depth == 0:
ax.plot([start[0], end[0]], [start[1], end[1]], color='black')
else:
# 中点を計算
mid = [(start[0] + end[0]) / 2, (start[1] + end[1]) / 2]
# 新しい点を計算
new_point = [mid[0] - (end[1] - start[1]) / 4, mid[1] + (end[0] - start[0]) / 4]
# 再帰的に描画
draw_C_curve(ax, start, new_point, depth - 1)
draw_C_curve(ax, new_point, end, depth - 1)
matplotlibでの描画処理
matplotlibを使用してC曲線を描画するためには、まず図を作成し、座標系を設定した後、再帰関数を呼び出してC曲線を描画します。
以下は、matplotlibでの描画処理の例です。
import matplotlib.pyplot as plt
# C曲線を描画する関数
def plot_C_curve(depth):
fig, ax = plt.subplots()
plt.axis('equal') # x軸とy軸のスケールを同じにする
plt.xlim(-1, 1) # x軸の範囲
plt.ylim(-1, 1) # y軸の範囲
# C曲線の初期点
start = [-0.5, 0]
end = [0.5, 0]
# C曲線を描画
draw_C_curve(ax, start, end, depth)
# グラフを表示
plt.title(f"C曲線 (深さ: {depth})")
plt.show()
描画結果の確認
上記のコードを実行すると、指定した深さに応じたC曲線が描画されます。
深さが大きくなるほど、曲線はより複雑になり、自己相似性が強調されます。
例えば、深さを3に設定すると、以下のような結果が得られます。
plot_C_curve(3)
再帰の深さを調整する方法
C曲線の再帰の深さは、描画の複雑さに直接影響します。
深さを増やすことで、より詳細なフラクタルパターンが生成されますが、計算量が増加し、描画に時間がかかることがあります。
深さを調整するには、plot_C_curve関数
の引数を変更するだけです。
例えば、深さを5に設定する場合は、次のように呼び出します。
plot_C_curve(5)
完全なサンプルコード
以下は、C曲線を描画するための完全なサンプルコードです。
このコードを実行することで、C曲線を簡単に描画できます。
import matplotlib.pyplot as plt
def draw_C_curve(ax, start, end, depth):
if depth == 0:
ax.plot([start[0], end[0]], [start[1], end[1]], color='black')
else:
mid = [(start[0] + end[0]) / 2, (start[1] + end[1]) / 2]
new_point = [mid[0] - (end[1] - start[1]) / 4, mid[1] + (end[0] - start[0]) / 4]
draw_C_curve(ax, start, new_point, depth - 1)
draw_C_curve(ax, new_point, end, depth - 1)
def plot_C_curve(depth):
fig, ax = plt.subplots()
plt.axis('equal')
plt.xlim(-1, 1)
plt.ylim(-1, 1)
start = [-0.5, 0]
end = [0.5, 0]
draw_C_curve(ax, start, end, depth)
plt.title(f"C曲線 (深さ: {depth})")
plt.show()
# C曲線を描画
plot_C_curve(4) # 深さを4に設定
このコードを実行することで、C曲線を視覚的に確認することができます。

深さを変更することで、異なるパターンを楽しむことができます。
C曲線のカスタマイズ
線の色や太さを変更する
C曲線を描画する際に、線の色や太さを変更することで、視覚的な印象を大きく変えることができます。
plot関数
の引数にcolor
やlinewidth
を指定することで、これらのプロパティを調整できます。
以下は、線の色を赤、太さを2に設定する例です。
def draw_C_curve(ax, start, end, depth):
if depth == 0:
ax.plot([start[0], end[0]], [start[1], end[1]], color='red', linewidth=2) # 色と太さを指定
else:
mid = [(start[0] + end[0]) / 2, (start[1] + end[1]) / 2]
new_point = [mid[0] - (end[1] - start[1]) / 4, mid[1] + (end[0] - start[0]) / 4]
draw_C_curve(ax, start, new_point, depth - 1)
draw_C_curve(ax, new_point, end, depth - 1)
背景色を変更する
背景色を変更することで、C曲線の見栄えをさらに良くすることができます。
matplotlibでは、set_facecolorメソッド
を使用して、図の背景色を設定できます。
以下は、背景色を黒に設定する例です。
def plot_C_curve(depth):
fig, ax = plt.subplots()
ax.set_facecolor('black') # 背景色を黒に設定
plt.axis('equal')
plt.xlim(-1, 1)
plt.ylim(-1, 1)
start = [-0.5, 0]
end = [0.5, 0]
draw_C_curve(ax, start, end, depth)
plt.title(f"C曲線 (深さ: {depth})", color='white') # タイトルの色も変更
plt.show()
描画範囲を調整する
C曲線の描画範囲を調整することで、図形の見え方を変えることができます。
xlim
とylim
を使用して、表示する範囲を設定します。
以下は、描画範囲を-2から2に設定する例です。
def plot_C_curve(depth):
fig, ax = plt.subplots()
ax.set_facecolor('black')
plt.axis('equal')
plt.xlim(-2, 2) # x軸の範囲を変更
plt.ylim(-2, 2) # y軸の範囲を変更
start = [-0.5, 0]
end = [0.5, 0]
draw_C_curve(ax, start, end, depth)
plt.title(f"C曲線 (深さ: {depth})", color='white')
plt.show()
アニメーションでC曲線を描く
C曲線をアニメーションで描くことで、動的な視覚効果を楽しむことができます。
matplotlibのFuncAnimation
を使用して、再帰の深さを徐々に増やしながらC曲線を描画することができます。
以下は、アニメーションの実装例です。
from matplotlib.animation import FuncAnimation
def animate_C_curve(depth):
fig, ax = plt.subplots()
ax.set_facecolor('black')
plt.axis('equal')
plt.xlim(-1, 1)
plt.ylim(-1, 1)
start = [-0.5, 0]
end = [0.5, 0]
def update(frame):
ax.clear() # 前のフレームをクリア
ax.set_facecolor('black')
plt.axis('equal')
plt.xlim(-1, 1)
plt.ylim(-1, 1)
draw_C_curve(ax, start, end, frame) # 現在のフレームの深さで描画
plt.title(f"C曲線 (深さ: {frame})", color='white')
ani = FuncAnimation(fig, update, frames=range(depth + 1), repeat=False)
plt.show()
# アニメーションを実行
animate_C_curve(5) # 深さを5に設定
このように、C曲線のカスタマイズを行うことで、視覚的に魅力的な図形を作成することができます。
色や背景、描画範囲を調整することで、独自のスタイルを表現し、アニメーションを加えることで動的な要素を楽しむことができます。
応用例:他のフラクタル図形の描画
ヒルベルト曲線の描画
ヒルベルト曲線は、空間を埋めるフラクタルの一種で、再帰的に描画される特性を持っています。
ヒルベルト曲線は、特定のパターンに従って線を描くことで生成されます。
以下は、ヒルベルト曲線を描画するためのPythonコードの例です。
import turtle
def draw_Hilbert_curve(t, order, size, angle=90):
if order == 0:
return
t.right(angle)
draw_Hilbert_curve(t, order - 1, size, -angle)
t.forward(size)
t.left(angle)
draw_Hilbert_curve(t, order - 1, size, angle)
t.forward(size)
draw_Hilbert_curve(t, order - 1, size, angle)
t.left(angle)
t.forward(size)
draw_Hilbert_curve(t, order - 1, size, -angle)
t.right(angle)
# ヒルベルト曲線を描画する関数
def plot_Hilbert_curve(order):
screen = turtle.Screen()
screen.setup(width=600, height=600)
t = turtle.Turtle()
t.speed(0) # 最大速度
t.penup()
t.goto(-200, 200) # 初期位置を設定
t.pendown()
size = 400 / (2**order - 1) # サイズを調整
draw_Hilbert_curve(t, order, size)
screen.mainloop()
# ヒルベルト曲線を描画
plot_Hilbert_curve(4) # オーダーを4に設定

コッホ曲線の描画
コッホ曲線は、最も有名なフラクタルの一つで、三角形の辺を分割して新しい三角形を作成することで生成されます。
以下は、コッホ曲線を描画するためのPythonコードの例です。
import math
import matplotlib.pyplot as plt
import japanize_matplotlib
def draw_Koch_curve(ax, start, end, depth):
if depth == 0:
ax.plot([start[0], end[0]], [start[1], end[1]], color='black')
else:
# 中点を計算
mid1 = [(2 * start[0] + end[0]) / 3, (2 * start[1] + end[1]) / 3]
mid2 = [(start[0] + 2 * end[0]) / 3, (start[1] + 2 * end[1]) / 3]
# 頂点を計算
dx = mid2[0] - mid1[0]
dy = mid2[1] - mid1[1]
length = math.sqrt(dx**2 + dy**2)
angle = math.atan2(dy, dx) - math.pi / 3 # 60度を引く
peak = [mid1[0] + length * math.cos(angle), mid1[1] + length * math.sin(angle)]
# 再帰的に描画
draw_Koch_curve(ax, start, mid1, depth - 1)
draw_Koch_curve(ax, mid1, peak, depth - 1)
draw_Koch_curve(ax, peak, mid2, depth - 1)
draw_Koch_curve(ax, mid2, end, depth - 1)
# コッホ曲線を描画する関数
def plot_Koch_curve(depth):
fig, ax = plt.subplots()
ax.set_aspect('equal')
ax.set_xlim(-1, 1)
ax.set_ylim(-0.5, 0.5)
ax.axis('off')
start = [-1, 0]
end = [1, 0]
draw_Koch_curve(ax, start, end, depth)
plt.title(f"コッホ曲線 (深さ: {depth})")
plt.show()
# コッホ曲線を描画
plot_Koch_curve(4) # 深さを4に設定

ドラゴン曲線の描画
ドラゴン曲線は、自己相似性を持つフラクタルで、特定のルールに従って折り返しながら描画されます。
以下は、ドラゴン曲線を描画するためのPythonコードの例です。
import math
import matplotlib.pyplot as plt
import japanize_matplotlib
def draw_Dragon_curve(ax, start, end, depth, turn_right=True):
if depth == 0:
ax.plot([start[0], end[0]], [start[1], end[1]], color='black')
else:
# 中点を計算
mid = [(start[0] + end[0]) / 2, (start[1] + end[1]) / 2]
# 90度回転させた点を計算
if turn_right:
new_point = [mid[0] - (end[1] - start[1]) / 2, mid[1] + (end[0] - start[0]) / 2]
else:
new_point = [mid[0] + (end[1] - start[1]) / 2, mid[1] - (end[0] - start[0]) / 2]
# 再帰的に描画
draw_Dragon_curve(ax, start, new_point, depth - 1, True)
draw_Dragon_curve(ax, new_point, end, depth - 1, False)
# ドラゴン曲線を描画する関数
def plot_Dragon_curve(depth):
fig, ax = plt.subplots()
ax.set_aspect('equal')
ax.set_xlim(-1, 1)
ax.set_ylim(-1, 1)
ax.axis('off')
start = [-0.5, 0]
end = [0.5, 0]
draw_Dragon_curve(ax, start, end, depth)
plt.title(f"ドラゴン曲線 (深さ: {depth})")
plt.show()
# ドラゴン曲線を描画
plot_Dragon_curve(10) # 深さを10に設定

これらのフラクタル図形は、C曲線と同様に再帰的な手法を用いて描画されます。
各フラクタルには独自の特性があり、視覚的に魅力的なパターンを生成します。
これらのコードを実行することで、さまざまなフラクタル図形を楽しむことができます。
まとめ
この記事では、C曲線の描画方法やそのカスタマイズ、さらには他のフラクタル図形の描画について詳しく解説しました。
C曲線を描くための基本的な手法から、ヒルベルト曲線やコッホ曲線、ドラゴン曲線といった他のフラクタル図形の実装方法まで、幅広く取り上げています。
これを機に、Pythonを使ったフラクタル図形の描画に挑戦してみてはいかがでしょうか。
新たな視点でプログラミングを楽しむきっかけになるかもしれません。