圖表不枯燥:用Matplotlib為你的數據分析添加趣味性

2024年2月6日 22点热度 0人点赞

Matplotlib是何許人也?

Matplotlib是一個用於創建二維圖表的Python庫,它可以生成各種靜態、動態和交互的圖標。Matplotlib被廣泛的應用於各種領域,包括:科學計算、工程設計、數據分析、金融工程中。Matplotlib目前是一個成熟的開源項目,遵循BSD許可證。他的發展歷程充分體現了開源社區的力量的壯大,同時這也得益於Python在科學計算和數據分析領域應用的普及。

在2003年,由John D. Hunter創建,他是一個神經生物學傢,為了實現一個電生理學實驗分析工具而創造的。後來收到開源愛好者的青睞,逐步被設計為一個可以替代Matlab的替代品。並隨著時間的推移,Matplotlib發展出了自己的特色,並增加了更多的圖表類型和功能。

由於其易用性和靈活性,Matplotlib很快成為社區數據可視化工具中最受歡迎的一個。隨著科學計算的普及,SciPy和Numpy這樣的科學計算庫逐步成為主流,Matplotlib也獲得了更大的發展。

接下來,我們一起來探索下Maplotlib中有哪些有趣的功能,大傢跟隨我們的代碼一步一步開始實踐吧!

基礎的環境Step By Step

以下代碼,我們在Python3.9的環境中驗證過啦!大傢可以安裝一些Python3的環境,並使用jupyter等一些python的代碼編輯工具,逐步開始嘗試,在這之前,請確保您已經安裝了如下的軟件包

pip install matplotlib
pip install numpy
pip install pandas
pip install scipy

常見圖表的繪制

繪制簡單的線圖

import matplotlib.pyplot as plt
import numpy as np
# 生成數據
x = np.linspace(0, 10, 100)  # 在0到10之間生成100個點
y = np.sin(x)                # 計算每個點的正弦值
# 繪制圖表
plt.figure(figsize=(8, 3))
plt.plot(x, y)
plt.xlabel('x axis')
plt.ylabel('y axis')
plt.title('Simple Sine Wave Plot')
plt.show()

線圖

繪制簡單的散點圖

import matplotlib.pyplot as plt
import numpy as np
# 生成數據
x = np.random.rand(50)  # 生成50個0到1之間的隨機數
y = np.random.rand(50)  # 同上
# 繪制圖表
plt.figure(figsize=(8, 3))
plt.scatter(x, y)
plt.xlabel('x axis')
plt.ylabel('y axis')
plt.title('Simple Scatter Plot')
plt.show()

散點圖

繪制簡單的柱狀圖

import matplotlib.pyplot as plt
# 生成數據
categories = ['A', 'B', 'C', 'D']
values = [10, 20, 15, 30]
plt.figure(figsize=(8, 3))
# 繪制圖表
plt.bar(categories, values)
plt.xlabel('Categories')
plt.ylabel('Values')
plt.title('Simple Bar Chart')
plt.show()

繪制簡單的餅圖

import matplotlib.pyplot as plt
# 生成數據
labels = 'A', 'B', 'C', 'D'
sizes = [15, 30, 45, 10]
# 繪制圖表
plt.figure(figsize=(8, 3))
plt.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=90)
plt.axis('equal')  # Equal aspect ratio ensures the pie chart is circular.
plt.title('Simple Pie Chart')
plt.show()

餅圖

繪制簡單的貝塞爾曲線

如果去繪制貝塞爾曲線,我們要先生成一條曲線。這裡就需要來了解一下貝塞爾曲線了。我們需要先定義貝塞爾曲線的控制點,然後在這些點上去計算曲線。我們需要使用SciPy這個科學計算庫中的 interpolate 這個插值模塊來幫助我們生成曲線上的點。

在下面這個示例中,我們定義了一個函數 bezier_curve 來計算貝塞爾曲線上的點。這個函數使用了伯恩斯坦多項式來計算曲線。在程序中,我們設定了三個點來繪制一個二次貝塞爾曲線。

import numpy as np
import matplotlib.pyplot as plt
from scipy.special import comb
def bezier_curve(points, n=1000):
    N = len(points) - 1
    t = np.linspace(0, 1, n)
    curve = np.zeros((n, 2))
    for i in range(N   1):
        curve  = np.outer(comb(N, i) * t**i * (1 - t)**(N - i), points[i])
    return curve
# 定義三個控制點 (二次貝塞爾曲線)
control_points = np.array([[0, 0], [1, 2], [2, 0]])
# 計算貝塞爾曲線上的點
bezier_points = bezier_curve(control_points)
plt.figure(figsize=(8, 3))
# 繪制貝塞爾曲線
plt.plot(bezier_points[:,0], bezier_points[:,1], label='Bezier Curve')
# 繪制控制點和控制線段
plt.plot(control_points[:,0], control_points[:,1], 'ro-', label='Control Points')
plt.xlabel('X axis')
plt.ylabel('Y axis')
plt.title('Quadratic Bezier Curve')
plt.legend()
plt.show()

繪制多條曲線

import matplotlib.pyplot as plt
import numpy as np
# 生成數據
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
plt.figure(figsize=(8, 3))
# 繪制第一條曲線(正弦曲線)
plt.plot(x, y1, label='sin(x)', color='blue')
# 繪制第二條曲線(餘弦曲線)
plt.plot(x, y2, label='cos(x)', color='red')
# 添加圖例
plt.legend()
# 添加標題和標簽
plt.title('Two Curves in One Plot')
plt.xlabel('x axis')
plt.ylabel('y axis')
# 顯示圖表
plt.show()

繪制雙Y軸的曲線圖

在Matplotlib中,我們可以使用twinx方法創建一個共享 x 軸但是擁有不同 y 軸的圖表。

import matplotlib.pyplot as plt
import numpy as np
# 生成數據
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.exp(-x/3) * 2
# 創建圖表和第一個 y 軸
fig, ax1 = plt.subplots()
# 繪制第一條曲線(正弦曲線)與第一個 y 軸
ax1.plot(x, y1, 'g-', label='sin(x)')
ax1.set_xlabel('x axis')
ax1.set_ylabel('sin(x)', color='g')
ax1.tick_params('y', colors='g')
# 創建共享 x 軸的第二個 y 軸
ax2 = ax1.twinx()
# 繪制第二條曲線(指數衰減曲線)與第二個 y 軸
ax2.plot(x, y2, 'b--', label='exp(-x/3)')
ax2.set_ylabel('exp(-x/3)', color='b')
ax2.tick_params('y', colors='b')
# 添加圖例
ax1.legend(loc='upper left')
ax2.legend(loc='upper right')
# 添加標題
plt.title('Double Y Axis Example')
# 顯示圖表
plt.show()

Matplotlib中的高級用法

子圖的繪制

使用 plt.subplots 可以創建含有多個子圖的圖表佈局。

import matplotlib.pyplot as plt
# 創建一個 2x2 子圖佈局
fig, axs = plt.subplots(2, 2, figsize=(6, 4))
# 子圖1
axs[0, 0].plot([1, 2, 3], [1, 2, 3])
axs[0, 0].set_title('Subplot 1')
# 子圖2
axs[0, 1].bar([1, 2, 3], [3, 2, 1])
axs[0, 1].set_title('Subplot 2')
# 子圖3
axs[1, 0].scatter([1, 2, 3], [3, 1, 2])
axs[1, 0].set_title('Subplot 3')
# 子圖4
axs[1, 1].pie([1, 2, 3])
axs[1, 1].set_title('Subplot 4')
# 調整子圖佈局
plt.tight_layout()
plt.show()

在圖中添加註釋和箭頭

我們可以使用 annotate 這個方法在圖表中添加註釋和箭頭來高亮顯示特定的數據點。

import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.figure(figsize=(8, 3))
plt.plot(x, y)
plt.annotate('Local Max', xy=(np.pi/2, 1), xytext=(np.pi/2 1, 1.5),
             arrowprops=dict(facecolor='red', shrink=0.05))
plt.title('Plot with Annotation')
plt.show()

在圖中使用樣式

Matplotlib提供了多種預設的樣式,可以通過一行代碼改變圖表的外觀。

import matplotlib.pyplot as plt
import numpy as np
plt.style.use('ggplot')  # 使用 'ggplot' 風格
plt.figure(figsize=(8, 3))
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y)
plt.title('Styled Plot')
plt.show()

繪制三維圖

我們可以使用 mpl_toolkits.mplot3d 模塊創建三維圖表。

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
x, y = np.meshgrid(x, y)
z = np.sin(np.sqrt(x**2   y**2))
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(x, y, z, cmap='viridis')
plt.title('3D Surface Plot')
plt.show()

自定義圖中的刻度

Matplotlib 提供了靈活的方式來自定義刻度,包括位置和格式。

import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.figure(figsize=(8, 3))
plt.plot(x, y)
plt.title('Custom Ticks')
# 設置 x 軸主刻度為 π 的倍數
plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(base=np.pi))
plt.gca().xaxis.set_major_formatter(ticker.FuncFormatter(lambda val, pos: '{:.0g}π'.format(val/np.pi) if val !=0 else '0'))
plt.show()


小夥伴們有哪些想了解的功能和軟件,可以給我留言哈,我盡量利用業餘時間整理出來,行程一個系列。在Python進階的道路上,讓我們加速⏩前進哈!