我是一名数学家。最近,我成为了一本着名杂志的谜题和问题专栏的编辑。偶尔,我需要创建一个伴随问题或解决方案的数字。这些图主要涉及2D(偶尔为3D)欧几里德几何(线,多边形,圆,加上偶尔的椭圆或其他圆锥截面)。目标是使用Computer Modern(" TeX")文本标签获得高质量(按下就绪)的数字。我希望找到(或者可能帮助写!)一个相对高级的Python库,它知道"欧几里德几何在自然操作的意义上(例如,绘制垂直线到达给定点的垂直线,平分给定角度,或反映线L上的图形A以获得新的图形A')已在库中定义。当然,在定义元素之后创建数字的能力是一个至关重要的目标(例如,封装的Postscript)。
我知道这个问题的多个次优解决方案(有些部分),但我不知道任何既简单又灵活的解决方案。让我解释一下:
Python有:
最后,一个问题:是否有一个库,类似于" Sympy / geometry"的数字,它使用Python语法描述几何对象和结构,允许生成高质量的数字(主要用于打印) ,说EPS)?
如果不存在具有此类功能的库,我会考虑帮助编写一个(也许是Sympy的扩展名?)。我会很感激指点。
答案 0 :(得分:1)
有一种方法可以使用matplotlob
生成矢量图像,并通过库io
输出到具有this approach的矢量图像(SVG)。
我亲自尝试将该方法的代码作为python文件运行在该网页中(生成矢量直方图)。
代码:
import numpy as np import matplotlib.pyplot as plt import xml.etree.ElementTree as ET from io import BytesIO import json plt.rcParams['svg.fonttype'] = 'none' # Apparently, this `register_namespace` method is necessary to avoid garbling # the XML namespace with ns0. ET.register_namespace("", "http://www.w3.org/2000/svg") # Fixing random state for reproducibility np.random.seed(19680801) # --- Create histogram, legend and title --- plt.figure() r = np.random.randn(100) r1 = r + 1 labels = ['Rabbits', 'Frogs'] H = plt.hist([r, r1], label=labels) containers = H[-1] leg = plt.legend(frameon=False) plt.title("From a web browser, click on the legend\n" "marker to toggle the corresponding histogram.") # --- Add ids to the svg objects we'll modify hist_patches = {} for ic, c in enumerate(containers): hist_patches['hist_%d' % ic] = [] for il, element in enumerate(c): element.set_gid('hist_%d_patch_%d' % (ic, il)) hist_patches['hist_%d' % ic].append('hist_%d_patch_%d' % (ic, il)) # Set ids for the legend patches for i, t in enumerate(leg.get_patches()): t.set_gid('leg_patch_%d' % i) # Set ids for the text patches for i, t in enumerate(leg.get_texts()): t.set_gid('leg_text_%d' % i) # Save SVG in a fake file object. f = BytesIO() plt.savefig(f, format="svg") # Create XML tree from the SVG file. tree, xmlid = ET.XMLID(f.getvalue()) # --- Add interactivity --- # Add attributes to the patch objects. for i, t in enumerate(leg.get_patches()): el = xmlid['leg_patch_%d' % i] el.set('cursor', 'pointer') el.set('onclick', "toggle_hist(this)") # Add attributes to the text objects. for i, t in enumerate(leg.get_texts()): el = xmlid['leg_text_%d' % i] el.set('cursor', 'pointer') el.set('onclick', "toggle_hist(this)") # Create script defining the function `toggle_hist`. # We create a global variable `container` that stores the patches id # belonging to each histogram. Then a function "toggle_element" sets the # visibility attribute of all patches of each histogram and the opacity # of the marker itself. script = """ <script type="text/ecmascript"> <![CDATA[ var container = %s function toggle(oid, attribute, values) { /* Toggle the style attribute of an object between two values. Parameters ---------- oid : str Object identifier. attribute : str Name of style attribute. values : [on state, off state] The two values that are switched between. */ var obj = document.getElementById(oid); var a = obj.style[attribute]; a = (a == values[0] || a == "") ? values[1] : values[0]; obj.style[attribute] = a; } function toggle_hist(obj) { var num = obj.id.slice(-1); toggle('leg_patch_' + num, 'opacity', [1, 0.3]); toggle('leg_text_' + num, 'opacity', [1, 0.5]); var names = container['hist_'+num] for (var i=0; i < names.length; i++) { toggle(names[i], 'opacity', [1, 0]) }; } ]]> </script> """ % json.dumps(hist_patches) # Add a transition effect css = tree.getchildren()[0][0] css.text = css.text + "g {-webkit-transition:opacity 0.4s ease-out;" + \ "-moz-transition:opacity 0.4s ease-out;}" # Insert the script and save to file. tree.insert(0, ET.XML(script)) ET.ElementTree(tree).write("svg_histogram.svg")
以前,您需要在最上面的行上点安装所需的库,然后它成功地保存了带图的SVG文件(您可以读取该文件并在直方图中放大,并且不会得到像素,因为图像用数学函数生成的。)
(显然在我们这个时代)它使用python 3。
然后您可以将SVG图像导入TeX文档中以进行发布呈现。
我希望它会有所帮助。
问候, 哈维尔。