import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import FancyBboxPatch

def pascal_triangle(n):
    """Generate the first n rows of Pascal's triangle."""
    triangle = np.zeros((n, n), dtype=int)
    for i in range(n):
        triangle[i, 0] = 1
        for j in range(1, i + 1):
            triangle[i, j] = triangle[i - 1, j - 1] + triangle[i - 1, j]
    return triangle

def plot_pascal_triangle(n):
    """Plot the first n rows of Pascal's triangle with color."""
    triangle = pascal_triangle(n)
    
    fig, ax = plt.subplots(figsize=(10, 10))
    ax.axis('off')

    # Define a color map
    colors = plt.cm.viridis(np.linspace(0, 1, n))
    
    box_width = 0.8
    box_height = 0.8
    rounding_size = 0.1

    for i in range(n):
        for j in range(i + 1):
            x = j - i / 2
            y = -i
            color = colors[i]
            intensity = 1 - abs(j - i / 2) / (i / 2 + 1)
            rect = FancyBboxPatch((x - box_width / 2, y - box_height / 2), box_width, box_height,
                                  boxstyle=f"round,pad=0.1,rounding_size={rounding_size}",
                                  facecolor=color * intensity, edgecolor='none')
            ax.add_patch(rect)
            ax.text(x, y, triangle[i, j], ha='center', va='center', fontsize=10, color='white')

    plt.xlim(-n/2 - 1, n/2 + 1)
    plt.ylim(-n, 1)
    plt.gca().set_aspect('equal', adjustable='box')
    plt.savefig('triangle_de_pascal.png', dpi=300, bbox_inches='tight')
    plt.show()

plot_pascal_triangle(20)
