import matplotlib.patches as patches
import matplotlib.pyplot as plt
import numpy as np
# Zeichenfläche erstellen
fig, ax = plt.subplots(figsize=(9, 7))
ax.set_xlim(0, 10)
ax.set_ylim(0, 8)
ax.set_aspect('equal')
ax.axis('off')
# Hintergrundfarbe (zartes Pastell-Creme/Rosa)
fig.patch.set_facecolor('#FFF7F9')
# --- DEKORATIVER HINTERGRUND ---
# Weicher Lichtschein hinter dem Paar
glow = patches.Circle((5.0, 3.6), 2.8, color='#FFE6EE', alpha=0.6, zorder=0)
ax.add_patch(glow)
# Boden-Schatten
shadow = patches.Ellipse(
(5.0, 1.35), 4.6, 0.35, color='#E8CFD6', alpha=0.7, zorder=1
)
ax.add_patch(shadow)
# Hilfsfunktion für abgerundete Gliedmaßen
def draw_limb(x1, y1, x2, y2, color, lw=10, zorder=2):
ax.plot(
[x1, x2], [y1, y2], color=color, lw=lw, solid_capstyle='round', zorder=zorder
)
# ==========================================
# --- JACKY (Links, x = 3.6) ---
# ==========================================
skin_f = '#FCD5CE'
hair_f = '#3D2314'
dress_color = '#FF5C8A'
dress_dark = '#D93866'
# Hinteres langes Haar
hair_back = patches.FancyBboxPatch(
(3.15, 3.8),
0.9,
1.3,
boxstyle='round,pad=0.1,rounding_size=0.45',
facecolor=hair_f,
edgecolor='none',
zorder=1,
)
ax.add_patch(hair_back)
# Beine & Schuhe
draw_limb(3.42, 2.5, 3.42, 1.45, skin_f, lw=8, zorder=2)
draw_limb(3.78, 2.5, 3.78, 1.45, skin_f, lw=8, zorder=2)
shoe_f1 = patches.Ellipse((3.38, 1.42), 0.32, 0.16, color=dress_dark, zorder=3)
shoe_f2 = patches.Ellipse((3.82, 1.42), 0.32, 0.16, color=dress_dark, zorder=3)
ax.add_patch(shoe_f1)
ax.add_patch(shoe_f2)
# Linker Arm (außen)
draw_limb(3.3, 4.05, 2.85, 3.15, skin_f, lw=7, zorder=2)
# Kleid (Oberteil + ausgestellter Rock)
dress_poly = np.array([
[3.32, 4.2],
[3.88, 4.2], # Schultern
[3.82, 3.55],
[4.25, 2.45], # Taille & Rock rechts
[2.95, 2.45],
[3.38, 3.55], # Rock links & Taille
])
ax.fill(
dress_poly[:, 0],
dress_poly[:, 1],
color=dress_color,
edgecolor=dress_dark,
lw=1.5,
zorder=3,
)
# Gürtel-Akzent
ax.plot([3.38, 3.82], [3.55, 3.55], color=dress_dark, lw=3, zorder=4)
# Hals & Kopf
draw_limb(3.6, 4.4, 3.6, 4.18, skin_f, lw=8, zorder=2)
head_f = patches.Circle((3.6, 4.75), 0.42, color=skin_f, zorder=4)
ax.add_patch(head_f)
# Pony / Vorderes Haar
bangs_l = patches.Wedge(
(3.6, 4.75), 0.44, 70, 195, color=hair_f, zorder=5
) # Links
bangs_r = patches.Wedge(
(3.6, 4.75), 0.44, -15, 95, color=hair_f, zorder=5
) # Rechts
ax.add_patch(bangs_l)
ax.add_patch(bangs_r)
# Gesicht Jacky (Augen, Wangen, Lächeln)
ax.scatter([3.46, 3.74], [4.75, 4.75], color='#2B1B17', s=18, zorder=6)
ax.scatter(
[3.38, 3.82], [4.63, 4.63], color='#FF8FA3', s=45, alpha=0.6, zorder=5
)
smile_f = patches.Arc(
(3.6, 4.63), 0.22, 0.16, angle=0, theta1=200, theta2=340, color='#A4133C', lw=2, zorder=6
)
ax.add_patch(smile_f)
# Rechter Arm (zum Händchenhalten)
draw_limb(3.88, 4.05, 4.95, 3.35, skin_f, lw=7, zorder=4)
# ==========================================
# --- XUEFENG (Rechts, x = 6.4) ---
# ==========================================
skin_m = '#F8C8B8'
hair_m = '#1F2421'
shirt_color = '#4361EE'
shirt_dark = '#2B44B8'
pants_color = '#2B2D42'
# Beine (Hose) & Schuhe
draw_limb(6.2, 2.75, 6.12, 1.48, pants_color, lw=11, zorder=2)
draw_limb(6.6, 2.75, 6.68, 1.48, pants_color, lw=11, zorder=2)
shoe_m1 = patches.Ellipse((6.06, 1.42), 0.36, 0.18, color='#111111', zorder=3)
shoe_m2 = patches.Ellipse((6.74, 1.42), 0.36, 0.18, color='#111111', zorder=3)
ax.add_patch(shoe_m1)
ax.add_patch(shoe_m2)
# Rechter Arm (außen)
draw_limb(6.75, 4.1, 7.22, 3.1, skin_m, lw=8, zorder=2)
# Oberkörper (T-Shirt)
torso_m = patches.FancyBboxPatch(
(6.05, 2.75),
0.7,
1.45,
boxstyle='round,pad=0.05,rounding_size=0.18',
facecolor=shirt_color,
edgecolor=shirt_dark,
lw=1.5,
zorder=3,
)
ax.add_patch(torso_m)
# Ärmel
sleeve_l = patches.Circle((6.05, 4.05), 0.16, color=shirt_color, zorder=4)
sleeve_r = patches.Circle((6.75, 4.05), 0.16, color=shirt_color, zorder=4)
ax.add_patch(sleeve_l)
ax.add_patch(sleeve_r)
# Hals & Kopf
draw_limb(6.4, 4.45, 6.4, 4.22, skin_m, lw=9, zorder=2)
head_m = patches.Circle((6.4, 4.82), 0.44, color=skin_m, zorder=4)
ax.add_patch(head_m)
# Frisur Xuefeng (Moderner Kurzhaarschnitt)
hair_top = patches.Wedge((6.4, 4.85), 0.46, 5, 175, color=hair_m, zorder=5)
hair_quiff = patches.Ellipse(
(6.32, 5.22), 0.55, 0.25, angle=12, color=hair_m, zorder=5
)
ax.add_patch(hair_top)
ax.add_patch(hair_quiff)
# Gesicht Xuefeng (Augen, Wangen, Lächeln)
ax.scatter([6.25, 6.55], [4.82, 4.82], color='#1B1B1B', s=20, zorder=6)
ax.scatter(
[6.17, 6.63], [4.70, 4.70], color='#F28482', s=40, alpha=0.5, zorder=5
)
smile_m = patches.Arc(
(6.4, 4.70), 0.24, 0.16, angle=0, theta1=200, theta2=340, color='#6D2E2E', lw=2, zorder=6
)
ax.add_patch(smile_m)
# Linker Arm (zum Händchenhalten)
draw_limb(6.05, 4.05, 5.05, 3.35, skin_m, lw=8, zorder=4)
# ==========================================
# --- HÄNDCHENHALTEN & HERZEN ---
# ==========================================
# Verschränkte Hände
hand_1 = patches.Circle((4.96, 3.35), 0.11, color=skin_f, zorder=5)
hand_2 = patches.Circle((5.04, 3.35), 0.11, color=skin_m, zorder=6)
ax.add_patch(hand_1)
ax.add_patch(hand_2)
# Funktion für beliebige Herzen
def draw_heart(cx, cy, scale, color, alpha=1.0, zorder=5):
t = np.linspace(0, 2 * np.pi, 100)
hx = cx + scale * (16 * np.sin(t) ** 3)
hy = cy + scale * (
13 * np.cos(t) - 5 * np.cos(2 * t) - 2 * np.cos(3 * t) - np.cos(4 * t)
)
ax.fill(hx, hy, color=color, alpha=alpha, edgecolor='none', zorder=zorder)
# Hauptherz & schwebende Mini-Herzen
draw_heart(5.0, 4.75, 0.032, '#FF1E56', alpha=0.95, zorder=6)
draw_heart(4.65, 5.35, 0.014, '#FF758F', alpha=0.85, zorder=6)
draw_heart(5.32, 5.20, 0.011, '#FF4D6D', alpha=0.80, zorder=6)
draw_heart(5.02, 5.65, 0.009, '#FFB3C1', alpha=0.90, zorder=6)
# Kleine Funkel-Sterne als Akzente
ax.scatter(
[2.5, 7.5, 4.3, 5.7],
[5.2, 4.9, 6.0, 5.8],
marker='*',
s=[90, 110, 60, 75],
color='#FFD166',
zorder=5,
)
# --- TEXT ---
plt.text(
5.0,
6.85,
'Jacky & Xuefeng',
fontsize=26,
fontweight='bold',
ha='center',
va='center',
color='#2B2D42',
family='sans-serif',
)
# Dekorative Linie unter dem Namen
ax.plot([3.3, 6.7], [6.42, 6.42], color='#FF8FA3', lw=1.5, alpha=0.8)
plt.tight_layout()
plt.savefig('jacky_xuefeng_premium.png', dpi=300, bbox_inches='tight')
plt.show()
To embed this project on your website, copy the following code and paste it into your website's HTML: