如何从Python列表中绘制可缩放的Cantor集?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从Python列表中绘制可缩放的Cantor集?相关的知识,希望对你有一定的参考价值。
我编写了一个Python脚本f(n),它生成一个整体的列表,然后是一个线段的第三个,然后是第九个,然后是第27个等。如何将其转换为图形 - 理想情况下我可以放大和缩小并导航?
我想绘制第一行,然后绘制第三行,然后是第九行,然后是第九行,以及第27行,以及类似于Cantor集合构建的熟悉方式。
f标记在Cantor集合构造的每个阶段保留的区间的片段,带有一些值(假设它为了参数而将它们编号)并且它用零标记所有被删除的片段,以下列格式标记:
[row-number,element_number,label]
其中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并从中可以定位它的高度以及推断段的长度为1/3 ^ l,并且我们有元素的element_number e所以我们可以放置它在位置e / 3 ^ l,我们有标签放在它的中心e /(2 * 3 ^(l-1))
我已经安装了networkx,mathplotlib,我也可以导出一个gexf但是我很难找到一种方法(对于一个noob程序员)来绘制这些标记的条形或段。任何帮助将不胜感激。
我根本不懂“标签”。但是通过递归地走水平,很容易产生一个cantor情节。
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()
Labeling the lines is in this far not straight forward here because the recursive placement of the lines is in a different order than the desired labeling. One solve this by placing a label for each line and later on sort the labels; then giving each the number from the sorted list.
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()
请注意,行越小,文本的可读性越差。因此,标注较低的小线条仅在放大时才有意义。
以上是关于如何从Python列表中绘制可缩放的Cantor集?的主要内容,如果未能解决你的问题,请参考以下文章
在两页模式下如何实现可缩放的 UIPageViewController?