一次性掌握所有 Python 畫圖基礎操作

pythonpython 畫圖介紹

本文以實用爲第一目標,保證讀者在看完此文之後可以迅速上手 pythonpython 畫圖,掌握所有畫圖的基本技巧。

庫加載

我們使用 matplotlib 來進行 pythonpython 畫圖,具體的庫加載以及初始設置代碼如下所示。

import numpy as np	# 加載數學庫用於函數描述
import matplotlib
import matplotlib.pyplot as plt
from matplotlib import style

matplotlib.rcParams['text.usetex'] = True  # 開啓Latex風格
plt.figure(figsize=(10, 10), dpi=70)  # 設置圖像大小
# style.use('ggplot')  # 加載'ggplot'風格
# f, ax = plt.subplots(1, 3)  # 設置子圖

每一段代碼都有註釋,可以根據註釋把握每行代碼的內容。看不懂也沒有關係,先把代碼加上,繼續往下看即可。

pythonpython 畫圖的原理

其實原理非常簡單,就是給出一個橫座標的 listlist,再給出一個對應的縱座標 listlist,然後設置點大小、點外框大小、線大小、點顏色、線顏色、點形狀、線形狀、標題、標籤即可。設置部分的內容看起來很多,但其實也可以不用設置,不設置就代表使用默認的大小、形狀以及顏色。

除此之外,畫圖最主要的分類就是畫點還是將點連線,如果使用 scatter 函數,則將散點畫在圖中;如果使用 plot 函數,則會將散點連線,在下文中,讀者將會更深刻地感受到這一點。

圖像加載

# plt.tight_layout() # 當有多個子圖時,可以使用該語句保證各子圖標題不會重疊
# plt.savefig('myplot1.pdf', dpi=700) # dpi 表示以高分辨率保存一個圖片文件,pdf爲文件格式,輸出位圖文件
plt.show() # 渲染圖片

上述的代碼中主要就是 plt.show() 語句,其餘語句都是一些其餘設置,看註釋即可明白。

畫圖分類

python 中畫圖主要分爲下述幾類。

  • 畫單點
  • 畫散點
  • 畫散點連線
  • 畫函數

主要涉及到的一些 操作 分爲下述幾類。

  • 子圖
  • 設置橫縱座標範圍
  • 圖像標題
  • 圖像中畫圖類型的標籤

畫單點

畫單點比較簡單,給出下述代碼以及返回結果即可掌握。(需要加入最開頭給出的初始設置內容)

def main():
    X = 1
    Y = 100
    plt.scatter(X, Y, s=50)	// s爲點大小
    plt.show()

Alt
上圖是加載了 style.use('ggplot') 該風格後的效果,如果去掉該行,輸出將如下所示。
在這裏插入圖片描述
讀者可以根據自己的喜好選擇該風格,也可以去搜索其他的風格,下文接下來的示例將均使用 'ggplot' 風格進行展示。


畫散點

知道了畫單點的方法之後,畫散點就變得非常簡單,因爲我們只需要將單點中傳入的單變量改成一個 listlist 即可,具體代碼和效果如下所示。

def main():
    X, Y = [], []
    for i in range(1, 10):
        X.append(i)
        Y.append(np.sin(i))
    plt.scatter(X, Y, s=50)
    plt.show()

在這裏插入圖片描述


散點連線

只有散點,通常會使得圖像變得不夠直觀,因此我們使用 plot 函數將所有散點連在一起,具體操作如下所示。

def main():
    X, Y = [], []
    for i in range(1, 10):
        X.append(i)
        Y.append(np.sin(i))
    plt.scatter(X, Y, s=50)
    plt.show()

在這裏插入圖片描述

我們也可以對 plot 函數進行設置,即可輸出如下所示圖形。

def main():
    X, Y = [], []
    for i in range(1, 10):
        X.append(i)
        Y.append(np.sin(i))
    plt.plot(X, Y, '-p', color='grey',
        marker = 'o',
        markersize=8, linewidth=2,
        markerfacecolor='red',
        markeredgecolor='grey',
        markeredgewidth=2)
    plt.show()

在這裏插入圖片描述
可以看到我們對於點大小、顏色、點外框顏色、大小以及線顏色、線寬均進行了設置,讀者可以自行選擇設置選項進行嘗試。


畫函數

儘管散點連線了,但是由於散點的密度不夠大,因此我們可以進一步的使用
只有散點,通常會使得圖像變得不夠直觀,因此我們使用 plot 函數將所有散點連在一起,具體操作如下所示。

def main():
    X = np.linspace(1, 10, 100)	# 將[1,10]區間均分爲100個點,得到100個橫座標
    Y = np.sin(X) # 求出100個點的縱座標
    plt.plot(X, Y, color="red", linewidth=1.0, linestyle="-") # 將100個散點連在一起
    plt.show()

在這裏插入圖片描述

線條形狀、顏色、標籤

在畫函數中我們可以設置線條形狀 linestyle 、線條寬度 linewidth 以及線條顏色 color。我們接下來介紹常見的幾種線條形狀以及如何給線條加上標籤,並給出具體的代碼供讀者參考。

def main():
    X = np.linspace(1, 10, 100)
    Y1 = np.sin(X)
    Y2 = np.cos(X)
    Y3 = -X
    Y4 = X
    plt.plot(X, Y1, color="lightcoral", linewidth=3.0, linestyle="-", label="-")
    plt.plot(X, Y2, color="burlywood", linewidth=3.0, linestyle="--", label="--")
    plt.plot(X, Y3, color="mediumturquoise", linewidth=3.0, linestyle="-.", label="-.")
    plt.plot(X, Y4, color="mediumpurple", linewidth=3.0, linestyle=":", label=":")
    plt.legend(loc="best") # 把標籤加載到圖中哪個位置
    plt.show()

常見的 linestyle 還有 '-', '--', '-.', ':', 'solid', 'dashed', 'dashdot', 'dotted',讀者可以自行嘗試。
常見的 legendloc 位置還有 best, upper right, upper left, lower left, lower right, right, center left, center right, lower center, upper center, center,其中 best 表示將標籤加載到 python 認爲最佳的位置。
在這裏插入圖片描述

支持 Latex 的標籤

由於是函數作圖,因此我們通常會將標籤設置爲線條所代表的函數值,因此我們需要介紹支持 Latex 的標籤。我們將 label 的數值設置爲 r'$x_n$' 即可支持 LatexLatex,如下圖所示。

def main():
    X = np.linspace(0, 1, 100)
    Y1 = np.sqrt(X)
    Y2 = X
    Y3 = X * X
    Y4 = X * X * X
    plt.plot(X, Y1, color="lightcoral", linewidth=3.0, linestyle="-", label=r"$y_1=\sqrt{x}$")
    plt.plot(X, Y2, color="burlywood", linewidth=3.0, linestyle="--", label=r"$y_2=x$")
    plt.plot(X, Y3, color="mediumturquoise", linewidth=3.0, linestyle="-.", label=r"$y_3=x^2$")
    plt.plot(X, Y4, color="mediumpurple", linewidth=3.0, linestyle=":", label=r"$y_4=x^3$")
    plt.legend(loc="best")
    plt.show()

在這裏插入圖片描述

設置橫縱座標標號以及圖像標題

最後我們需要介紹如何給該圖像設置橫縱座標、範圍以及標題。我們首先不設置範圍,則具體代碼以及輸出圖形如下。

def main():
    X = np.linspace(0, 1, 100)
    Y1 = np.sqrt(X)
    Y2 = X
    Y3 = X * X
    Y4 = X * X * X
    plt.plot(X, Y1, color="lightcoral", linewidth=3.0, linestyle="-", label=r"$y_1=\sqrt{x}$")
    plt.plot(X, Y2, color="burlywood", linewidth=3.0, linestyle="--", label=r"$y_2=x$")
    plt.plot(X, Y3, color="mediumturquoise", linewidth=3.0, linestyle="-.", label=r"$y_3=x^2$")
    plt.plot(X, Y4, color="mediumpurple", linewidth=3.0, linestyle=":", label=r"$y_4=x^3$")
    plt.legend(loc="best")

    # x、y座標以及標題
    plt.xlabel('x', fontsize=18)
    plt.ylabel('y', fontsize=18)
    plt.title(r'$f(x)=\sqrt{x},x,x^2,x^3$', fontsize=18)
    plt.show()

在這裏插入圖片描述

設置橫縱座標的範圍

有的時候我們會覺得系統默認的橫縱座標範圍不合適,因此我們需要自行設置橫縱座標,具體代碼以及結果如下所示。

def main():
    X = np.linspace(0, 2, 100)
    Y1 = np.sqrt(X)
    Y2 = X
    Y3 = X * X
    Y4 = X * X * X
    plt.plot(X, Y1, color="lightcoral", linewidth=3.0, linestyle="-", label=r"$y_1=\sqrt{x}$")
    plt.plot(X, Y2, color="burlywood", linewidth=3.0, linestyle="--", label=r"$y_2=x$")
    plt.plot(X, Y3, color="mediumturquoise", linewidth=3.0, linestyle="-.", label=r"$y_3=x^2$")
    plt.plot(X, Y4, color="mediumpurple", linewidth=3.0, linestyle=":", label=r"$y_4=x^3$")
    plt.legend(loc="best")

    # x、y座標以及標題
    plt.xlabel('x', fontsize=18)
    plt.ylabel('y', fontsize=18)
    plt.title(r'$f(x)=\sqrt{x},x,x^2,x^3$', fontsize=18)

    # 設置座標範圍
    plt.ylim(-1, 4)
    plt.xlim(-1, 4)
    plt.show()

在這裏插入圖片描述

給函數中的一個點標號

當函數比較複雜的時候,我們往往需要對關鍵點進行標號,通常使用的方式是加箭頭或者不加,我們先給出加箭頭的代碼以及結果。

def main():
    X = np.linspace(0, 1, 100)
    Y1 = np.sqrt(X)
    Y2 = X
    Y3 = X * X
    Y4 = X * X * X
    plt.plot(X, Y1, color="lightcoral", linewidth=3.0, linestyle="-", label=r"$y_1=\sqrt{x}$")
    plt.plot(X, Y2, color="burlywood", linewidth=3.0, linestyle="--", label=r"$y_2=x$")
    plt.plot(X, Y3, color="mediumturquoise", linewidth=3.0, linestyle="-.", label=r"$y_3=x^2$")
    plt.plot(X, Y4, color="mediumpurple", linewidth=3.0, linestyle=":", label=r"$y_4=x^3$")
    plt.legend(loc="best")

    # x、y座標以及標題
    plt.xlabel('x', fontsize=18)
    plt.ylabel('y', fontsize=18)
    plt.title(r'$f(x)=\sqrt{x},x,x^2,x^3$', fontsize=18)

	# 關鍵點標號
    plt.scatter(1, 1, s=100)
    plt.ylim(-1, 2)
    plt.annotate('End Point', fontsize=20,
                 xy=(1, 1), xycoords='data',
                 xytext=(0.8, 0.95), textcoords='axes fraction',
                 arrowprops=dict(facecolor='black', shrink=0.1),
                 horizontalalignment='right', verticalalignment='top')
    plt.show()

其中 xy(1,1) 表示關鍵點的位置,xycoords='data' 表示關鍵點座標所採用的座標方式, shrink 參數表示箭頭距離關鍵點的距離,horizontalalignment='right', verticalalignment='top' 均表示註釋的位置。
在這裏插入圖片描述
也可以使用不加箭頭的方式,即將上述 annotate 換成下述代碼即可。

	# 關鍵點標號
	plt.scatter(1, 1, s=100)
	plt.ylim(-0.1, 1.3)
	plt.xlim(-0.1, 1.3)
	plt.annotate("End Point",
	             xy=(1.05, 1.05),
	             fontsize=20,
	             xycoords="data")

在這裏插入圖片描述

色卡

當繪製多個函數時,會發現顏色的設計非常難把握,因此下圖給出一張色卡供顏色選擇。
在這裏插入圖片描述


子圖

最後是如何用 python 畫子圖,其實畫子圖就是將上述的 pltplt 換成 axax,具體操作的思路與之前的操作並沒有太大的區別,接下來給出一個包含橫縱座標、函數座標、標題的完整子圖代碼,讀者可以從代碼中獲取相應操作的代碼。

在這裏插入圖片描述

import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from matplotlib import style

style.use('ggplot')  # 加載'ggplot'風格
matplotlib.rcParams['text.usetex'] = True  # 開啓Latex風格
plt.figure(figsize=(10, 10), dpi=70)  # 設置圖像大小
f, ax = plt.subplots(2, 2)  # 設置子圖


def func1():
    X = np.linspace(0, 1, 100)
    Y1 = np.sqrt(X)
    # ax[0][0]的設置
    ax[0][0].plot(X, Y1, color="lightcoral", linewidth=3.0, linestyle="-", label=r"$y_1=\sqrt{x}$")
    ax[0][0].set_xlabel('x', fontsize=10)
    ax[0][0].set_ylabel('y', fontsize=10)
    ax[0][0].set_title(r'$f(x)=\sqrt{x}$', fontsize=16)
    ax[0][0].legend(loc="best")

    # ax[0][0]關鍵點
    ax[0][0].scatter(0.5, np.sqrt(0.5), s=100)
    ax[0][0].annotate("End Point",
                      xy=(0.6, 0.5),
                      fontsize=12,
                      xycoords="data")


def func2():
    X = np.linspace(0, 1, 100)
    Y2 = X
    # ax[0][1]的設置
    ax[0][1].plot(X, Y2, color="burlywood", linewidth=3.0, linestyle="--", label=r"$y_2=x$")
    ax[0][1].set_xlabel('x', fontsize=10)
    ax[0][1].set_ylabel('y', fontsize=10)
    ax[0][1].set_title(r'$f(x)=x$', fontsize=16)
    ax[0][1].legend(loc="best")

    # ax[0][1]關鍵點
    ax[0][1].scatter(0.5, 0.5, s=100)
    ax[0][1].annotate("End Point",
                      fontsize=12,
                      xytext=(0.7, 0.1),
                      xy=(0.5, 0.5),
                      xycoords="data",
                      arrowprops=dict(facecolor='gray', shrink=0.15))


def func3():
    X = np.linspace(0, 1, 100)
    Y3 = X * X
    # ax[1][0]的設置
    ax[1][0].plot(X, Y3, color="mediumturquoise", linewidth=3.0, linestyle="-.", label=r"$y_3=x^2$")
    ax[1][0].set_xlabel('x', fontsize=10)
    ax[1][0].set_ylabel('y', fontsize=10)
    ax[1][0].set_title(r'$f(x)=x^2$', fontsize=16)
    ax[1][0].legend(loc="best")

    # ax[1][0]關鍵點
    ax[1][0].scatter(0.5, 0.5 * 0.5, s=100)
    ax[1][0].annotate("End Point",
                      fontsize=12,
                      xytext=(0.05, 0.6),
                      xy=(0.5, 0.5 * 0.5),
                      xycoords="data",
                      arrowprops=dict(facecolor='black', shrink=0.1))


def func4():
    X = np.linspace(0, 1, 100)
    Y4 = X * X * X
    # ax[1][1]的設置
    ax[1][1].plot(X, Y4, color="mediumpurple", linewidth=3.0, linestyle=":", label=r"$y_4=x^3$")
    ax[1][1].set_xlabel('x', fontsize=10)
    ax[1][1].set_ylabel('y', fontsize=10)
    ax[1][1].set_title(r'$f(x)=x^3$', fontsize=16)
    ax[1][1].legend(loc="best")

    # ax[1][1]關鍵點
    ax[1][1].scatter(0.5, 0.5 * 0.5 * 0.5, s=100)
    ax[1][1].annotate("End Point",
                      xy=(0.2, 0.3),
                      fontsize=12,
                      xycoords="data")


def main():
    func1()
    func2()
    func3()
    func4()

    plt.tight_layout()  # 當有多個子圖時,可以使用該語句保證各子圖標題不會重疊
    plt.savefig('myplot1.pdf', dpi=700)  # dpi 表示以高分辨率保存一個圖片文件,pdf爲文件格式,輸出位圖文件
    plt.show()


if __name__ == "__main__":
    main()


後記

上述所涉及的內容即爲 pythonpython 應用 matplotlib 畫圖的基本操作了,如果想要進一步的深化畫圖能力,推薦根據需求在 matplotlib 官方文檔 中進行搜索。祝大家在 python 畫圖的路上更進一步!💪💪💪

發佈了240 篇原創文章 · 獲贊 94 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章