如何从Python列表中绘制可缩放的Cantor集?

如何从Python列表中绘制可缩放的Cantor集?,python,numpy,matplotlib,graph,Python,Numpy,Matplotlib,Graph,我已经编写了一个Python脚本f(n),它生成一个线段的整体列表,然后是三分之一、九分之一、二十七分之一等等。我如何将它转换成一个图形——理想情况下,我可以放大、缩小和导航 我想画第一条线,然后是下面的第三条线,然后是第九条线,然后是第二十七条线,依此类推,就像我们熟悉的康托集合的构造方式一样 f用某个值标记在Cantor集构造的每个阶段仍保留的区间段(假设它为参数对其进行编号),并用零标记所有删除的段,标记格式如下: [行编号、元素编号、标签] 其中label是每个段的一些参数,比如现在它以

我已经编写了一个Python脚本f(n),它生成一个线段的整体列表,然后是三分之一、九分之一、二十七分之一等等。我如何将它转换成一个图形——理想情况下,我可以放大、缩小和导航

我想画第一条线,然后是下面的第三条线,然后是第九条线,然后是第二十七条线,依此类推,就像我们熟悉的康托集合的构造方式一样

f用某个值标记在Cantor集构造的每个阶段仍保留的区间段(假设它为参数对其进行编号),并用零标记所有删除的段,标记格式如下:

[行编号、元素编号、标签]

其中label是每个段的一些参数,比如现在它以1开始对移除的零件进行编号,并将所有移除的零件标记为零

因此,它输出:

f(0)=[[0,0,1]]

f(1)=[[0,0,1],[1,0,2],[1,1,0],[1,2,3]]

f(3)=[0,0,1],[1,0,2],[1,1,0],[1,2,3],[2,0,4],[2,1,0],[2,2,5],[2,3,0],[2,4,0],[2,5,0],[2,6,6],[2,7,0],[2,8,7]]

等等

为了清楚起见,为了绘制前n行,我不需要使用f(x小于n),因为f(n)足以列出每行中的段

所有必要的数据都在那里,因为我们可以读取行号l,根据行号l可以定位它的高度,也可以推断线段的长度为1/3^l,我们有元素的元素号e,所以我们可以把它放在位置e/3^l,我们有标签放在它的中心e/(2*3^(l-1))

我已经安装了networkx、mathplotlib,还可以导出一个gexf,但我正在努力找到一种方法(对于noob程序员来说)来绘制这些带标签的条或段。任何帮助都将不胜感激。

我根本不懂“标签”。但康托图很容易通过递归遍历各个层来生成

import numpy as np
import matplotlib.pyplot as plt

line = [0,1]
depth = 5

def divide(line, level=0):
    plt.plot(line,[level,level], color="k", lw=5, solid_capstyle="butt")
    if level < depth:
        s = np.linspace(line[0],line[1],4)
        divide(s[:2], level+1)
        divide(s[2:], level+1)

divide(line)
plt.gca().invert_yaxis()
plt.show()
将numpy导入为np
将matplotlib.pyplot作为plt导入
行=[0,1]
深度=5
def分割(行,级别=0):
plt.plot(直线,[水平,水平],color=“k”,lw=5,solid\u capstyle=“butt”)
如果标高<深度:
s=np.linspace(第[0]行、第[1]行、第4行)
除法(s[:2],等级+1)
除法(s[2:],级别+1)
分(线)
plt.gca().invert_yaxis()
plt.show()


在这里标记线远不是直接的,因为线的递归放置顺序与所需的标记顺序不同。解决方法之一是为每行放置一个标签,然后对标签进行排序;然后从已排序的列表中为每个人指定编号

import numpy as np
import matplotlib.pyplot as plt

line = [0,1]
depth = 5

labels=[]
def divide(line, level=0):
    plt.plot(line,[level,level], color="k", lw=5, solid_capstyle="butt")
    label = plt.annotate("",xy=(np.mean(line),level), xytext=(0,5),
                         textcoords="offset points", ha="center", color="crimson")
    labels.append(label)
    if level < depth:
        s = np.linspace(line[0],line[1],4)
        divide(s[:2], level+1)
        divide(s[2:], level+1)

divide(line)

labels.sort(key=lambda x: x.xy[::-1])
for i, label in enumerate(labels):
    label.set_text(i+1)
plt.gca().invert_yaxis()
plt.show()
将numpy导入为np
将matplotlib.pyplot作为plt导入
行=[0,1]
深度=5
标签=[]
def分割(行,级别=0):
plt.plot(直线,[水平,水平],color=“k”,lw=5,solid\u capstyle=“butt”)
label=plt.注释(“,xy=(np.平均值(线),水平),xytext=(0,5),
textcoords=“偏移点”,ha=“中心”,color=“深红色”)
标签。附加(标签)
如果标高<深度:
s=np.linspace(第[0]行、第[1]行、第4行)
除法(s[:2],等级+1)
除法(s[2:],级别+1)
分(线)
labels.sort(key=lambda x:x.xy[:-1])
对于i,枚举中的标签(标签):
标签。设置文本(i+1)
plt.gca().invert_yaxis()
plt.show()
请注意,行越小,文本的可读性越差。因此,我想只有放大时,标记较低的小线条才有意义


这个答案有用吗@BoboDarph不确定;我有一套,这是我正在努力实现的可缩放、可导航的渲染引擎。问题还不清楚。似乎您只需要从一个点到下一个点绘制一条线。@ImportanceOfBeingErnest您是否得到f(1)输出行号0、项目号0、标签1?f(2)输出的是第二行的三段,长度为三分之一,标识为行1,元素1,2,3,依次标记为2,0,3?谢谢。对你来说很容易。对我来说很难!我只是想给这些条编号——1在顶部,2,3在下,然后4,5,6,7在下等等。通过“给条贴标签”,你的意思是在绘图中添加一个文本标签?我添加了一个解决方案。不确定这到底有多有用,因为标签很快就会重叠。谢谢。我可以从这个和你的代码中学习。我会看看是否能把它转换成d3中构建的可缩放图形。