奇技淫巧 - Python繪制各種簡單優美曲線
matplotlib是著名的Python繪圖庫,它提供了一整套繪圖API,十分適合交互式繪圖。,解決數據分析和可視化問題,其實也是Python的拿手好戲。另外,在數據處理過程中會用到numpy。
例如,畫出指定區間的一個多項式函數:
Python 代碼如下:
- import numpy as np
- import matplotlib.pyplot as plt
- X = np.linspace(-4, 4, 1024)
- Y = .25 * (X + 4.) * (X + 1.) * (X - 2.)
- plt.title('$f(x)=\\frac{1}{4}(x+4)(x+1)(x-2)$')
- plt.plot(X, Y, c = 'g')
- plt.show()
通過numpy的linspace方法來確定橫坐標x的取值范圍,列出方程,然后調用matplotlib的pyplot畫出函數曲線即可。numpy 是一個用python實現的科學計算包,包括一個強大的N維數組對象Array和成熟的函數庫,有用于整合C/C++和Fortran代碼的工具包,提供了實用的線性代數、傅里葉變換和隨機數生成函數等工具,可以理解成Matlab。
哪些看似抽象的數學公式,實際上是自己不知道她們的應用場景而已。
Python代碼如下:
- import numpy as np
- import matplotlib.pyplot as plt
- X = np.linspace(0, 2 * np.pi, 100)
- YSinValues = np.sin(X)
- YCosValues = np.cos(X)
- plt.plot(X, YSinValues)
- plt.plot(X, YCosValues)
- plt.show()
Matplotlib 是一個 Python 的 2D繪圖庫,甚至可以生成出版質量級別的圖形。
對于那些正態分布而言,Python 畫起來也就相當簡單了:
- import numpy as np
- import matplotlib.pyplot as plt
- def pdf(X, mu, sigma):
- a = 1. / (sigma * np.sqrt(2. * np.pi))
- b = -1. / (2. * sigma ** 2)
- return a * np.exp(b * (X - mu) ** 2)
- X = np.linspace(-6, 6, 1000)
- for i in range(3):
- samples = np.random.standard_normal(10)
- mu, sigma = np.mean(samples), np.std(samples)
- plt.plot(X, pdf(X, mu, sigma), color = '.66')
- plt.plot(X, pdf(X, 0., 1.), color = 'b')
- plt.show()
為了不顯得單調,這里多畫了幾條曲線。只要算出方差和均值,從excel中讀出哪些數值就可以擬合正態分布了。
在直角坐標系中,愛心線的方程的python 表達為:x** 2+ y** 2 + a * x= a * sqrt(x** 2+y** 2) 和 x** 2+ y** 2 - a * x= a * sqrt(x** 2+y** 2)通過x 來求對應的y值很麻煩,就像軟件設計中的“萬能層”那樣,可以采用參數方程來表示:
x=a*(2*cos(t)-cos(2*t))
y=a*(2*sin(t)-sin(2*t))
具體的Python代碼如下:
- import numpy as np
- import matplotlib.pyplot as plt
- a = 1
- t = np.linspace(0 , 2 * np.pi, 1024)
- X = a*(2*np.cos(t)-np.cos(2*t))
- Y = a*(2*np.sin(t)-np.sin(2*t))
- plt.plot(Y, X,color='r')
- plt.show()
代表愛心的心形線來了:
但這不是六行代碼呀?也不是r=a(1-sinθ)呀?的確如此,那是極坐標系,python 的matplotlib同樣支持極坐標系的,愛心線的六行pyton代碼如下:
這樣,得到如下圖像:
心形線確實是愛心滿滿,如果融入了憂傷會是怎樣呢?
這樣就得到了另一個愛心線:
網絡上還有關于愛心線的各種漂亮實現,也充滿了各種各樣的情緒,但對于每一種,基本上都可以用python 相對簡潔的實現。
實際上,繪圖很簡單,難的是那些曲線方程的表達以及實際的應用場景需求,比如螺旋線。
作為數據分析乃至大數據處理的最后一個環節,就是所謂洞見的可視化,Python 可以說是其中的一個簡單實用的工具。