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分。假設第一點和第三點之間存在線性關係,並且假設這個線性關係對第二點將是什麼進行預測。如果這個預測的誤差足夠低,那麼考慮下一組三個點。如果錯誤高於閾值,則應該在該區域中採樣更多點,直到達到閾值。通過這種方式,您將需要相對較少的點,其中曲線相對較直,更多的點位於彎曲新方向的「有趣」部分。您繪製的曲線的平滑度將與您願意在點的線性預測中容忍的誤差成正比。

相關問題