最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用python繪制好看的分形圖(附代碼)

 更新時間:2026年01月22日 08:50:30   作者:Andrew-浮游會  
分形圖(Fractal)是具有自相似性的幾何圖形,小尺度下的形態(tài)與整體形態(tài)高度相似,Python結合matplotlib,numpy和numba可以輕松繪制出視覺效果驚艷的分形圖,下面我們就來詳細介紹一下吧

分形(Fractal)是具有自相似性的幾何圖形,小尺度下的形態(tài)與整體形態(tài)高度相似,典型代表有曼德博集合(Mandelbrot Set)、朱利亞集合(Julia Set)、科赫雪花、分形樹等。Python結合matplotlibnumpy(高效數值計算)和numba(加速循環(huán))可以輕松繪制出視覺效果驚艷的分形圖,本文從基礎原理到代碼實戰(zhàn),教你畫出高質量的分形圖形。

一、前置準備

1.1 安裝依賴

需要的核心庫:

  • numpy:數值計算(矩陣運算、復數處理)
  • matplotlib:繪圖與色彩渲染
  • numba:JIT編譯加速(分形計算涉及大量循環(huán),純Python速度慢)
  • PIL(可選):保存高清圖片

執(zhí)行安裝命令:

pip install numpy matplotlib numba pillow

1.2 核心優(yōu)化思路

分形計算的核心是迭代判斷點是否屬于分形集合,循環(huán)次數多且計算密集:

  • numpy向量化運算替代純Python循環(huán);
  • numba.jit裝飾器編譯核心函數,提速10~100倍;
  • 合理設置色彩映射(colormap)提升視覺效果。

二、實戰(zhàn)1:曼德博集合(Mandelbrot Set)

曼德博集合是最經典的分形,定義為復平面上滿足 ( z_{n+1} = z_n^2 + c )(初始 ( z_0=0 ))迭代不發(fā)散的點 ( c=x+yi ) 的集合。

2.1 完整代碼(高清+彩色)

import numpy as np
import matplotlib.pyplot as plt
from numba import jit
from matplotlib.colors import LinearSegmentedColormap

# ===================== 1. 核心計算函數(Numba加速) =====================
@jit(nopython=True)  # JIT編譯,大幅提速
def mandelbrot(c, max_iter):
    """判斷單個點c是否屬于曼德博集合,返回迭代次數(用于上色)"""
    z = 0
    n = 0
    while abs(z) <= 2 and n < max_iter:
        z = z * z + c
        n += 1
    # 平滑上色:避免迭代次數突變導致的色塊
    if n == max_iter:
        return max_iter  # 屬于集合,設為最大迭代次數
    return n + 1 - np.log(np.log2(abs(z)))  # 平滑后的迭代次數

@jit(nopython=True)
def mandelbrot_set(x_min, x_max, y_min, y_max, width, height, max_iter):
    """生成曼德博集合的迭代次數矩陣"""
    x = np.linspace(x_min, x_max, width)
    y = np.linspace(y_min, y_max, height)
    img = np.zeros((height, width))
    for i in range(height):
        for j in range(width):
            c = complex(x[j], y[i])
            img[i, j] = mandelbrot(c, max_iter)
    return img

# ===================== 2. 自定義色彩映射(更美觀) =====================
def create_fractal_cmap():
    """創(chuàng)建自定義分形配色(深藍→紫色→粉色→黃色→白色)"""
    colors = [
        (0.0, 0.0, 0.1),    # 深藍(集合內部)
        (0.2, 0.0, 0.5),    # 深紫
        (0.5, 0.1, 0.8),    # 粉紫
        (0.8, 0.2, 1.0),    # 亮粉
        (1.0, 0.8, 0.2),    # 黃色
        (1.0, 1.0, 1.0)     # 白色(迭代次數最多)
    ]
    return LinearSegmentedColormap.from_list("fractal", colors, N=1024)

# ===================== 3. 繪制曼德博集合 =====================
def plot_mandelbrot():
    # 1. 配置參數(可調整視角,比如放大局部細節(jié))
    # 全局視圖:x∈[-2.0, 1.0], y∈[-1.5, 1.5]
    # 局部細節(jié)(比如“海馬谷”):x∈[-0.8, -0.7], y∈[0.0, 0.1]
    x_min, x_max = -2.0, 1.0
    y_min, y_max = -1.5, 1.5
    width, height = 2000, 2000  # 分辨率(越高越清晰,計算越久)
    max_iter = 1000  # 迭代次數(越高細節(jié)越多)

    # 2. 計算分形數據
    print("開始計算曼德博集合...")
    img = mandelbrot_set(x_min, x_max, y_min, y_max, width, height, max_iter)
    print("計算完成!")

    # 3. 繪圖配置
    plt.figure(figsize=(10, 10), dpi=200)  # dpi越高,圖片越清晰
    cmap = create_fractal_cmap()  # 自定義配色
    # 繪制(用log縮放讓色彩過渡更自然)
    plt.imshow(img, cmap=cmap, extent=(x_min, x_max, y_min, y_max), aspect="equal")
    
    # 4. 美化設置(無坐標軸、標題等)
    plt.axis("off")  # 隱藏坐標軸
    plt.tight_layout(pad=0)  # 去除邊距
    plt.title("Mandelbrot Set", fontsize=16, color="white", pad=10)  # 可選標題

    # 5. 保存高清圖片
    plt.savefig(
        "mandelbrot_set.png",
        dpi=300,  # 保存分辨率
        bbox_inches="tight",  # 去除白邊
        facecolor="black"  # 背景色(分形背景用黑色更美觀)
    )
    plt.show()

if __name__ == "__main__":
    plot_mandelbrot()

2.2 關鍵優(yōu)化與美化說明

  • Numba加速@jit(nopython=True) 編譯核心迭代函數,2000×2000分辨率的計算時間從幾十分鐘縮短到幾十秒;
  • 平滑上色:傳統(tǒng)的“迭代次數上色”會出現明顯色塊,通過 n + 1 - np.log(np.log2(abs(z))) 讓色彩過渡更自然;
  • 自定義配色:避開matplotlib默認配色,用深藍→紫色→黃色的漸變,貼合曼德博集合的視覺特征;
  • 高清輸出:設置dpi=300保存,無坐標軸、無白邊,符合壁紙級視覺效果。

2.3 效果調整技巧

  • 放大局部細節(jié):修改x_min/x_max/y_min/y_max,比如聚焦“海馬谷”(x∈[-0.8, -0.7], y∈[0.0, 0.1]),能看到更精細的分形結構;
  • 調整迭代次數max_iter越大,細節(jié)越多(但計算越久),局部放大時建議設為2000+;
  • 更換配色:修改create_fractal_cmap中的顏色值,比如換成“青→綠→橙”的暖色調。

三、實戰(zhàn)2:朱利亞集合(Julia Set)

朱利亞集合與曼德博集合同源,區(qū)別是迭代公式中 ( c ) 為固定常數,( z_0 ) 為復平面上的點(( z_{n+1}=z_n^2 + c ))。不同的 ( c ) 會生成完全不同的分形形態(tài),視覺效果同樣驚艷。

3.1 完整代碼

import numpy as np
import matplotlib.pyplot as plt
from numba import jit
from matplotlib.colors import LinearSegmentedColormap

# ===================== 1. 核心計算函數 =====================
@jit(nopython=True)
def julia(z, c, max_iter):
    """判斷點z是否屬于朱利亞集合"""
    n = 0
    while abs(z) <= 2 and n < max_iter:
        z = z * z + c
        n += 1
    if n == max_iter:
        return max_iter
    return n + 1 - np.log(np.log2(abs(z)))

@jit(nopython=True)
def julia_set(c, x_min, x_max, y_min, y_max, width, height, max_iter):
    """生成朱利亞集合數據"""
    x = np.linspace(x_min, x_max, width)
    y = np.linspace(y_min, y_max, height)
    img = np.zeros((height, width))
    for i in range(height):
        for j in range(width):
            z = complex(x[j], y[i])
            img[i, j] = julia(z, c, max_iter)
    return img

# ===================== 2. 自定義配色(冷色調) =====================
def create_julia_cmap():
    colors = [
        (0.0, 0.1, 0.2),    # 深藍黑
        (0.1, 0.3, 0.8),    # 藍
        (0.2, 0.8, 1.0),    # 青
        (0.5, 1.0, 0.8),    # 淺青
        (1.0, 1.0, 1.0)     # 白
    ]
    return LinearSegmentedColormap.from_list("julia", colors, N=1024)

# ===================== 3. 繪制朱利亞集合 =====================
def plot_julia():
    # 1. 核心參數(不同的c對應不同形態(tài),推薦幾個經典值)
    # c = -0.8 + 0.156j (經典螺旋)
    # c = 0.285 + 0.01j (羽毛狀)
    # c = -0.7269 + 0.1889j (蝴蝶狀)
    c = complex(-0.8, 0.156)
    x_min, x_max = -1.5, 1.5
    y_min, y_max = -1.5, 1.5
    width, height = 2000, 2000
    max_iter = 1000

    # 2. 計算數據
    print("開始計算朱利亞集合...")
    img = julia_set(c, x_min, x_max, y_min, y_max, width, height, max_iter)
    print("計算完成!")

    # 3. 繪圖
    plt.figure(figsize=(10, 10), dpi=200)
    cmap = create_julia_cmap()
    plt.imshow(img, cmap=cmap, extent=(x_min, x_max, y_min, y_max), aspect="equal")
    plt.axis("off")
    plt.tight_layout(pad=0)
    plt.savefig(
        "julia_set.png",
        dpi=300,
        bbox_inches="tight",
        facecolor="black"
    )
    plt.show()

if __name__ == "__main__":
    plot_julia()

3.2 經典c值推薦

不同的復數 ( c ) 會生成完全不同的朱利亞集合:

  • c = -0.8 + 0.156j:螺旋狀結構,視覺沖擊力強;
  • c = 0.285 + 0.01j:羽毛狀分形,細節(jié)豐富;
  • c = -0.7269 + 0.1889j:蝴蝶狀分形,對稱美感;
  • c = 0.45 + 0.1428j:類似星系的結構。

四、實戰(zhàn)3:分形樹(遞歸實現)

分形樹是遞歸分形的經典案例,通過“主干→分支→子分支”的自相似遞歸生成,代碼更簡單,適合入門。

4.1 完整代碼

import matplotlib.pyplot as plt
import numpy as np

# ===================== 1. 遞歸繪制分形樹 =====================
def draw_fractal_tree(x, y, angle, length, depth, ax):
    """
    遞歸繪制分形樹
    :param x/y: 當前起點坐標
    :param angle: 當前分支角度(弧度)
    :param length: 當前分支長度
    :param depth: 遞歸深度
    :param ax: 繪圖軸
    """
    if depth == 0:
        return
    
    # 計算分支終點坐標
    dx = length * np.cos(angle)
    dy = length * np.sin(angle)
    x2 = x + dx
    y2 = y + dy
    
    # 繪制當前分支(深度越淺,顏色越綠,線條越粗)
    color = (0.1, 0.6 + 0.3*(depth/10), 0.1)  # 從深綠到淺綠
    ax.plot([x, x2], [y, y2], color=color, linewidth=depth/2, solid_capstyle="round")
    
    # 遞歸繪制左分支(角度偏轉30°,長度縮短)
    draw_fractal_tree(x2, y2, angle + np.pi/6, length * 0.7, depth - 1, ax)
    # 遞歸繪制右分支(角度偏轉30°,長度縮短)
    draw_fractal_tree(x2, y2, angle - np.pi/6, length * 0.7, depth - 1, ax)

# ===================== 2. 繪制分形樹 =====================
def plot_fractal_tree():
    # 1. 初始化畫布
    fig, ax = plt.subplots(figsize=(10, 12), dpi=200)
    ax.set_aspect("equal")
    ax.set_xlim(-20, 20)
    ax.set_ylim(0, 30)
    ax.axis("off")  # 隱藏坐標軸
    ax.set_facecolor("#f0f0f0")  # 淺灰色背景

    # 2. 繪制分形樹(起點在底部中間,初始角度向上,遞歸深度10)
    draw_fractal_tree(0, 0, np.pi/2, 10, 10, ax)

    # 3. 保存圖片
    plt.tight_layout(pad=0)
    plt.savefig(
        "fractal_tree.png",
        dpi=300,
        bbox_inches="tight",
        facecolor="#f0f0f0"
    )
    plt.show()

if __name__ == "__main__":
    plot_fractal_tree()

4.2 效果調整

  • 遞歸深度depth越大,樹枝越多(建議10~12,太大易卡頓);
  • 分支角度:修改np.pi/6(30°),角度越大,樹越“蓬松”;
  • 長度縮放:修改0.7,值越小,分支越短,樹越緊湊;
  • 顏色:調整color的RGB值,比如換成“紅→橙”的秋色調。

五、進階美化技巧

5.1 色彩優(yōu)化

  • 避免純黑/純白:用深灰(#101010)或淺灰(#f8f8f8)作為背景,更柔和;
  • 漸變配色:用LinearSegmentedColormap自定義漸變,貼合分形的層次;
  • 對數縮放:繪圖時用np.log(img + 1)讓低迭代次數的色彩過渡更自然。

5.2 高清輸出

  • 設置dpi=300(打印級分辨率),bbox_inches="tight"去除白邊;
  • 保存為PNG(無損)或SVG(矢量圖,無限放大無鋸齒);
  • 對于超大分辨率(4000×4000+),可分塊計算避免內存溢出。

5.3 動態(tài)效果(可選)

結合matplotlib.animation制作分形演化動畫(比如曼德博集合放大過程):

# 示例:簡單動畫框架(需結合曼德博代碼)
import matplotlib.animation as animation

fig, ax = plt.subplots(figsize=(10,10))
def update(frame):
    # 每次幀調整x/y范圍(放大局部)
    x_min = -2.0 + frame*0.01
    x_max = 1.0 - frame*0.01
    img = mandelbrot_set(x_min, x_max, y_min, y_max, width, height, max_iter)
    ax.imshow(img, cmap=cmap, extent=(x_min, x_max, y_min, y_max))
    ax.axis("off")
    return [ax]

ani = animation.FuncAnimation(fig, update, frames=100, interval=50)
ani.save("mandelbrot_animation.mp4", writer="ffmpeg", dpi=150)

六、總結

核心工具numpy(數值)+ matplotlib(繪圖)+ numba(加速)是繪制分形的黃金組合;

美化關鍵:自定義配色、平滑上色、高清無白邊輸出,避開默認樣式;

分形類型

  • 曼德博/朱利亞集合:適合復雜精細的視覺效果,需Numba加速;
  • 分形樹:遞歸實現,簡單易上手,適合入門;

擴展方向:可嘗試科赫雪花、謝爾賓斯基三角形,或結合OpenCV添加濾鏡效果。

通過以上代碼和技巧,你可以輕松畫出壁紙級的分形圖,無論是用于學習、可視化還是藝術創(chuàng)作,都能達到專業(yè)級效果。

到此這篇關于使用python繪制好看的分形圖(附代碼)的文章就介紹到這了,更多相關python繪制分形圖內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • python實現桌面托盤氣泡提示

    python實現桌面托盤氣泡提示

    這篇文章主要為大家詳細介紹了python實現桌面托盤氣泡提示,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Python對象體系深入分析

    Python對象體系深入分析

    這篇文章主要介紹了Python對象體系,以實例的形式進行了較為深入的分析,需要的朋友可以參考下
    2014-10-10
  • Python自動創(chuàng)建Markdown表格使用實例探究

    Python自動創(chuàng)建Markdown表格使用實例探究

    Markdown表格是文檔中整理和展示數據的重要方式之一,然而,手動編寫大型表格可能會費時且容易出錯,本文將介紹如何使用Python自動創(chuàng)建Markdown表格,通過示例代碼詳細展示各種場景下的創(chuàng)建方法,提高表格生成的效率
    2024-01-01
  • Pthon批量處理將pdb文件生成dssp文件

    Pthon批量處理將pdb文件生成dssp文件

    這篇文章主要介紹了Pthon批量處理將pdb文件生成dssp文件,通過本例主要學習遍歷目錄下文件的方法,需要的朋友可以參考下
    2015-06-06
  • 一小時學會TensorFlow2之大幅提高模型準確率

    一小時學會TensorFlow2之大幅提高模型準確率

    這篇文章主要介紹了TensorFlow2之大幅提高模型準確率,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • python單向鏈表實例詳解

    python單向鏈表實例詳解

    這篇文章主要為大家詳細介紹了python單向鏈表實例,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • python3+PyQt5 數據庫編程--增刪改實例

    python3+PyQt5 數據庫編程--增刪改實例

    今天小編就為大家分享一篇python3+PyQt5 數據庫編程--增刪改實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • python正則匹配查詢辦理進度示例分享

    python正則匹配查詢辦理進度示例分享

    分享原創(chuàng)的一段查詢通行證辦理進度查詢的python 3.3代碼,利用socket請求相關網站,獲得結果后利用正則找出辦理進度
    2013-12-12
  • python文件轉為exe文件的方法及用法詳解

    python文件轉為exe文件的方法及用法詳解

    py2exe是一個將python腳本轉換成windows上的可獨立執(zhí)行的可執(zhí)行程序(*.exe)的工具,這樣,你就可以不用裝python而在windows系統(tǒng)上運行這個可執(zhí)行程序。本文重點給大家介紹python文件轉為exe文件的方法,感興趣的朋友跟隨小編一起看看吧
    2019-07-07
  • 給Django Admin添加驗證碼和多次登錄嘗試限制的實現

    給Django Admin添加驗證碼和多次登錄嘗試限制的實現

    這篇文章主要介紹了給Django Admin添加驗證碼和多次登錄嘗試限制的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07

最新評論

天门市| 荥经县| 东阿县| 闻喜县| 绥芬河市| 原阳县| 莒南县| 武鸣县| 天等县| 横峰县| 东莞市| 金阳县| 平果县| 赣榆县| 四平市| 绥江县| 江北区| 莱芜市| 房产| 边坝县| 丰都县| 舞钢市| 新巴尔虎右旗| 黔东| 石棉县| 三河市| 昆明市| 淮阳县| 盘锦市| 汶川县| 大渡口区| 丰台区| 万宁市| 贺兰县| 淮阳县| 天水市| 宁化县| 阳西县| 青阳县| 卢氏县| 绵竹市|