『Python数値計算ノート』ではアフィリエイトプログラムを利用して商品を紹介しています。

Pythonで猫の絵を描いてみました

私はにゃんこ()が好きです。自分でもアメショーを飼っていたし、道端で歩いている猫を見ていても、つい触りたくなります。ある夜、買い物途中で野良の子猫を触ろうとしたら、母猫にすごく怒られたことがあります。そんなわけで(どんなわけで?)、Python の色々なモジュールを使って、シンプルな猫のイラストを描いてみました。

Pythonで猫の顔を描きます

まず最初は組み込みモジュールの「タートルグラフィックス」を使って猫のイラストを描くコードです。

# Python draw cat

# In[1]

import turtle

def draw_cat():
    screen = turtle.Screen()
    screen.bgcolor("white")
    
    cat = turtle.Turtle()
    cat.speed(3)
    
    # Draw the head(にゃんこの頭)
    cat.penup()
    cat.goto(0, -50)
    cat.pendown()
    cat.circle(50)
    
    # Draw the left ear(にゃんこの左耳)
    cat.penup()
    cat.goto(-30, 10)
    cat.pendown()
    cat.goto(-60, 80)
    cat.goto(-20, 60)
    cat.goto(-30, 10)
    
    # Draw the right ear(にゃんこの右耳)
    cat.penup()
    cat.goto(30, 10)
    cat.pendown()
    cat.goto(60, 80)
    cat.goto(20, 60)
    cat.goto(30, 10)
    
    # Draw the eyes(にゃんこの目)
    cat.penup()
    cat.goto(-20, 20)
    cat.pendown()
    cat.circle(10)
    
    cat.penup()
    cat.goto(20, 20)
    cat.pendown()
    cat.circle(10)
    
    # Draw the nose(にゃんこの鼻)
    cat.penup()
    cat.goto(0, 10)
    cat.pendown()
    cat.circle(5)
    
    # Draw the mouth(にゃんこの口)
    cat.penup()
    cat.goto(-5, 5)
    cat.pendown()
    cat.goto(0, 0)
    cat.goto(5, 5)
    
    # Draw the whiskers(にゃんこのヒゲ)
    cat.penup()
    cat.goto(-30, 5)
    cat.pendown()
    cat.goto(-70, 5)
    
    cat.penup()
    cat.goto(-30, 0)
    cat.pendown()
    cat.goto(-70, -10)
    
    cat.penup()
    cat.goto(-30, -5)
    cat.pendown()
    cat.goto(-70, -20)
    
    cat.penup()
    cat.goto(30, 5)
    cat.pendown()
    cat.goto(70, 5)
    
    cat.penup()
    cat.goto(30, 0)
    cat.pendown()
    cat.goto(70, -10)
    
    cat.penup()
    cat.goto(30, -5)
    cat.pendown()
    cat.goto(70, -20)
    
    # Hide the turtle
    cat.hideturtle()
    
    # Keep the window open
    screen.mainloop()

# Call the function to draw the cat
draw_cat()

Pythonで猫のイラストを描くコードを実行すると、亀がぐるぐる回って猫の顔を一生懸命描いてくれます。次は matplotlib.pyplot と matplotlib.patches モジュールを使って猫の絵を描いてみます。

# In[2]

import matplotlib.pyplot as plt
import matplotlib.patches as patches

def draw_cat():
    fig, ax = plt.subplots()

    # Draw the head
    head = patches.Circle((0.5, 0.5), 0.3, edgecolor='black', facecolor='none', lw=2)
    ax.add_patch(head)
    
    # Draw the left ear
    left_ear = patches.Polygon([[0.3, 0.7], [0.2, 0.9], [0.4, 0.8]], closed=True, edgecolor='black', facecolor='none', lw=2)
    ax.add_patch(left_ear)
    
    # Draw the right ear
    right_ear = patches.Polygon([[0.7, 0.7], [0.8, 0.9], [0.6, 0.8]], closed=True, edgecolor='black', facecolor='none', lw=2)
    ax.add_patch(right_ear)
    
    # Draw the eyes
    left_eye = patches.Circle((0.4, 0.55), 0.05, edgecolor='black', facecolor='none', lw=2)
    ax.add_patch(left_eye)
    
    right_eye = patches.Circle((0.6, 0.55), 0.05, edgecolor='black', facecolor='none', lw=2)
    ax.add_patch(right_eye)
    
    # Draw the nose
    nose = patches.Polygon([[0.48, 0.5], [0.52, 0.5], [0.5, 0.45]], closed=True, edgecolor='black', facecolor='none', lw=2)
    ax.add_patch(nose)
    
    # Draw the mouth
    mouth_left = patches.Arc((0.49, 0.43), 0.04, 0.04, angle=0, theta1=0, theta2=180, edgecolor='black', lw=2)
    ax.add_patch(mouth_left)
    
    mouth_right = patches.Arc((0.51, 0.43), 0.04, 0.04, angle=0, theta1=0, theta2=180, edgecolor='black', lw=2)
    ax.add_patch(mouth_right)
    
    # Draw the whiskers
    ax.plot([0.3, 0.1], [0.5, 0.5], 'k-', lw=2)
    ax.plot([0.3, 0.1], [0.48, 0.46], 'k-', lw=2)
    ax.plot([0.3, 0.1], [0.52, 0.54], 'k-', lw=2)
    
    ax.plot([0.7, 0.9], [0.5, 0.5], 'k-', lw=2)
    ax.plot([0.7, 0.9], [0.48, 0.46], 'k-', lw=2)
    ax.plot([0.7, 0.9], [0.52, 0.54], 'k-', lw=2)
    
    # Set limits and aspect ratio
    ax.set_xlim(0, 1)
    ax.set_ylim(0, 1)
    ax.set_aspect('equal')
    
    # Hide axes
    ax.axis('off')
    
    plt.show()

# Call the function to draw the cat
draw_cat()

どんなかわいい「にゃんこ」が描かれるかは、実行してのお楽しみです。ぜひ試してみてください。お次は svgwrite を使って猫の絵を描くコードです。svgwrite は SVG ファイルを扱うライブラリです。組み込みではないので、別途にインストールしておく必要があります。

# In[3]

import svgwrite

def draw_cat_with_svgwrite():
    dwg = svgwrite.Drawing('cat.svg', profile='tiny')
    
    # Draw the head
    dwg.add(dwg.circle(center=(200, 200), r=100, stroke='black', fill='none', stroke_width=3))
    
    # Draw the left ear
    dwg.add(dwg.polygon(points=[(160, 100), (100, 30), (180, 80)], stroke='black', fill='none', stroke_width=3))
    
    # Draw the right ear
    dwg.add(dwg.polygon(points=[(240, 100), (300, 30), (220, 80)], stroke='black', fill='none', stroke_width=3))
    
    # Draw the eyes
    dwg.add(dwg.circle(center=(170, 180), r=15, stroke='black', fill='none', stroke_width=3))
    dwg.add(dwg.circle(center=(230, 180), r=15, stroke='black', fill='none', stroke_width=3))
    
    # Draw the nose
    dwg.add(dwg.polygon(points=[(195, 210), (205, 210), (200, 220)], stroke='black', fill='none', stroke_width=3))
    
    # Draw the mouth
    dwg.add(dwg.path(d="M190,220 Q200,230 210,220", stroke='black', fill='none', stroke_width=3))
    
    # Draw the whiskers
    dwg.add(dwg.line(start=(130, 200), end=(70, 200), stroke='black', stroke_width=3))
    dwg.add(dwg.line(start=(130, 210), end=(70, 220), stroke='black', stroke_width=3))
    dwg.add(dwg.line(start=(130, 190), end=(70, 180), stroke='black', stroke_width=3))
    
    dwg.add(dwg.line(start=(270, 200), end=(330, 200), stroke='black', stroke_width=3))
    dwg.add(dwg.line(start=(270, 210), end=(330, 220), stroke='black', stroke_width=3))
    dwg.add(dwg.line(start=(270, 190), end=(330, 180), stroke='black', stroke_width=3))
    
    # Save the drawing
    dwg.save()

# Call the function to draw the cat
draw_cat_with_svgwrite()

これも、どんなイラストが描かれるかは、実行してのお楽しみです。イラストはSVGファイルとして保存されます。実行結果を見て「下手」とか「センスない」とか、そういう類の文句は受け付けませんので、予めご了承ください。猫のアニメーションを作成してみようかとも思いましたが、難しそうなのでやめました(←向上心の皆無なエンジニア)。

コメント