8

我一直在想如何像mathematica和mathlab等程序,功能如此优雅和快速地绘制图表。任何人都可以向我解释他们如何做到这一点,而且,我该如何做到这一点?它与计算机编程或数学的某个方面或课程有关吗?然后呢?像mathematica这样的程序如何绘制图形,以及如何制作这样的程序?

+3

您可能有兴趣看看[matplotlib](http://matplotlib.sourceforge.net/),它是一个Python中的2D绘图库。它采用BSD格式的许可证,因此您可以阅读和使用源代码来查看您的内容。 – Cascabel 2011-01-23 07:29:01

+0

我认为@ Jefromi的评论是最好的答案,因为没有人能够告诉你Matlab或Mathematica是如何工作的。在一个强大的图形库中有很多很多细微的问题要解决,对你来说不容易回答,对不起 – 2011-01-23 07:46:50

+0

[鼠尾草图的底层渲染](http://hg.sagemath.org/sage-main/file/f24ce048fa66 /sage/plot/plot.py#l1)也是用matplotlib完成的。 – Simon 2011-01-23 09:00:59

回答

5

好吧,在belisarius的鼓励下,我的评论作为回答:试试看matplotlib。来自主页:

matplotlib是一个蟒蛇2D绘图库,它可以在各种平台上以各种硬拷贝格式和交互式环境生成出版品质数字。 matplotlib可用于python脚本,python和ipython shell(alaMATLAB®*或Mathematica®),Web应用程序服务器和六个图形用户界面工具包。

它最初是受MATLAB的绘图功能的启发,尽管从那以后它的增长很快。它是稳定的软件 - 它是开放源代码的,在BSD许可下,所以你不仅可以阅读源代码,还可以在任何你喜欢的地方使用它。

另一个你可以看的地方是gnuplot。它不是常见的开源许可证之一,但它肯定是开源的,有一些修改权限等。

Gnuplot是一个可移植的命令行驱动的Linux,OS/2,MS Windows,OSX,VMS和许多其他平台的图形工具。源代码受版权保护,但可以自由分发(即,您不必为此付费)。它最初创建的目的是让科学家和学生能够交互式地将数学函数和数据可视化,但已经发展到支持许多非交互式用途,例如Web脚本。它也被Octave等第三方应用程序用作绘图引擎。 Gnuplot自1986年以来一直受到支持并处于积极的发展阶段。

它也进行3D绘图,而matplotlib也没有这样做,而且它已经存在了很长的时间。我首先想到matplotlib的原因是它的目的是作为一个更高级语言的库,而不是一个独立的应用程序,所以我猜这对您来说可能更容易阅读。

另外一个建议,只是想了解一下Mathematica正在做的事情,就是看documentation for Plot。特别是,如果你看看可用的选项,你可以推断出事情。

MaxRecursionAutomatic递归细分的最大数目允许 MethodAutomatic使用的方法进行精炼曲线的性能 PerformanceGoal$PerformanceGoal方面尝试优化 PlotPointsAutomatic采样点

从初始数MaxRecursionPlotPoints,你可以看到它正在进行初始采样,然后以某种方式决定哪个区域需要对ns进行细分(重新采样)才能获得图的准确视图。从这里开始,这是神奇的:有一些Method为此,并PerformanceGoal指导它...

1

对于MATLAB,由于其跨平台的要求,没有其他选择,因为使用OpenGL。 MATLAB运行时用C++编写,非轴GUI使用Java Swing。因此MATLAB Plot可能是一个C++/OpenGL/Swing混合。

在现实中,MATLAB图形并不复杂,然后视频游戏图形。我认为找到视频游戏图形教程比较容易,然后将其“缩小”为MATLAB功能,就像绘制一条具有相同颜色的单线一样。

最重要的概念可能是Transformation Matrix

1

基本上大多数绘制任何类型图的程序(特别是任何合理复杂的图)都会使用某种类型的第三方库。

使用的特定库取决于正在使用的编程语言。 例如:

对于.Net应用程序,您可能会使用Crystal报表。 http://en.wikipedia.org/wiki/Crystal_Reports

对于Java,您可能会使用JFreeChart。 http://www.jfree.org/jfreechart/ 等等...

你可能会发现你决定代码任何语言numerious库。

如果你想实现你的具体项目这个功能我建议使用一个库,特别是如果你是初学者。由于诸如跨平台兼容性,图形渲染优化(即:确保图形快速渲染和“精美”渲染),与元素定位相关的数学问题等诸多问题,这些图库的实现方式的内部复杂性将是显着的图表等等。

最后,我怀疑你会发现在这个主题(或要求他们)的具体课程再次排除非常具体的情况下,程序员将始终使用已经存在的库。

为什么自己编码时有人有 已经解决了你的问题?

0

一个好的开始就是了解,有一个语法图形和你想建立什么接收绘图命令是图形的符号表示。对于数学,你可以这样做

FullForm[Plot[Sin[x], {x, 0, 2 Pi}]] 

看到内部表示Mathematica使用。基本上,您需要根据颜色和坐标描述要绘制的线段(2D)或网格(3D)。此外,还需要有关图形的比例尺以及如何绘制刻度标记,标签轴等的信息。

这将我们引导至问题的核心,您如何确定要绘制的线段一个函数和一个范围?如果您在绘图的帮助文件中进行挖掘,您会看到一些内容。首先有一个绘图点选项和一个MaxRecursion选项。这让我相信(这只是一个受过教育的猜测,但它是我的做法),Mathematica绘制了在该范围上偶数间隔的初始点数以获得初始值。接下来的部分是识别变化超过某个阈值的区域,然后对更多点进行采样,直到线段中任意两点之间的“变化”低于阈值。 Mathematica以递归方式执行此操作,因此MaxRecursion选项。

到目前为止,我对定义变化率非常模糊。描述更改的更有用的方法是在您的线段上取3分。假设第一点和第三点之间存在线性关系,并且假设这个线性关系对第二点将是什么进行预测。如果这个预测的误差足够低,那么考虑下一组三个点。如果错误高于阈值,则应该在该区域中采样更多点,直到达到阈值。通过这种方式,您将需要相对较少的点,其中曲线相对较直,更多的点位于弯曲新方向的“有趣”部分。您绘制的曲线的平滑度将与您愿意在点的线性预测中容忍的误差成正比。

相关问题