标签归档:Python绘图

用Python实战制作一张极具意义的人生进度图

时间如流水,一路向前,转眼间,2020年已过半。

这半年的你,过得还好吗?

无论过去的半年里,你是快乐还是难过,请不要沉溺于过去。

因为如果我们从宏观的角度上来看待人生,按周计算,你会发现过去的半年实际上也不过是微小的几个点而已。

对于我而言,它是这样的:

这些微小的点像钻石一般组成了你的人生。每一个点都很重要,但未来的点更关键。

看着这张图表,你有一个非常重要的问题需要回答:“我是否在充分利用自己的时间,我有没有适当地享受人生”

事实上,我认为这张图表上的每个点,即人生的每个星期,这样过是最合适的:

1.享受生活

2.为未来的每个点能够享受生活打下基础

3.创造一些能让自己或他人活得更有趣的东西

在理想状态下,上面的三点应该是互相平衡的。(当然,理想状态是不存在的)

如果你现在暂时无法平衡这三点,没关系,制作这张图,每个星期都来关注一下自己的人生进度。

神秘的原力会帮助你平衡这三点的(咋回事,我可是纯正的理工科生。

你可以把一些关键的人生时间节点标记在这张图表上,比如我认为创建Python实用宝典是一件很有趣的事情:

这么看,Python实用宝典创建了才不到半年的时间就赶上了疫情啊,这一点我倒是没注意到。

当然,你也可以丰富一下这张图表,把一些从小到大的重要节点写上,并记录今天所在的位置:

粗略地画了一张我的Life Graph,(当然没把细致的写出来哈,毕竟属于隐私),不过,我这个一会玩疯一会学疯也是挺有趣的。

接下来就教大家如何用Python最快、最方便地画出这张表,实际上我仅用了20行代码。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上噢,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda

事实上,如果我们从零开始画这个图表,是会比较麻烦的。

幸好,已经有Python同好—K20shore 大神的 Life-Graph项目帮我们做了这件事了。

你可以直接在GitHub上下载他的源代码,也可以关注Python实用宝典公众号,回复 “人生” 下载。

这份源代码依赖于Latex,所以你还需要下载 MiKTeX,一路按默认安装即可:
https://miktex.org/download

安装的时候请记住路径,因为安装完成后还需要将latex.exe的路径放入环境变量中:

2.基本使用

K20shores大神的这个库基本包含了我们所有需要使用的元件。

比如前面提到的标记某一个时间段,可以用add_era:

# 增加事件名称及其时间段
g.add_era('COVID-19', date(2020, 1, 1), date(2020, 7, 1), color="#605041")

示例如下:

from lifegraph.lifegraph import Lifegraph, Papersize, Side
from datetime import date

# 以出生日期为起点
birthday = date(1997, 6, 28)
g = Lifegraph(birthday, dpi=300, size=Papersize.A4, max_age=100)

g.add_title("Life Graph")
g.show_max_age_label()

# 增加事件名称及其时间段
g.add_era('COVID-19', date(2020, 1, 1), date(2020, 7, 1), color="#605041")

g.save("grid.png")

部分截图:

如果你需要标记一个点,可以使用add_life_event函数:

# 标记一个生命事件,可配置文本颜色及显示位置
g.add_life_event('Pythondict\nCreated', date(2019, 7, 31), color="#dc143c", side=Side.LEFT)

参数color可以配置相关线条及文本颜色,side可以配置文本显示在左边还是右边。

示例如下:

from lifegraph.lifegraph import Lifegraph, Papersize, Side
from datetime import date

# 以出生日期为起点
birthday = date(1997, 6, 28)
g = Lifegraph(birthday, dpi=300, size=Papersize.A4, max_age=100)

g.add_title("Life Graph")
g.show_max_age_label()

# 增加事件名称及其时间段
g.add_era('COVID-19', date(2020, 1, 1), date(2020, 7, 1), color="#605041")
g.add_life_event('Pythondict\nCreated', date(2019, 7, 31), color="#dc143c", side=Side.LEFT)

g.save("grid.png")

部分截图:

事实上,只要你会了这两个操作,基本上就没问题了。

值得注意的是,如果你需要用中文,请搜索“Latex 使用中文”相关的配置教程。

3.高级使用

其实它还可以配置背景图,这是我没想到的:

from lifegraph.lifegraph import Lifegraph, Papersize, Side
from datetime import date

# 以出生日期为起点
birthday = date(1997, 6, 28)
g = Lifegraph(birthday, dpi=300, size=Papersize.A4, max_age=100)

g.add_title("Life Graph")
g.show_max_age_label()

# 增加事件名称及其时间段
g.add_era('COVID-19', date(2020, 1, 1), date(2020, 7, 1), color="#605041")
g.add_life_event('Pythondict\nCreated', date(2019, 7, 31), color="#dc143c", side=Side.LEFT)

# 设置背景图
g.add_image("unnamed.jpg", alpha=0.5)

g.save("grid.png")

效果如下:

此外,连接多个点也是可以的:

from lifegraph.lifegraph import Lifegraph, Papersize, Side
from datetime import date

# 以出生日期为起点
birthday = date(1997, 6, 28)
g = Lifegraph(birthday, dpi=300, size=Papersize.A4, max_age=100)

g.add_title("Life Graph")
g.show_max_age_label()

# 增加事件名称及其时间段
g.add_era('COVID-19', date(2020, 1, 1), date(2020, 7, 1), color="#605041")

# 连接 A B 两个日期
g.add_era_span(
    'From A to B',
    date(2016, 12, 31), date(2020, 7, 13),
    color="#4423fe",
    side=Side.LEFT
)

g.save("grid.png")

基本上全部的使用方法就这些了。

希望大家能用这个工具,时刻提醒自己:

快乐地度过每一个星期,做一些有意义的事情,不负韵华。

我们的文章到此就结束啦,如果你喜欢今天的Python 实战教程,请持续关注Python实用宝典。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

Python 快速绘制画出漂亮的系统架构图

Diagrams  是一个基于Python绘制云系统架构的模块,它能够通过非常简单的描述就能绘制画出可视化架构,其支持使用以下6种云产品的图标:

AWSAzureGCPKubernetes阿里云, Oracle Cloud

基于Diagrams提供的节点,你只需要指定一个云产品(实际上选哪个都一样,我们只需要那个产品相应的图标,你可以选一个自己觉得好看的),使用其内部自带的云产品的图标,就能简单绘制基于某云产品图标的架构图,比如下面的代码,绘制了一个简单的基于数据库集群的网络服务架构:

from diagrams import Cluster, Diagram
from diagrams.aws.compute import ECS
from diagrams.aws.database import RDS
from diagrams.aws.network import Route53

with Diagram("Simple Web Service with DB Cluster", show=False):
    dns = Route53("dns")
    web = ECS("service")

    with Cluster("DB Cluster"):
        db_master = RDS("master")
        db_master - [RDS("slave1"),
                     RDS("slave2")]

    dns >> web >> db_master

非常适合用来做毕业论文的架构图绘制,强烈推荐。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上噢,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),准备开始输入命令安装依赖。

当然,我更推荐大家用VSCode编辑器,把本文代码Copy下来,在编辑器下方的终端运行命令安装依赖模块,多舒服的一件事啊:Python 编程的最好搭档—VSCode 详细指南。

在终端输入以下命令安装我们所需要的依赖模块:

pip install diagrams

看到 Successfully installed xxx 则说明安装成功。

2.基本使用与例子

2.1 初始化与导出

使用 Diagram 类初始化一个绘图上下文,这个类接收到的第一个参数将会成为架构图的文件名,而一当代码运行完毕,它将会以该文件名保存(空格会被下划线所替代):

from diagrams import Diagram
from diagrams.aws.compute import EC2

with Diagram("Simple Diagram"):
    EC2("web")

此外,它还可以选择导出的文件格式,在Diagram类里增加outformat参数,也可以不以第一个参数为文件保存名称,增加filename参数指定名称即可:

with Diagram("Simple Diagram", outformat="jpg", filename="my_diagram")

2.2 节点类型

由于节点类型比较多,我们无法一一展示出来,所有类型的节点里都可以在官方文档里找到,比如:

阿里云:https://diagrams.mingrammer.com/docs/nodes/alibabacloud
K8S: https://diagrams.mingrammer.com/docs/nodes/k8s
AWS: https://diagrams.mingrammer.com/docs/nodes/aws

接下来以AWS为例子,讲解几个基本的数据流例子:

from diagrams import Diagram
from diagrams.aws.compute import EC2
from diagrams.aws.database import RDS
from diagrams.aws.network import ELB
from diagrams.aws.storage import S3

# show参数表示是否自动打开图像
with Diagram("Web Services", show=False):
    ELB("lb") >> EC2("web") >> RDS("userdb") >> S3("store")
    ELB("lb") >> EC2("web") >> RDS("userdb") << EC2("stat")
    (ELB("lb") >> EC2("web")) - EC2("web") >> RDS("userdb")

几个操作符:

>> 表示从左到右的数据流
<< 表示从右到左的数据流
– 表示没有箭头的数据流

可以用变量赋值的形式简化代码:

from diagrams import Diagram
from diagrams.aws.compute import EC2
from diagrams.aws.database import RDS
from diagrams.aws.network import ELB

with Diagram("Workers", show=False, direction="TB"):
    lb = ELB("lb")
    db = RDS("events")
    lb >> EC2("worker1") >> db
    lb >> EC2("worker2") >> db
    lb >> EC2("worker3") >> db
    lb >> EC2("worker4") >> db
    lb >> EC2("worker5") >> db

可以看到这里箭头的方向变了,这是因为Diagram加了direction参数,TB 表示数据流向 top to bottm, 即从上到下,可选的其他参数还有:LR(左至右)、BT(底至上)、RL(右至左)。

上面的代码还可以用数组的形式进一步简化:

from diagrams import Diagram
from diagrams.aws.compute import EC2
from diagrams.aws.database import RDS
from diagrams.aws.network import ELB

with Diagram("Grouped Workers", show=False, direction="TB"):
    ELB("lb") >> [EC2("worker1"),
                  EC2("worker2"),
                  EC2("worker3"),
                  EC2("worker4"),
                  EC2("worker5")] >> RDS("events")

2.3 集群块

使用Cluster 类 并用with以上下文的形式,你可以非常方便地生成一个集群块:

from diagrams import Cluster, Diagram
from diagrams.aws.compute import ECS
from diagrams.aws.database import RDS
from diagrams.aws.network import Route53

with Diagram("Simple Web Service with DB Cluster", show=False):
    dns = Route53("dns")
    web = ECS("service")

    with Cluster("DB Cluster"):
        db_master = RDS("master")
        db_master - [RDS("slave1"),
                     RDS("slave2")]

    dns >> web >> db_master

而且还可以做得相当复杂:

这里代码很简单,但是比较长,不展示了,有兴趣的话可以点击最下方阅读原文进行查看。

from diagrams import Cluster, Diagram
from diagrams.aws.compute import ECS, EKS, Lambda
from diagrams.aws.database import Redshift
from diagrams.aws.integration import SQS
from diagrams.aws.storage import S3

with Diagram("Event Processing", show=False):
    source = EKS("k8s source")

    with Cluster("Event Flows"):
        with Cluster("Event Workers"):
            workers = [ECS("worker1"),
                       ECS("worker2"),
                       ECS("worker3")]

        queue = SQS("event queue")

        with Cluster("Processing"):
            handlers = [Lambda("proc1"),
                        Lambda("proc2"),
                        Lambda("proc3")]

    store = S3("events store")
    dw = Redshift("analytics")

    source >> workers >> queue >> handlers
    handlers >> store
    handlers >> dw

2.4 自定义线的颜色与属性

使用Edge函数,你可以自定义线的颜色与属性以及备注,比如:

Edge(color="firebrick", style="dashed", label="test")
# 火砖色的虚线,备注为test

一个比较复杂,但是阅读起来很简单的例子如下:

from diagrams import Cluster, Diagram, Edge
from diagrams.onprem.analytics import Spark
from diagrams.onprem.compute import Server
from diagrams.onprem.database import PostgreSQL
from diagrams.onprem.inmemory import Redis
from diagrams.onprem.logging import Fluentd
from diagrams.onprem.monitoring import Grafana, Prometheus
from diagrams.onprem.network import Nginx
from diagrams.onprem.queue import Kafka

with Diagram(name="Advanced Web Service with On-Premise (colored)", show=False):
    ingress = Nginx("ingress")

    metrics = Prometheus("metric")
    metrics << Edge(color="firebrick", style="dashed") << Grafana("monitoring")

    with Cluster("Service Cluster"):
        grpcsvc = [
            Server("grpc1"),
            Server("grpc2"),
            Server("grpc3")]

    with Cluster("Sessions HA"):
        master = Redis("session")
        master - Edge(color="brown", style="dashed") - Redis("replica") << Edge(label="collect") << metrics
        grpcsvc >> Edge(color="brown") >> master

    with Cluster("Database HA"):
        master = PostgreSQL("users")
        master - Edge(color="brown", style="dotted") - PostgreSQL("slave") << Edge(label="collect") << metrics
        grpcsvc >> Edge(color="black") >> master

    aggregator = Fluentd("logging")
    aggregator >> Edge(label="parse") >> Kafka("stream") >> Edge(color="black", style="bold") >> Spark("analytics")

    ingress >> Edge(color="darkgreen") << grpcsvc >> Edge(color="darkorange") >> aggregator

3.总结

不得不说,这真是一个基于Python,且非常简单好用的开源免费架构图设计模块,用途其实非常广,包括不仅限于:计算机应用的架构图、毕业设计架构等等。希望大家能够学以致用。

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

Blender, 用Python绘制宇宙飞船的3D建模软件

见过用Python进行3D建模操作的么?下面给你演示一下:

强不强?这就是Blender,一款能用Python进行建模的软件。

Blender是一个免费的开源3D计算机图形软件工具集,用于创建动画电影视觉效果,艺术品,3D打印模型,动态图形,交互式3D应用程序和计算机游戏

不仅如此,它还提供了一个Python与Blender交互的API: https://docs.blender.org/api/2.81/ ,使Python进行3D建模成为一种可能。

下面介绍一下这个宇宙飞船项目。这是一个比赛作品,作者用它参与了reddit的一个2016年6月的挑战赛。实现的原理并不复杂,就是从一个立方体开始建造船体,利用随机数增加船体的不确定性。然后慢慢地往船体增加细节,比如引擎、天线、炮塔、照明灯等等。

项目地址: https://github.com/a1studmuffin/SpaceshipGenerator

快来生成你的宇宙飞船

要想运行这个项目,你需要做如下准备:

1. 安装Blender 2.76以上:
https://www.blender.org/download/

2. 下载作者的生成代码(也就是已经和Blender做好API联调的代码)。
如果你访问不了Github, 可在公众号后台回复 宇宙飞船 下载这些代码。

3. 将下载好的代码( add_mesh_SpaceshipGenerator.zip, 以压缩包的形式)载入到blender中:

3.1 点击菜单栏里的 Edit — 选择Preferences.

3.2 选择左侧的Add-ons,然后点击install,选择刚刚下载下来的压缩包。

3.3 载入后记得勾选插件。

4. 使用快捷键shift+F5进入3D视图

5. 使用快捷键shift+A,这时候鼠标右键会弹出选项,在mesh中选择 Spaceship即可生成你的宇宙飞船!

怎么样,够不够帅?记得自己实践一下生成一个哦!

自己用Python进行DIY

如果你想自己再进行一下DIY,让飞船变得更帅气,那也是可以的!把下载下来的压缩包解压,里面会有一个文件叫spaceship_generator.py的,这个就是主要的模型生成代码。你能在里面看到作者的许多参数设置,稍微修改一下会有惊喜哦!

你也可以阅读完作者的这份源代码(也不多,就800行),自己学着做一个有别于宇宙飞船的3D模型!

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

7行代码 Python热力图可视化分析缺失数据处理

Python热力图寻找缺失数据

你有没有遇到一种情况,处理一张很大的csv表格的时候很难找到表格中每一列的缺失数据,或者说处理速度非常慢?当然如果你的Excel水平非常高,这个可能不会成为你的问题,但如果当你想可视化出每一列缺失数据的分布和数量怎么办呢?这时候就需要用Python绘制热力图了!

1.安装所需要的第三方Python

在开始之前我们需要安装以下Python包(),打开你的CMD(Windows系统)/Terminal(macOS系统)输入以下指令即可:

pip install seaborn
pip install pandas
pip install matplotlib

其中pandas是用于数据操作与处理的,matplotlib和seaborn主要用于Python数据可视化,也就是绘制我们所需要的热力图。

2.Python加载数据

好了,废话不多说,让我们现在就开始使用panda加载数据:

import pandas as pd
import numpy as np
import seaborn
import matplotlib

data = pd.read_csv('training_data.csv')

没错,pandas的使用就这么简单,读取csv文件直接使用read_csv函数,你可以使用自己需要的csv文件,也可以使用我们提供的:点击下载 Python推特机器人分类数据集 中的training_data.csv,只需要你移动到当前代码的文件夹下即可。

3.Python构造热力图

使用Python构造热力图识别表格的缺失数据:

seaborn.heatmap(data.isnull(), yticklabels=False, cbar=False, cmap='viridis')
# 热力图,当data中有空值时标为黄色
matplotlib.pyplot.tight_layout() 
matplotlib.pyplot.show()
Python热力图寻找缺失数据

seaborn.heatmap用于生成热力图,其会检查data中的每个单元格,如果为空则标记为黄色,cmap为颜色图谱,viridis即蓝-绿-黄. 此外,matplotlib.pyplot主要用于负责展示图片。如果你需要知道seaborn更详细的参数文档,可以阅读这篇文章

整体代码如下(一共只用了7行

import pandas as pd
import seaborn
import matplotlib
data = pd.read_csv('training_data.csv')
seaborn.heatmap(data.isnull(), yticklabels=False, cbar=False, cmap='viridis')
matplotlib.pyplot.tight_layout() 
matplotlib.pyplot.show()

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

精美的数据分析图!教你使用Python的Plotly库

plotly 是目前已知的Python最强绘图,它比上次我们讲的echarts还强大许多许多,它的绘制通过生成一个web页面得到,而且支持调整图像大小后保存,而且还能支持可动态调节的页面,方便python web端的开发。

一个例子

一、安装

开始之前,你要确保Python和pip已经成功安装在电脑上噢,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),准备开始输入命令安装依赖。

当然,我更推荐大家用VSCode编辑器,把本文代码Copy下来,在编辑器下方的终端装依赖模块,多舒服的一件事啊:Python 编程的最好搭档—VSCode 详细指南

在终端输入以下命令安装我们所需要的依赖模块:

pip install plotly

看到 Successfully installed xxx 则说明安装成功。

二、使用例子

你只需要知道某些图的生成函数及其传入参数,就可以生成很漂亮的统计图。比如生成文章开头的那个官方平行类别图,你只要需要知道它的生成函数是 px.parallel_categories。支持的参数列表如下:

data_frame:数据,需要以DataFrame格式。

color: 可指定每一列的特定颜色。

color_continuous_scale: 构建连续的颜色

详细参数可阅读官方文档:

https://plotly.github.io/plotly.py-docs/generated/plotly.express.parallel_categories.html

在这里,我们使用官方生成好的数据作为展示的例子,编写以下代码即可:

# 文件命名为:test.py
import plotly.express as px
tips = px.data.tips()
fig = px.parallel_categories(tips, color="size", color_continuous_scale=px.colors.sequential.Inferno)
fig.show()

在cmd/Terminal或者vscode的终端里,运行这份代码:python test.py 你会看到浏览器自动生成了一个页面,页面上就是这幅图,而且是可以进行交互的图

除此之外还有这样的图:

第二个例子
import plotly.express as px
gapminder = px.data.gapminder()
fig = px.scatter(gapminder.query("year==2007"), x="gdpPercap", y="lifeExp", size="pop", color="continent",
           hover_name="country", log_x=True, size_max=60)
fig.show()

代码其实非常简单,你只需要符合它的数据格式就可以生成了,真的是坐着收图啊,还有以下这些例子,这些例子都是可以在页面上进行交互的(放大缩小等),相当方便!

三、保存

其实在执行完程序后生成的页面里,右上角有个小摄像头,点击那个摄像头可以直接生成页面:

但是你可能会希望直接在程序中将图片保存下载,方便批量生成图片,这个时候我们需要添加这样的一个离线plot语句:

import plotly.offline as offline 
offline.plot(figure_or_data = fig, image = 'png', image_filename='plot_image', output_type='file', image_width=800, image_height=600, validate=False) 

在得到了图像的fig变量后,你只需要继续编写上述语句就可以保存下来,比如我们的第一个例子,将会是这样保存的。

# 文件命名为:test.py
import plotly.express as px
import plotly.offline as offline
tips = px.data.tips()
fig = px.parallel_categories(tips, color="size", color_continuous_scale=px.colors.sequential.Inferno)
fig.show()

offline.plot(figure_or_data = fig, image = 'png', image_filename='plot_image',
             output_type='file', image_width=800, image_height=600, validate=False)

四、其他功能

  1. 共享:如果你希望能和其他人共享图片,而自己又不会做web开发,没关系,plotly也提供了解决方案,这个时候我们需要安装一个新的包叫chart_studio,然后使用官方给定的API进行在线绘制,就能保存到你的plotly个人网页中了! 详细可见官方教程
  2. 添加背景图:你还可以给你的图片添加背景图!而且操作非常简单。
  3. 添加你的LOGO:添加你个人独特的LOGO也是支持的!

    https://plot.ly/python/images/ 你可以找到这2和3的相应教程!

以上这些,我们在未来都会陆续讲到,如果你想要获得更多的图形及其编写方法,可以参考官方文档,也可以继续关注本公众号/网站,我们将陆续推出plotly的具体例子的制作方案!!

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

python 画雪花 —科赫曲线的实现

漂亮的科赫曲线

科赫曲线是一种分形,其形态非常像雪花,因此又被称作科赫雪花雪花曲线。

下面是用python的turtle包让我们来实时画一个如上图所示的雪花

import turtle
def koch(t,n): 
    #定义一个函数 科赫曲线,完成绘画功能
    if n < 5 :
        t.fd(n) 
        return
    m = n/3
    koch(t,m)
    t.lt(60)
    koch(t,m)
    t.rt(120)
    koch(t,m)
    t.lt(60)
    koch(t,m)

def snowflake(t, n):
    # 画一朵雪花,每一边都是一个科赫曲线
    for i in range(3):
        koch(t,n)
        t.rt(120)

bob = turtle.Turtle()
bob.color('black')
bob.penup() # 画笔提起(不能画)
bob.goto(-150,90) #去到这个点
bob.pendown() # 画笔落下(开始画)
snowflake(bob,300) # 调用函数开始画雪花
turtle.mainloop() 

别看这么简短的代码,其实它内含的数学知识可不简单,科赫曲线的生成其实是一个递归的过程,通过不断地递归调用koch,我们可以形成一个不断由等边三角形组成的雪花。如文首所示的那样。维基百科更专业的解释是这样的:

给定线段AB,科赫曲线可以由以下步骤生成:
1. 将线段分成三等份(AC,CD,DB)
2. 以CD为底,向外(内外随意)画一个等边三角形DMC
3. 将线段CD移去
4. 分别对AC,CM,MD,DB重复1~3。
科赫雪花是以等边三角形三边生成的科赫曲线组成的。每条科赫曲线的长度是无限大,它是连续无处可微的曲线。

你还可以对其进行改进,加一个random函数,改一下画笔颜色,可以形成漫天雪花的效果哦。

希望你喜欢这篇文章,欢迎关注公众号 Python实用宝典,会不断地更新Python相关的实用教程哦!