如何从Python列表中绘制可缩放的Cantor集?
我已经编写了一个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程序员来说)来绘制这些带标签的条或段。任何帮助都将不胜感激。我根本不懂“标签”。但康托图很容易通过递归遍历各个层来生成如何从Python列表中绘制可缩放的Cantor集?,python,numpy,matplotlib,graph,Python,Numpy,Matplotlib,Graph,我已经编写了一个Python脚本f(n),它生成一个线段的整体列表,然后是三分之一、九分之一、二十七分之一等等。我如何将它转换成一个图形——理想情况下,我可以放大、缩小和导航 我想画第一条线,然后是下面的第三条线,然后是第九条线,然后是第二十七条线,依此类推,就像我们熟悉的康托集合的构造方式一样 f用某个值标记在Cantor集构造的每个阶段仍保留的区间段(假设它为参数对其进行编号),并用零标记所有删除的段,标记格式如下: [行编号、元素编号、标签] 其中label是每个段的一些参数,比如现在它以
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中构建的可缩放图形。