python?matplotlib繪圖詳解大全(非常詳細!)
一、圖形繪制大全
1.1 2D圖形繪制
1.1.1 繪制單線圖形
通過定義隊列繪制單線圖:
scale = range(100) x = [(2 * math.pi * i) / len(scale) for i in scale] y = [math.cos(i) for i in x] plt.plot(x, y) plt.show()
Matplotlib
使用的數(shù)據(jù)可以有不同來源,接下來,我們以使用 Numpy
獲取的數(shù)據(jù)為例,繪制 [-10,10]
區(qū)間內(nèi)的曲線,如以下:
x = np.linspace(-10, 10, 800) y = x ** 3 + 5 * x - 10 plt.plot(x, y) plt.show()
plot()
的用法如下:
pythonCopy code plot(x, y, linestyle=None, marker=None, color=None, label=None, **kwargs)
其中,參數(shù)的含義如下:
x
: 一維數(shù)組或列表,表示數(shù)據(jù)點在X軸上的位置。y
: 一維數(shù)組或列表,表示數(shù)據(jù)點在Y軸上的位置。linestyle
: (可選參數(shù)) 字符串,表示線條的樣式。默認值為None,表示使用默認的線條樣式。你可以指定不同的線條樣式,如實線('-')、虛線('--')、點劃線('-.')、點線(':')等。marker
: (可選參數(shù)) 字符串,表示數(shù)據(jù)點的標記類型。默認值為None,表示不顯示數(shù)據(jù)點的標記。你可以指定不同的標記類型,如圓圈('o')、方塊('s')、三角形('^')等。color
: (可選參數(shù)) 字符串,表示線條和標記的顏色。默認值為None,表示使用默認的顏色。你可以使用顏色字符串,如'red'、'blue'、'green'等,也可以使用縮寫顏色字符串,如'r'、'b'、'g'等。label
: (可選參數(shù)) 字符串,表示線條的標簽。默認值為None。當你想為繪制的線條添加圖例時,可以設(shè)置此標簽。**kwargs
: (可選參數(shù)) 這是一些可選的關(guān)鍵字參數(shù),用于配置線條的其他屬性,比如線條寬度、透明度等。
通過傳遞 x
和 y
的數(shù)據(jù),你可以使用 plot()
方法繪制一條線。 linestyle
參數(shù)可選,用于控制線條樣式; marker
參數(shù)可選,用于顯示數(shù)據(jù)點的標記; color
參數(shù)可選,用于指定線條和標記的顏色; label
參數(shù)可選,用于添加線條的標簽,用于圖例顯示。
繪制多條線時,可以多次調(diào)用 plot()
方法,每次傳遞不同的 x
和 y
數(shù)據(jù),并根據(jù)需要設(shè)置不同的樣式和顏色。當繪制多條線時,你可以使用 label
參數(shù)為每條線添加標簽,然后使用 plt.legend()
來顯示圖例。
1.1.2 繪制多線圖
很多時候需要對比多組數(shù)據(jù),以發(fā)現(xiàn)數(shù)據(jù)間的異同,此時就需要在一張圖片上繪制多條曲線——多曲線圖,示例如下:
#繪制多線圖 x = np.linspace(0.1, 2 * np.pi, 100) y_1 = x y_2 = np.square(x) y_3 = np.log(x) y_4 = np.sin(x) plt.plot(x,y_1) plt.plot(x,y_2) plt.plot(x,y_3) plt.plot(x,y_4) plt.show()
一條曲線的繪制需要調(diào)用一次 plt.plot()
,而 plt.show()
只需調(diào)用一次。這種延遲呈現(xiàn)機制是 Matplotlib
的關(guān)鍵特性,我們可以在代碼中的任何地方調(diào)用繪圖函數(shù),但只有在調(diào)用 plt.show()
時才會渲染顯示圖形。
比如:
def plot_func(x, y): x_s = x[1:] - y[:-1] y_s = y[1:] - x[:-1] plt.plot(x[1:], x_s / y_s) x = np.linspace(-5, 5, 200) y = np.exp(-x ** 2) plt.plot(x, y) plot_func(x, y) plt.show()
盡管其中一個 plt.plot()
是在 plot_func
函數(shù)中調(diào)用的,它對圖形的呈現(xiàn)沒有任何影響,因為 plt.plot()
只是聲明了我們要呈現(xiàn)的內(nèi)容,但還沒有執(zhí)行渲染。因此可以使用延遲呈現(xiàn)特性結(jié)合 for
循環(huán)、條件判斷等語法完成復(fù)雜圖形的繪制,同時也可以在同一張圖中組合不同類型的統(tǒng)計圖。
1.1.3 讀取文件中的數(shù)據(jù)繪制圖形
很多情況下數(shù)據(jù)都是存儲于文件中,因此,需要首先讀取文件中的數(shù)據(jù),再進行繪制,說明起見,以 .txt
文件為例,其他諸如 Excel
、 CSV文件
等同樣可以進行讀取,并用于可視化繪制。
例如:
x, y = [], [] for line in open('data.txt', 'r'): values = [float(s) for s in line.split()] x.append(values[0]) y.append(values[1]) plt.plot(x, y) plt.show()
1.1.4 繪制散點圖
scatter方法通常是由數(shù)據(jù)可視化庫(如Matplotlib或Seaborn)提供的一個函數(shù),用于繪制散點圖:
Matplotlib中scatter方法的參數(shù)和用法:
matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, edgecolors=None)
參數(shù)解釋:
x
:橫坐標數(shù)據(jù),是一個數(shù)組或Series,用于表示散點圖中每個點的橫坐標位置。y
:縱坐標數(shù)據(jù),是一個數(shù)組或Series,用于表示散點圖中每個點的縱坐標位置。s
:點的大小,可以是一個數(shù)值或數(shù)組,控制散點的大小。默認值為None
,表示使用默認點大小。c
:點的顏色,可以是一個顏色字符串、顏色列表或數(shù)組,用于控制散點的顏色。默認值為None
,表示使用默認顏色。marker
:點的標記樣式,可以是一個標記字符串,例如 'o' 表示圓點,'s' 表示方塊等。默認值為None
,表示使用默認標記樣式。cmap
:用于指定顏色映射的Colormap對象或字符串。它在指定c參數(shù)為數(shù)值時使用,將數(shù)值映射到顏色空間。默認值為None
,表示使用默認顏色映射。norm
:用于歸一化數(shù)據(jù)的Normalize對象。它在指定c參數(shù)為數(shù)值時使用。默認值為None
,表示使用默認的歸一化方式。vmin
和vmax
:用于設(shè)置顏色映射范圍的最小值和最大值。它們在指定c參數(shù)為數(shù)值時使用。默認值為None
,表示使用數(shù)據(jù)的最小值和最大值作為范圍。alpha
:點的透明度,取值范圍為 [0, 1],其中 0 表示完全透明,1 表示完全不透明。默認值為None
,表示使用默認透明度。linewidths
:點邊界的寬度,用于控制點的邊界線寬度。默認值為None
,表示使用默認線寬。edgecolors
:點邊界的顏色,用于控制點的邊界線顏色。默認值為None
,表示使用默認顏色。
data = np.random.rand(1000, 2) ?#1000行、2列的隨機數(shù)數(shù)組,符合均勻分布 plt.scatter(data[:,0], data[:,1]) plt.show()
1.1.5 繪制條形圖
條形圖具有豐富的表現(xiàn)形式,常見的類型包括單組條形圖,多組條形圖,堆積條形圖和對稱條形圖等
1.1.5.1 單條條形圖
條形圖的每種表現(xiàn)形式都可以繪制成垂直條形圖或水平條形圖。
1、垂直條形圖
plt.bar
是Matplotlib庫中用于繪制條形圖的方法。它可以將數(shù)據(jù)以條形的形式展示,非常適合用于顯示不同類別或組之間的比較。
使用 plt.bar
的一般語法如下:
pythonCopy code plt.bar(x, height, width=0.8, align='center', **kwargs)
其中,參數(shù)的意義如下:
x
: 這是一個可迭代對象,通常是一個列表或數(shù)組,用于指定條形圖的橫坐標位置。每個元素表示一個條形的橫坐標位置。height
: 這是一個可迭代對象,通常是一個列表或數(shù)組,用于指定條形圖的高度或長度。每個元素表示一個條形的高度。width
: (可選參數(shù)) 這是一個標量或一個可迭代對象,用于指定條形的寬度。默認值為0.8,表示每個條形的寬度為0.8個單位。如果想要自定義每個條形的寬度,可以傳遞一個標量值或一個與x
和height
長度相同的可迭代對象。align
: (可選參數(shù)) 這是一個字符串,用于指定條形的對齊方式。默認值是'center'
,表示條形在橫坐標上居中對齊。其他可能的取值有'edge'
表示條形以橫坐標左邊緣對齊,或'align'
表示條形以橫坐標右邊緣對齊。**kwargs
: (可選參數(shù)) 這是一些可選的關(guān)鍵字參數(shù),用于配置條形圖的其他屬性,比如顏色、標簽、透明度等。例如,可以使用color
參數(shù)來指定條形的顏色,label
參數(shù)來為條形添加標簽等。
一旦調(diào)用了 plt.bar
來繪制條形圖,可以使用 plt.xlabel
、 plt.ylabel
、 plt.title
等方法來添加坐標軸標簽和圖標題,以及其他Matplotlib方法來美化圖形。
data = [10., 20., 5., 15.] plt.bar(range(len(data)), data, width=0.5) plt.show()
2、水平條形圖
如果更喜歡水平條形外觀,就可以使用 plt.barh()
函數(shù),在用法方面與 plt.bar()
基本相同,但是修改條形寬度(或者在水平條形圖中應(yīng)該稱為高度),需要使用參數(shù) height
:
下面是 plt.barh()
方法的一般語法:
plt.barh(y, width, height=0.8, left=None, **kwargs)
其中,參數(shù)的意義如下:
y
: 這是一個可迭代對象,通常是一個列表或數(shù)組,用于指定條形圖的縱坐標位置。每個元素表示一個條形的縱坐標位置。width
: 這是一個可迭代對象,通常是一個列表或數(shù)組,用于指定條形圖的寬度或長度。每個元素表示一個條形的寬度。height
: (可選參數(shù)) 這是一個標量或一個可迭代對象,用于指定條形的高度。默認值為0.8,表示每個條形的高度為0.8個單位。如果想要自定義每個條形的高度,可以傳遞一個標量值或一個與y
和width
長度相同的可迭代對象。left
: (可選參數(shù)) 這是一個標量或一個可迭代對象,用于指定條形的起始值。默認值為None,表示每個條形從0開始。如果要實現(xiàn)堆積效果,可以通過left
參數(shù)指定每個條形的起始值。**kwargs
: (可選參數(shù)) 這是一些可選的關(guān)鍵字參數(shù),用于配置條形圖的其他屬性,比如顏色、標簽、透明度等。
data = [10., 20., 5., 15.] plt.barh(range(len(data)), data, height=0.5) plt.show()
1.1.5.2 多組條形圖
當出現(xiàn)比較的情況時,可以繪制多組條形圖:
data = [[10., 20., 30., 20.],[40., 25., 53., 18.],[6., 22., 52., 19.]] x = np.arange(4) plt.bar(x + 0.00, data[0], color = 'b', width = 0.25) plt.bar(x + 0.25, data[1], color = 'g', width = 0.25) plt.bar(x + 0.50, data[2], color = 'r', width = 0.25) plt.show()
同理,使用barh方法繪制多組水平條形圖:
data = [[10., 20., 30., 20.],[40., 25., 53., 18.],[6., 22., 52., 19.]] x = np.arange(4) plt.barh(x + 0.00, data[0], color = 'b', height = 0.25) plt.barh(x + 0.25, data[1], color = 'g', height = 0.25) plt.barh(x + 0.50, data[2], color = 'r', height = 0.25) plt.show()
1.1.5.3 堆積條形圖
通過使用 plt.bar()
函數(shù)中的可選參數(shù),可以繪制堆積條形圖, plt.bar()
函數(shù)的可選參數(shù) bottom
允許指定條形圖的起始值。
y_1 = [3., 25., 45., 22.] y_2 = [6., 25., 50., 25.] x = range(4) plt.bar(x, y_1, color = 'b') plt.bar(x, y_2, color = 'r', bottom = y_1) plt.show()
如果想要繪制水平的堆積條形圖,則需要使用left來指定其實位置:
y_1 = [3., 25., 45., 22.] y_2 = [6., 25., 50., 25.] x = range(4) ? # # 對y_1和y_2進行累加 # y_1_cumsum = np.cumsum(y_1) # y_2_cumsum = np.cumsum(y_2) ? plt.barh(x, y_1, color='b', label='y_1') plt.barh(x, y_2, color='r', left=y_1, label='y_2') ? plt.legend() plt.show()
可以結(jié)合 for
循環(huán),利用延遲呈現(xiàn)機制可以堆疊更多的條形:
data = np.array([[5., 30., 45., 22.], [5., 25., 50., 20.], [1., 2., 1., 1.]]) x = np.arange(data.shape[1]) for i in range(data.shape[0]): plt.bar(x, data[i], bottom = np.sum(data[:i], axis = 0)) plt.show()
1.1.5.4 對稱條形圖
當我們想要繪制不同年齡段的男性與女性數(shù)量的對比時,一個簡單且有用的技巧是對稱繪制兩個條形圖:
w_pop = np.array([5., 30., 45., 22.]) m_pop = np.array( [5., 25., 50., 20.]) x = np.arange(4) plt.barh(x, w_pop) plt.barh(x, -m_pop) plt.show()
1.1.4 餅圖
餅圖可以用于對比數(shù)量間的相對關(guān)系, plt.pie()
函數(shù)將一系列值作為輸入,將值傳遞給 Matplolib
,它就會自動計算各個值在餅圖中的相對面積,并進行繪制:
使用 plt.pie()
的一般語法如下:
pythonCopy code plt.pie(x, explode=None, labels=None, colors=None, autopct=None, shadow=False, startangle=0, **kwargs)
其中,參數(shù)的意義如下:
x
: 這是一個1維數(shù)組或列表,表示各個部分的數(shù)據(jù)值。這些數(shù)據(jù)值將用于計算各個部分所占的比例,并繪制餅圖。explode
: (可選參數(shù)) 這是一個1維數(shù)組或列表,用于指定是否將某些部分從餅圖中分離出來。默認值為None,表示不進行分離。如果要分離某些部分,可以傳遞一個與x
長度相同的數(shù)組,其中數(shù)值大于0表示分離的距離。labels
: (可選參數(shù)) 這是一個1維數(shù)組或列表,用于指定餅圖中每個部分的標簽。默認值為None,表示不顯示標簽。如果要顯示標簽,可以傳遞一個與x
長度相同的數(shù)組,其中包含各個部分的標簽文本。colors
: (可選參數(shù)) 這是一個1維數(shù)組或列表,用于指定餅圖中每個部分的顏色。默認值為None,表示使用默認的顏色循環(huán)。如果要自定義顏色,可以傳遞一個與x
長度相同的數(shù)組,其中包含各個部分的顏色。autopct
: (可選參數(shù)) 這是一個字符串或函數(shù),用于顯示各個部分所占的百分比。默認值為None,表示不顯示百分比。如果傳遞一個字符串,比如'%1.1f%%'
,將顯示小數(shù)點后一位的百分比。如果傳遞一個函數(shù),該函數(shù)將接收一個數(shù)值作為參數(shù),并返回一個字符串用于顯示百分比。shadow
: (可選參數(shù)) 這是一個布爾值,用于指定是否在餅圖下方添加陰影。默認值為False,表示不添加陰影。startangle
: (可選參數(shù)) 這是一個標量,用于指定餅圖的起始角度。默認值為0,表示從0度角開始繪制餅圖,逆時針方向。**kwargs
: (可選參數(shù)) 這是一些可選的關(guān)鍵字參數(shù),用于配置餅圖的其他屬性,比如邊界線寬度、邊界線顏色等。
一旦調(diào)用了 plt.pie()
來繪制餅圖,你可以使用 plt.axis('equal')
來保證餅圖是圓形的,使用 plt.legend()
來顯示圖例。
data = [10, 15, 30, 20] plt.pie(data,explode = [0.1,0.1,0.1,0.1],shadow=True) plt.show()
1.1.5 直方圖
直方圖是概率分布的圖形表示。事實上,直方圖只是一種特殊的條形圖。我們可以很容易地使用 Matplotlib
的條形圖函數(shù),并進行一些統(tǒng)計運算來生成直方圖。但是,鑒于直方圖的使用頻率非常高,因此 Matplotlib
提供了一個更加方便的函數(shù)—— plt.hist()
。 plt.hist()
函數(shù)的作用是:獲取一系列值作為輸入。值的范圍將被劃分為大小相等的范圍(默認情況下數(shù)量為 10
),然后生成條形圖,一個范圍對應(yīng)一個條柱,一個條柱的高度是相應(yīng)范圍內(nèi)中的值的數(shù)量,條柱的數(shù)量由可選參數(shù) bins
確定。
使用 plt.hist()
的一般語法如下:
pythonCopy code plt.hist(x, bins=None, range=None, density=False, cumulative=False, color=None, edgecolor=None, **kwargs)
其中,參數(shù)的意義如下:
x
: 這是一個1維數(shù)組或列表,表示要繪制直方圖的數(shù)據(jù)。bins
: (可選參數(shù)) 這是一個整數(shù)或指定分 bin 的數(shù)組,用于控制直方圖的箱子(bin)數(shù)量和位置。默認值為None,表示使用自動選擇的箱子數(shù)量??梢詡鬟f一個整數(shù)值來指定箱子數(shù)量,或者傳遞一個數(shù)組來指定具體的箱子邊界。range
: (可選參數(shù)) 這是一個元組或列表,用于指定直方圖的數(shù)據(jù)范圍。默認值為None,表示使用整個數(shù)據(jù)的范圍。可以傳遞一個元組或列表,如(min_value, max_value)
,來限制直方圖顯示的數(shù)據(jù)范圍。density
: (可選參數(shù)) 這是一個布爾值,用于指定是否對直方圖進行標準化。默認值為False,表示直方圖顯示的是原始數(shù)據(jù)的頻數(shù)。如果設(shè)置為True,直方圖將顯示相對頻率,使得直方圖的面積總和為1。cumulative
: (可選參數(shù)) 這是一個布爾值,用于指定是否繪制累積直方圖。默認值為False,表示繪制原始直方圖。如果設(shè)置為True,將繪制累積直方圖,即顯示每個箱子內(nèi)數(shù)據(jù)的累積數(shù)量。color
: (可選參數(shù)) 這是一個字符串或顏色代碼,用于指定直方圖的填充顏色。edgecolor
: (可選參數(shù)) 這是一個字符串或顏色代碼,用于指定直方圖的邊界線顏色。**kwargs
: (可選參數(shù)) 這是一些可選的關(guān)鍵字參數(shù),用于配置直方圖的其他屬性,比如透明度、標簽等。
一旦調(diào)用了 plt.hist()
來繪制直方圖,你可以使用 plt.xlabel()
、 plt.ylabel()
和 plt.title()
等方法來添加坐標軸標簽和圖標題,使用 plt.legend()
來顯示圖例,
data1 = np.random.rand(1024) plt.hist(data1, bins=10, alpha=0.6, label='Data 1', histtype='bar', rwidth=0.8) plt.xlabel('Value') plt.ylabel('Frequency') plt.title('Histogram with Gap between Bars') plt.legend() plt.show()
如果要在繪制多個直方圖時,讓它們之間有間距,可以使用 plt.hist()
方法的 histtype
參數(shù)。 histtype
參數(shù)用于指定直方圖的類型,包括'bar'(默認)、'barstacked'和'step'等。
對于繪制多個直方圖,并希望它們之間有間距,可以選擇使用'bar'或'barstacked'類型,并將 alpha
參數(shù)設(shè)置為小于1的值,從而使得直方圖之間透明,從而呈現(xiàn)出間距的效果。
在上面的代碼中,使用了 histtype='bar'
和 alpha=0.6
參數(shù)來設(shè)置直方圖類型為'bar'并使得直方圖之間有間距。同時,我們還設(shè)置了 rwidth=0.8
來控制直方圖的寬度,以使得直方圖在水平方向上有間距。
1.1.6 箱形圖
箱線圖將會顯示數(shù)據(jù)的五數(shù)概括:最小值、下四分位數(shù)、中位數(shù)、上四分位數(shù)、最大值,以及可能的異常值。
使用 plt.boxplot(data)
的一般語法如下:
plt.boxplot(data, notch=None, sym=None, vert=None, whis=None, positions=None, widths=None, patch_artist=None, **kwargs)
其中,參數(shù)的意義如下:
data
: 這是一個列表、數(shù)組或多個列表/數(shù)組的組合,表示要繪制箱線圖的數(shù)據(jù)集??梢詡鬟f一個列表或數(shù)組,也可以傳遞多個列表或數(shù)組組成的組合,用于在同一個圖中繪制多個箱線圖。notch
: (可選參數(shù)) 這是一個布爾值,用于指定是否在箱線圖中繪制缺口。默認值為None,表示不繪制缺口。如果設(shè)置為True,箱線圖將帶有缺口,有助于顯示數(shù)據(jù)集的置信區(qū)間。sym
: (可選參數(shù)) 這是一個字符串,用于指定異常值的表示方式。默認值為None,表示使用'+'表示異常值??梢詡鬟f其他符號或空字符串來自定義異常值的表示。vert
: (可選參數(shù)) 這是一個布爾值,用于指定箱線圖的方向。默認值為None,表示繪制垂直箱線圖。如果設(shè)置為False,將繪制水平箱線圖。whis
: (可選參數(shù)) 這是一個標量或元組,用于指定箱線圖中須的長度。默認值為None,表示使用默認值1.5??梢詡鬟f一個標量值或一個元組(lower, upper)
,用于自定義須的長度。positions
: (可選參數(shù)) 這是一個標量或列表,用于指定箱線圖的位置。默認值為None,表示每個數(shù)據(jù)集在x軸上均勻分布??梢詡鬟f一個標量值或一個與數(shù)據(jù)集數(shù)量相同的列表,用于自定義箱線圖的位置。widths
: (可選參數(shù)) 這是一個標量或列表,用于指定箱線圖的寬度。默認值為None,表示使用默認寬度??梢詡鬟f一個標量值或一個與數(shù)據(jù)集數(shù)量相同的列表,用于自定義箱線圖的寬度。patch_artist
: (可選參數(shù)) 這是一個布爾值,用于指定是否對箱線圖的盒體使用填充顏色。默認值為None,表示不使用填充顏色。如果設(shè)置為True,箱線圖的盒體將被填充,可以通過boxprops
參數(shù)指定填充顏色和其他屬性。**kwargs
: (可選參數(shù)) 這是一些可選的關(guān)鍵字參數(shù),用于配置箱線圖的其他屬性,比如線條顏色、線條樣式等。
一旦調(diào)用了 plt.boxplot(data)
來繪制箱線圖,你可以使用 plt.xlabel()
、 plt.ylabel()
和 plt.title()
等方法來添加坐標軸標簽和圖標題,使用 plt.xticks()
和 plt.yticks()
來自定義刻度標簽
示例:
data = np.random.randn(100) # 繪制箱線圖 plt.boxplot(data) # 添加標題和標簽 plt.title('Box Plot Example') plt.ylabel('Value') # 顯示箱線圖 plt.show()
圖中黃線是分布的中位數(shù)。
方形箱框包括從下四分位數(shù)Q1到上四分位數(shù)Q3的50%的數(shù)據(jù)。
下盒須的下四分位延伸到1.5 (Q3-Q1)。
上盒須從上四分位延伸至1.5 (Q3-Q1)。
離盒須較遠的數(shù)值用圓圈標記。
要在單個圖形中繪制多個箱形圖,對每個箱形圖調(diào)用一次 plt.boxplot()
是不可行。它會將所有箱形圖畫在一起,形成一個混亂的、不可讀的圖形。如果想要到達符合要求的效果,只需在一次調(diào)用 plt.boxplot()
中,同時繪制多個箱形圖即可,如下所示:
data = np.random.randn(200, 6) #繪制圖形 plt.boxplot(data) # 添加標題和標簽 plt.title('Box Plot Example') plt.ylabel('Value') # 顯示箱線圖 plt.show()
1.2 3D圖形繪制
導(dǎo)入:
from mpl_toolkits.mplot3d import Axes3D
1.2.1 3D散點圖
3D
散點圖的繪制方式與 2D
散點圖基本相同,示例如下:
a, b, c = 10., 28., 8. / 3. def lorenz_map(x, dt = 1e-2): x_dt = np.array([a * (x[1] - x[0]), x[0] * (b - x[2]) - x[1], x[0] * x[1] - c * x[2]]) return x + dt * x_dt points = np.zeros((2000, 3)) x = np.array([.1, .0, .0]) for i in range(points.shape[0]): points[i], x = x, lorenz_map(x) # Plotting fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ?# 使用add_subplot()方法創(chuàng)建三維坐標軸 ax.set_xlabel('X axis') ax.set_ylabel('Y axis') ax.set_zlabel('Z axis') ax.set_title('Lorenz Attractor a=%0.2f b=%0.2f c=%0.2f' % (a, b, c)) ax.scatter(points[:, 0], points[:, 1],points[:, 2], zdir = 'z', c = 'c') plt.show()
在Matplotlib中, scatter()
方法用于在三維坐標軸上繪制散點圖。它可以將一系列的數(shù)據(jù)點以散點的形式表示在三維空間中。
scatter()
方法的語法如下:
scatter(x, y, z, c=None, s=None, marker=None, cmap=None, **kwargs)
其中,參數(shù)的意義如下:
x
: 這是一個1維數(shù)組或列表,表示散點圖在X軸上的位置。y
: 這是一個1維數(shù)組或列表,表示散點圖在Y軸上的位置。z
: 這是一個1維數(shù)組或列表,表示散點圖在Z軸上的位置,即垂直于XY平面的位置。c
: (可選參數(shù)) 這是一個1維數(shù)組或列表,用于指定每個散點的顏色。默認值為None,表示使用默認的顏色映射。你可以傳遞一個與x
、y
和z
長度相同的數(shù)組,其中每個元素表示對應(yīng)散點的顏色。s
: (可選參數(shù)) 這是一個標量或1維數(shù)組或列表,用于指定散點的大小。默認值為None,表示使用默認的點大小。如果傳遞一個標量值,所有散點的大小將相同。如果傳遞一個與x
、y
和z
長度相同的數(shù)組,每個元素表示對應(yīng)散點的大小。marker
: (可選參數(shù)) 這是一個字符串,用于指定散點的標記類型。默認值為None,表示使用圓圈標記??梢詡鬟f其他標記類型,如's', 'o', '^'等。cmap
: (可選參數(shù)) 這是一個Colormap對象或字符串,用于指定顏色映射。默認值為None,表示使用默認的顏色映射。你可以傳遞一個Colormap對象,或者使用字符串指定常見的顏色映射,如'viridis'、'plasma'、'jet'等。zdir
是scatter()
方法中的一個可選參數(shù),用于指定在三維坐標軸上散點的投影方向。它用于控制散點在三維空間中的展示方式。在
scatter()
方法中,zdir
可以取三個值:'x'、'y'和'z'。這些值分別表示在X軸、Y軸和Z軸上展示散點的投影。當
zdir
設(shè)置為'x'時,散點在XY平面上的投影將在X軸上展示。 當zdir
設(shè)置為'y'時,散點在XZ平面上的投影將在Y軸上展示。 當zdir
設(shè)置為'z'時,散點在XY平面上的投影將在Z軸上展示。默認情況下,
zdir
的值為None,此時散點將在XY平面上展示,而不會在X、Y或Z軸上產(chǎn)生投影。**kwargs
: (可選參數(shù)) 這是一些可選的關(guān)鍵字參數(shù),用于配置散點圖的其他屬性,比如透明度、邊緣顏色等。
scatter()
方法可以在一個三維坐標軸對象上調(diào)用,通過 ax.scatter()
的形式來繪制三維散點圖。在調(diào)用 scatter()
時,將數(shù)據(jù)傳遞給 x
、 y
和 z
參數(shù),然后可以使用 c
和 s
參數(shù)來指定顏色和大小, marker
參數(shù)來指定標記類型, cmap
參數(shù)來指定顏色映射等。
繪制3D圖形的步驟:
1、首先需要導(dǎo)入 Matplotlib
的三維擴展 Axes3D
:
from mpl_toolkits.mplot3d import Axes3D
2、對于三維繪圖,需要創(chuàng)建一個 Figure
實例并附加一個 Axes3D
實例:
fig = plt.figure() ax = fig.gca(projection='3d')
gca方法已經(jīng)不能使用了,可以使用add_subplot方法:
ax = fig.add_subplot(111, projection='3d') ?# 使用add_subplot()方法創(chuàng)建三維坐標軸
3、然后帶入相應(yīng)的方法即可,這里帶入了scatter繪制散點圖:
ax.scatter(points[:, 0], points[:, 1],points[:, 2], zdir = 'z', c = 'c')
1.2.2 3D曲線圖
與在 3D
空間中繪制散點圖類似,繪制 3D
曲線圖同樣需要設(shè)置一個 Axes3D
實例,然后調(diào)用其 plot()
方法:
a, b, c = 10., 28., 8. / 3. def lorenz_map(x, dt = 1e-2): x_dt = np.array([a * (x[1] - x[0]), x[0] * (b - x[2]) - x[1], x[0] * x[1] - c * x[2]]) return x + dt * x_dt points = np.zeros((8000, 3)) x = np.array([.1, .0, .0]) for i in range(points.shape[0]): points[i], x = x, lorenz_map(x) # Plotting fig = plt.figure() ax = fig.add_subplot(projection = '3d') ax.set_xlabel('X axis') ax.set_ylabel('Y axis') ax.set_zlabel('Z axis') ax.set_title('Lorenz Attractor a=%0.2f b=%0.2f c=%0.2f' % (a, b, c)) ax.plot(points[:, 0], points[:, 1], points[:, 2], c = 'c') plt.show()
1.2.3 3D標量場
3D
繪圖方式類似與相應(yīng)的 2D
繪圖方式,但也有許多特有的三維繪圖功能,例如將二維標量場繪制為 3D
曲面, plot_surface()
方法使用 x、 y和 z 三個序列將標量場顯示為三維曲面(展示一個二維量在三維中的形狀):
x = np.linspace(-3, 3, 256) y = np.linspace(-3, 3, 256) x_grid, y_grid = np.meshgrid(x, y) #使用`np.meshgrid()`方法將一維數(shù)組`x`和`y`轉(zhuǎn)換為二維數(shù)組,得到`x_grid`和`y_grid`,用于表示XY平面上的點坐標網(wǎng)格。 print(x_grid) z = np.sinc(np.sqrt(x_grid ** 2 + y_grid ** 2)) fig = plt.figure() ax = fig.add_subplot(projection = '3d') #創(chuàng)建一個三維坐標軸對象。 ax.plot_surface(x_grid, y_grid, z, cmap=cm.viridis) #x_grid和y_grid表示XY平面上的點坐標網(wǎng)格,z表示每個點上的函數(shù)值。cmap=cm.viridis指定使用'viridis'顏色映射,用于在三維圖上表示高度的顏色。 plt.show()
plot_surface()
的用法如下:
pythonCopy code plot_surface(X, Y, Z, cmap=None, rstride=1, cstride=1, alpha=1.0, antialiased=False, **kwargs)
其中,參數(shù)的意義如下:
X
: 二維數(shù)組,表示數(shù)據(jù)在X軸上的坐標。它的形狀應(yīng)該與Z
的形狀相同。Y
: 二維數(shù)組,表示數(shù)據(jù)在Y軸上的坐標。它的形狀應(yīng)該與Z
的形狀相同。Z
: 二維數(shù)組,表示數(shù)據(jù)在三維空間中的高度或數(shù)值。它的形狀應(yīng)該與X
和Y
的形狀相同。cmap
: Colormap對象或字符串,用于指定顏色映射。默認值為None,表示使用默認的顏色映射。你可以傳遞一個Colormap對象,或者使用字符串指定常見的顏色映射,如'viridis'、'plasma'、'jet'等。rstride
: 整數(shù),表示在Z方向上采樣的步長。默認值為1,表示不進行采樣。較大的值會導(dǎo)致更少的繪制點,從而加快繪制速度,但可能會影響圖像的精細程度。cstride
: 整數(shù),表示在XY平面上采樣的步長。默認值為1,表示不進行采樣。較大的值會導(dǎo)致更少的繪制點,從而加快繪制速度,但可能會影響圖像的精細程度。alpha
: 浮點數(shù),表示表面的透明度。默認值為1.0,表示不透明。取值范圍為0.0到1.0,其中0.0表示完全透明,1.0表示完全不透明。antialiased
: 布爾值,表示是否使用抗鋸齒。默認值為False,表示不使用抗鋸齒。如果設(shè)置為True,圖像會更加平滑,但可能會增加繪制時間。色。
在繪制三維表面圖時,表面由許多小的三角形或多邊形組成,這些小形狀之間的邊緣線通常是默認顏色。通過設(shè)置
edgecolor
參數(shù),你可以控制這些邊緣線的顏色,使其與表面的顏色不同,從而增加圖形的可視化效果。edgecolor
可以接受一個顏色值的字符串或RGB元組。常用的顏色值字符串如下:'b':藍色
'g':綠色
'r':紅色
'c':青色(藍綠色)
'm':洋紅(品紅色)
'y':黃色
'k':黑色
'w':白色
你也可以傳遞一個RGB元組,例如
(0.1, 0.2, 0.3)
,表示RGB顏色分量的值在0到1之間。這樣,你可以自定義邊緣線的顏色。**kwargs
: 可選的關(guān)鍵字參數(shù),用于配置表面圖的其他屬性,比如線條顏色、線條樣式等。
X
、 Y
和 Z
分別代表了數(shù)據(jù)在三維空間中的網(wǎng)格坐標和高度,而 cmap
參數(shù)可以用來調(diào)整表面的顏色。 rstride
和 cstride
參數(shù)用于控制在Z方向和XY平面上的采樣步長,可以用于優(yōu)化繪制速度和圖像精細度。 alpha
參數(shù)控制表面的透明度, antialiased
參數(shù)用于指定是否使用抗鋸齒。
如果不希望看到三維曲面上顯示的曲線色彩,可以使用 plot_surface()
的附加可選參數(shù):
ax.plot_surface(x_grid, y_grid, z, cmap=cm.viridis, linewidth=0, antialiased=False)
示例:
x = np.linspace(-3, 3, 256) y = np.linspace(-3, 3, 256) x_grid, y_grid = np.meshgrid(x, y) #使用`np.meshgrid()`方法將一維數(shù)組`x`和`y`轉(zhuǎn)換為二維數(shù)組,得到`x_grid`和`y_grid`,用于表示XY平面上的點坐標網(wǎng)格。 z = np.sinc(np.sqrt(x_grid ** 2 + y_grid ** 2)) fig = plt.figure() ax = fig.add_subplot(projection = '3d') #創(chuàng)建一個三維坐標軸對象。 ax.plot_surface(x_grid, y_grid, z, cmap=cm.viridis, linewidth=0, antialiased=False) #x_grid和y_grid表示XY平面上的點坐標網(wǎng)格,z表示每個點上的函數(shù)值。cmap=cm.viridis指定使用'viridis'顏色映射,用于在三維圖上表示高度的顏色。 plt.show()
可以僅保持曲線色彩,而曲面不使用其他顏色,這也可以通過 plot_surface()
的可選參數(shù)來完成:
x = np.linspace(-3, 3, 256) y = np.linspace(-3, 3, 256) x_grid, y_grid = np.meshgrid(x, y) #使用`np.meshgrid()`方法將一維數(shù)組`x`和`y`轉(zhuǎn)換為二維數(shù)組,得到`x_grid`和`y_grid`,用于表示XY平面上的點坐標網(wǎng)格。 z = np.sinc(np.sqrt(x_grid ** 2 + y_grid ** 2)) fig = plt.figure() ax = fig.add_subplot(projection = '3d') #創(chuàng)建一個三維坐標軸對象。 ax.plot_surface(x_grid, y_grid, z, edgecolor='b',color='w') #x_grid和y_grid表示XY平面上的點坐標網(wǎng)格,z表示每個點上的函數(shù)值。cmap=cm.viridis指定使用'viridis'顏色映射,用于在三維圖上表示高度的顏色。 plt.show()
如果希望消除曲面,而僅使用線框進行繪制,可以使用 plot_wireframe()
函數(shù), plot_wireframe()
參數(shù)與 plot_surface()
相同,使用兩個可選參數(shù) rstride
和 cstride
用于令 Matplotlib
跳過 x 和 y軸上指定數(shù)量的坐標,用于減少曲線的密度:
ax.plot_wireframe(x_grid, y_grid, z, cstride=10, rstride=10,color='c')
示例:
plot_wireframe()
的用法如下:
plot_wireframe(X, Y, Z, rstride=1, cstride=1, color=None, linewidth=1, antialiased=False, **kwargs)
其中,參數(shù)的意義如下:
X
: 二維數(shù)組,表示數(shù)據(jù)在X軸上的坐標。它的形狀應(yīng)該與Z
的形狀相同。Y
: 二維數(shù)組,表示數(shù)據(jù)在Y軸上的坐標。它的形狀應(yīng)該與Z
的形狀相同。Z
: 二維數(shù)組,表示數(shù)據(jù)在三維空間中的高度或數(shù)值。它的形狀應(yīng)該與X
和Y
的形狀相同。rstride
: 整數(shù),表示在Z方向上采樣的步長。默認值為1,表示不進行采樣。較大的值會導(dǎo)致更少的繪制點,從而加快繪制速度,但可能會影響圖像的精細程度。cstride
: 整數(shù),表示在XY平面上采樣的步長。默認值為1,表示不進行采樣。較大的值會導(dǎo)致更少的繪制點,從而加快繪制速度,但可能會影響圖像的精細程度。color
: 顏色或顏色序列,用于指定線框的顏色。默認值為None,表示使用默認的顏色。linewidth
: 浮點數(shù),表示線框的寬度。默認值為1。antialiased
: 布爾值,表示是否使用抗鋸齒。默認值為False,表示不使用抗鋸齒。如果設(shè)置為True,線框會更加平滑,但可能會增加繪制時間。**kwargs
: 可選的關(guān)鍵字參數(shù),用于配置線框圖的其他屬性,比如線條樣式等。
X
、 Y
和 Z
分別代表了數(shù)據(jù)在三維空間中的網(wǎng)格坐標和高度, rstride
和 cstride
參數(shù)用于控制在Z方向和XY平面上的采樣步長,可以用于優(yōu)化繪制速度和圖像精細度。 color
參數(shù)用于指定線框的顏色, linewidth
參數(shù)用于調(diào)整線框的寬度, antialiased
參數(shù)用于指定是否使用抗鋸齒。
1.2.4 繪制3D曲面
Matplotlib
也能夠使用更通用的方式繪制三維曲面:
angle = np.linspace(0, 2 * np.pi, 32) theta, phi = np.meshgrid(angle, angle) r, r_w = .25, 1. x = (r_w + r * np.cos(phi)) * np.cos(theta) y = (r_w + r * np.cos(phi)) * np.sin(theta) z = r * np.sin(phi) # Display the mesh fig = plt.figure() ax = fig.add_subplot(projection = '3d') ax.set_xlim3d(-1, 1) ax.set_ylim3d(-1, 1) ax.set_zlim3d(-1, 1) ax.plot_surface(x, y, z, color = 'c', edgecolor='m', rstride = 2, cstride = 2) plt.show()
同樣可以使用 plot_wireframe()
替換對 plot_surface()
的調(diào)用,以便獲得圓環(huán)的線框視圖:
angle = np.linspace(0, 2 * np.pi, 32) theta, phi = np.meshgrid(angle, angle) r, r_w = .25, 1. x = (r_w + r * np.cos(phi)) * np.cos(theta) y = (r_w + r * np.cos(phi)) * np.sin(theta) z = r * np.sin(phi) # Display the mesh fig = plt.figure() ax = fig.add_subplot(projection = '3d') ax.set_xlim3d(-1, 1) ax.set_ylim3d(-1, 1) ax.set_zlim3d(-1, 1) ax.plot_wireframe(x, y, z, edgecolor='c', rstride = 2, cstride = 1) plt.show()
1.2.5 在3D坐標中繪制2D圖形
Axes3D
實例同樣支持常用的二維渲染命令,如 plot()
:
ax.plot(x, u, zs=3, zdir='y', lw = 2, color = 'm')
這段代碼使用 ax.plot()
方法在三維坐標軸中繪制一條線。
x
: 一維數(shù)組或列表,表示數(shù)據(jù)點在X軸上的位置。u
: 一維數(shù)組或列表,表示數(shù)據(jù)點在Y軸上的位置。zs
: 數(shù)字或一維數(shù)組,表示數(shù)據(jù)點在Z軸上的位置。在這個例子中,zs=3
表示數(shù)據(jù)點在Z軸上的位置都是3,也就是說這條線的所有點都在Z=3這個平面上。如果傳遞一個一維數(shù)組,表示每個數(shù)據(jù)點在Z軸上的位置。zdir
: 字符串,表示投影方向。這個參數(shù)用于控制這條線在三維空間中的展示方向。在這個例子中,zdir='y'
表示這條線在XY平面上的投影將在Y軸上展示。lw
: (可選參數(shù)) 數(shù)字,表示線條的寬度。默認值為2。color
: (可選參數(shù)) 字符串,表示線條的顏色。默認值為'm',表示線條顏色為洋紅色(品紅色)。你可以使用顏色字符串,如'red'、'blue'、'green'等,也可以使用縮寫顏色字符串,如'r'、'b'、'g'等。
Axes3D 實例對 plot()
的調(diào)用有兩個新的可選參數(shù): zdir
:用于決定在哪個平面上繪制2D繪圖,可選值包括 x
、 y
或 z
; zs
:用于決定平面的偏移。 因此,要將二維圖形嵌入到三維圖形中,只需將二維原語用于 Axes3D
實例,同時使用可選參數(shù), zdir
和 zs
,來放置所需渲染圖形平面。
示例:
x = np.linspace(-3, 3, 256) y = np.linspace(-3, 3, 256) x_grid, y_grid = np.meshgrid(x, y) z = np.exp(-(x_grid ** 2 + y_grid ** 2)) u = np.exp(-(x ** 2)) fig = plt.figure() ax = fig.add_subplot(projection = '3d') ax.set_zlim3d(0, 3)#ax.set_zlim3d()是Matplotlib中用于設(shè)置三維坐標軸的Z軸范圍(限制)的方法。它用于限定Z軸的取值范圍,從而控制繪圖中Z軸顯示的范圍。set_zlim3d(zmin, zmax) ax.plot(x, u, zs=3, zdir='y', lw = 2, color = 'm') ax.plot(x, u, zs=-3, zdir='x', lw = 2., color = 'c') ax.plot_surface(x_grid, y_grid, z, color = 'b') plt.show()
除此之外,可以在 3D
空間中堆疊 2D
條形圖:
alpha = 1. / np.linspace(1, 8, 5) t = np.linspace(0, 5, 16) t_grid, a_grid = np.meshgrid(t, alpha) data = np.exp(-t_grid * a_grid) # Plotting fig = plt.figure() ax = fig.add_subplot(projection = '3d') cmap = cm.ScalarMappable(col.Normalize(0, len(alpha)), cm.viridis) ?#顏色映射 for i, row in enumerate(data): ax.bar(4 * t, row, zs=i, zdir='y', alpha=0.8, color=cmap.to_rgba(i)) plt.show()
col.Normalize(0, len(alpha))
: 這是創(chuàng)建一個歸一化(Normalize)對象的操作。col
是matplotlib.colors
模塊的別名,用于訪問顏色相關(guān)的功能。Normalize(0, len(alpha))
表示將數(shù)據(jù)映射到0到len(alpha)
之間的范圍。這個操作通常用于將數(shù)據(jù)規(guī)范化到特定范圍,以便后續(xù)的顏色映射。cm.viridis
: 這是指定使用的顏色映射。cm
是matplotlib.cm
模塊的別名,用于訪問顏色映射功能。viridis
是一種預(yù)定義的顏色映射,它包含一系列顏色,從低值(例如0)到高值(例如1)依次變化,用于在繪圖中表示數(shù)據(jù)的高低或其他屬性。cm.ScalarMappable(col.Normalize(0, len(alpha)), cm.viridis)
: 這個操作將前面創(chuàng)建的歸一化對象和顏色映射對象組合在一起,生成一個可映射到顏色的標量映射對象。這個對象在繪圖中用于將數(shù)值映射到對應(yīng)的顏色.ax.bar(4 * t, row, zs=i, zdir='y', alpha=0.8, color=cmap.to_rgba(i))
: 在三維坐標軸中繪制一個條形,4 * t
表示條形的X坐標,row
表示條形的高度,zs=i
表示條形的Z坐標,zdir='y'
表示條形在XY平面上的投影將在Y軸上展示,alpha=0.8
表示條形的透明度為0.8,color=cmap.to_rgba(i)
表示條形的顏色根據(jù)i
通過顏色映射對象cmap
獲取
1.2.6 3D柱形圖
3D
柱體以網(wǎng)格布局定位, bar3d()
方法接受六個必需參數(shù)作為輸入, bar3d()
是Matplotlib中用于繪制三維條形圖的方法。它可以在三維坐標軸中繪制一個或多個條形,用于可視化三維數(shù)據(jù)。
bar3d()
的用法如下:
bar3d(x, y, z, dx, dy, dz, color='b', zsort='average', *args, **kwargs)
其中,參數(shù)的含義如下:
x
: 一維數(shù)組或列表,表示每個條形的中心點在X軸上的位置。y
: 一維數(shù)組或列表,表示每個條形的中心點在Y軸上的位置。z
: 一維數(shù)組或列表,表示每個條形的中心點在Z軸上的位置,即條形的高度。dx
: 一維數(shù)組或列表,表示每個條形在X軸方向上的寬度。dy
: 一維數(shù)組或列表,表示每個條形在Y軸方向上的寬度。dz
: 一維數(shù)組或列表,表示每個條形在Z軸方向上的高度,即條形的厚度。color
: (可選參數(shù)) 字符串或顏色序列,表示條形的顏色。默認值為藍色('b')。zsort
: (可選參數(shù)) 字符串,表示條形的繪制順序。默認值為'average',表示按照Z軸坐標的平均值對條形進行排序。也可以選擇'min'表示按照Z軸坐標的最小值排序,'max'表示按照Z軸坐標的最大值排序,或者'none'表示不排序。*args
和**kwargs
: (可選參數(shù)) 這是一些額外的位置參數(shù)和關(guān)鍵字參數(shù),用于配置條形的其他屬性,比如線條顏色、線條樣式等。
通過傳遞 x
、 y
和 z
的數(shù)據(jù),以及 dx
、 dy
和 dz
的寬度和高度數(shù)據(jù),你可以使用 bar3d()
方法繪制一個或多個三維條形。每個條形的中心點由 x
、 y
和 z
指定,寬度由 dx
和 dy
指定,高度由 dz
指定。
color
參數(shù)用于設(shè)置條形的顏色,可以傳遞顏色字符串,如'red'、'blue'、'green'等,也可以使用縮寫顏色字符串,如'r'、'b'、'g'等,或者使用顏色序列。
zsort
參數(shù)用于控制條形的繪制順序,可以按照Z軸坐標的平均值、最小值或最大值對條形進行排序,或者不排序。
示例:
alpha = np.linspace(1, 8, 5) t = np.linspace(0, 5, 16) t_grid, a_grid = np.meshgrid(t, alpha) data = np.exp(-t_grid * (1. / a_grid)) # Plotting fig = plt.figure() ax = fig.add_subplot(projection = '3d') xi = t_grid.flatten() yi = a_grid.flatten() zi = np.zeros(data.size) dx = .30 * np.ones(data.size) dy = .30 * np.ones(data.size) dz = data.flatten() ax.set_xlabel('T') ax.set_ylabel('Alpha') ax.bar3d(xi, yi, zi, dx, dy, dz, color = 'c') plt.show()
二、matplotlib繪圖的風(fēng)格和樣式
2.1 matplotlib風(fēng)格
為了滿足不同的應(yīng)用需求, Matplotlib
中包含了 28
種不同的風(fēng)格,在進行繪圖時,可以根據(jù)需要選擇不同的繪圖風(fēng)格。使用以下代碼可以獲取 Matplotlib
中所有可用的風(fēng)格:
import matplotlib as mpl from matplotlib import pyplot as plt # 查看 Matplotlib 可用繪圖風(fēng)格 print(plt.style.available
使用 plt.style.use("style")
可以修改默認的繪圖風(fēng)格,其中 style
為 Matplolib
中可用的風(fēng)格:
# 設(shè)置默認繪圖風(fēng)格為 seaborn-darkgrid plt.style.use("seaborn-darkgrid") x = np.linspace(0, 2 * np.pi, 100) y = np.cos(x) plt.plot(x, y) plt.show()
除此之外, Maplotlib
中還有一些非常有意思的風(fēng)格,例如手繪風(fēng)格:
# 啟用手繪風(fēng)格 plt.xkcd() x = np.linspace(0, 2 * np.pi, 100) y = np.cos(x) plt.plot(x, y) plt.show()
同樣還有手繪風(fēng)格的條形圖:
#啟用手繪風(fēng)格 plt.xkcd() data = [[10., 20., 30., 20.],[40., 25., 53., 18.],[6., 22., 52., 19.]] x = np.arange(4) plt.bar(x + 0.00, data[0], color = 'b', width = 0.25) plt.bar(x + 0.25, data[1], color = 'g', width = 0.25) plt.bar(x + 0.50, data[2], color = 'r', width = 0.25) plt.show()
2.2 自定義顏色
2.2.1 自定義顏色
Matplotlib
中有多種定義顏色的方法,常見的方法包括:
三元組 (
Triplets
):顏色可以描述為一個實數(shù)三元組,即顏色的紅、藍、綠分量,其中每個分量在[0,1]
區(qū)間內(nèi)。因此,(1.0, 0.0, 0.0)
表示純紅色,而(1.0, 0.0, 1.0)
則表示粉色。四元組 (
Quadruplets
):它們前三個元素與三元組定義相同,第四個元素定義透明度值。此值也在[0,1]
區(qū)間內(nèi)。將圖形渲染到圖片文件中時,使用透明顏色可以使繪制圖形與背景進行混合。預(yù)定義名稱:
Matplotlib
將標準HTML
顏色名稱解釋為實際顏色。例如,字符串red
即可表示為紅色。同時一些某些顏色的具有簡潔的別名,如下表所示:
4、HTML顏色字符串:Matplotlib可以將HTML顏色字符串解釋為實際顏色。這些字符串被定義為#RRGGBB,其中RR、GG和BB` 分別是使用十六進制編碼的紅色、綠色和藍色分量。
5、灰度字符串: Matplotlib
將浮點值的字符串表示形式解釋為灰度,例如 0.75
表示中淺灰色。
2.2.2 使用自定義顏色繪制曲線
通過設(shè)置 plt.plot()
函數(shù)的參數(shù) color
(或等效的簡寫為 c
),可以設(shè)置曲線的顏色,示例:
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(5): samples = np.random.standard_normal(50) mu, sigma = np.mean(samples), np.std(samples) plt.plot(x, pdf(x, mu, sigma), color = str(.15*(i+1))) plt.plot(x, pdf(x, 0., 1.), color = 'k') plt.plot(x, pdf(x, 0.2, 1.), color = '#00ff00') plt.plot(x, pdf(x, 0.4, 1.), color = (0.9,0.9,0.0)) plt.plot(x, pdf(x, 0.4, 1.), color = (0.9,0.9,0.0,0.8)) plt.show()
2.2.3 使用自定義顏色繪制散點圖
可以以同樣的方式像控制曲線圖一樣控制散點圖的顏色,有兩種可用的形式:
為所有點使用相同的顏色 :所有點都將以相同的顏色顯示。
為每個點定義不同的顏色:為每個點提供不同的顏色。
2.2.3.1 給所有點使用相同的顏色
用從二元高斯分布中提取的兩組點 y_1
和 y_2
,每一組中點的顏色相同:
y_1 = np.random.standard_normal((150, 2)) #標準正太分布 y_1 += np.array((-1, -1)) # Center the distrib. at <-1, -1> y_2 = np.random.standard_normal((150, 2)) y_2 += np.array((1, 1)) # Center the distrib. at <1, 1> plt.scatter(y_1[:,0], y_1[:,1], color = 'c') plt.scatter(y_2[:,0], y_2[:,1], color = 'b') plt.show()
2.2.3.2 給每個點不同的顏色
需要為不同類別的點使用不同的顏色進行繪制,以觀察不同類別間的差異情況。以Fisher’s iris數(shù)據(jù)集為例,其數(shù)據(jù)集中數(shù)據(jù)類似如下所示:
5.0,3.3,1.4,0.2,Iris-setosa 7.0,3.2,4.7,1.4,Iris-versicolor 4.0,5.2,9.5,9.3,Iris-virginica
數(shù)據(jù)集的每個點都存儲在以逗號分隔的列表中。最后一列給出每個點的標簽(標簽包含三類: Iris-virginica
、 Iris-versicolor
和 Iris-Vertosa
)。在示例中,這些點的顏色將取決于它們的標簽,如下所示:
label_set = ( b'Iris-setosa', b'Iris-versicolor', b'Iris-virginica', ) def read_label(label): return label_set.index(label) data = np.loadtxt('data.data', delimiter = ',', converters = { 4 : read_label }) color_set = ('c', 'y', 'm') color_list = [color_set[int(label)] for label in data[:,4]] plt.scatter(data[:,0], data[:,1], color = color_list) plt.show()
對于三種可能的標簽,我們分別指定一種唯一的顏色,顏色在 color_set
中定義,標簽在 label_set
中定義。 label_set
中的第 i
個標簽與 color_set
中的第 i
個顏色相關(guān)聯(lián)。然后我們利用它們把標簽列表轉(zhuǎn)換成顏色列表 color_list
。然后只需調(diào)用 plt.scatter()
一次即可顯示所有點及其顏色。
2.2.4 給散點圖的邊使用自定義顏色
與 color
參數(shù)控制點的顏色一樣,可以使用 edgecolor
參數(shù)控制數(shù)據(jù)點的邊的顏色,可以為每個點的邊設(shè)置相同的顏色:
data = np.random.standard_normal((100, 2)) plt.scatter(data[:,0], data[:,1], color = '1.0', edgecolor='r') plt.show()
除了為每個點的邊設(shè)置相同的顏色外,也可以像在為每個點定義不同的顏色部分中介紹的一樣為每個點的邊設(shè)置不邊的顏色。
2.2.5 使用自定義顏色繪制條形圖
控制繪制條形圖使用的顏色與曲線圖和散點圖的工作原理相同,即通過可選參數(shù) color
:
w_pop = np.array([5., 30., 45., 22.]) m_pop = np.array( [5., 25., 50., 20.]) x = np.arange(4) plt.barh(x, w_pop, color='m') plt.barh(x, -m_pop, color='c') plt.show()
同樣,使用 plt.bar()
和 plt.barh()
函數(shù)自定義顏色繪制條形圖的工作方式與 plt.scatter()
完全相同,只需設(shè)置可選參數(shù) color
,同時也可以參數(shù) edgecolor
控制條形邊的顏色。`
示例:
values = np.random.randint(100, size = 50) color_set = ('c', 'm', 'y', 'b') color_list = [color_set[(len(color_set) * val) // 100] for val in values] plt.bar(np.arange(len(values)), values, color = color_list) plt.show()
2.2.6 使用自定義顏色繪制餅圖
自定義餅圖顏色的方法類似于條形圖:
color_set = ('c', 'm', 'y', 'b') values = np.random.rand(6) plt.pie(values, colors = color_set) plt.show()
餅圖接受使用 colors
參數(shù)(注意,此處是 colors
,而不是在 plt.plot()
中使用的 color
)的顏色列表。但是,如果顏色數(shù)少于輸入值列表中的元素數(shù),那么 plt.pie()
將循環(huán)使用顏色列表中的顏色。在示例中,使用包含四種顏色的列表,為了給包含六個值的餅圖著色,其中有兩個顏色將使用兩次。
2.2.7 使用自定義顏色繪制箱型圖
values = np.random.randn(100) b = plt.boxplot(values) for name, line_list in b.items(): for line in line_list: line.set_color('m') plt.show()
2.2.8 使用色彩映射繪制散點圖
如果要在圖形中使用多種顏色,逐個定義每種顏色并不是最佳方案,色彩映射可以解決此問題。色彩映射用一個變量對應(yīng)一個值(顏色)的連續(xù)函數(shù)定義顏色。 Matplotlib
提供了幾種常見的顏色映射;大多數(shù)是連續(xù)的顏色漸變。色彩映射在 matplotib.cm
模塊中定義,提供創(chuàng)建和使用色彩映射的函數(shù),它還提供了預(yù)定義的色彩映射選擇。 函數(shù) plt.scatter()
接受 color
參數(shù)的值列表,當提供 cmap
參數(shù)值時,這些值將被解釋為色彩映射的索引:
n = 256 angle = np.linspace(0, 8 * 2 * np.pi, n) radius = np.linspace(.5, 1., n) x = radius * np.cos(angle) y = radius * np.sin(angle) plt.scatter(x, y, c = angle, cmap = cm.hsv) plt.show()
2.2.9 使用色彩映射繪制條形圖
plt.scatter()
函數(shù)內(nèi)置了對色彩映射的支持,其他一些繪圖函數(shù)也內(nèi)置支持色彩映射。但是,有些函數(shù)(如 plt.bar()
)并未內(nèi)置對色彩映射的支持,在這種情況下, Matplotlib
可以從顏色映射顯式生成顏色:
使用matplotlb的color模塊:
values = np.random.randint(99, size = 50) cmap = cm.ScalarMappable(col.Normalize(0, 99), cm.binary) plt.bar(np.arange(len(values)), values, color = cmap.to_rgba(values)) plt.show()
首先創(chuàng)建色彩映射 cmap
,以便將 [0, 99]
范圍內(nèi)的值映射到 matplotlib.cm.binary
的顏色。然后,函數(shù) cmap.to_rgba
將值列表轉(zhuǎn)換為顏色列表。因此,盡管 plt.bar()
并未內(nèi)置色彩映射支持,但依舊可以使用并不復(fù)雜的代碼實現(xiàn)色彩映射。
2.2.10 創(chuàng)建自定義配色方案
Matplotlib
使用的默認顏色考慮的主要對象是打印文檔或出版物。因此,默認情況下,背景為白色,而標簽、軸和其他注釋則顯示為黑色,在某些不同的使用環(huán)境中,我們可能需要使用的配色方案;例如,將圖形背景設(shè)置為黑色,注釋設(shè)置為白色。 在 Matplotlib
中,各種對象(如軸、圖形和標簽)都可以單獨修改,但逐個更改這些對象的顏色配置并非最佳方案。我們可以使用在《Matplotlib安裝與配置》介紹的方法,通過修改配置集中改變所有對象,以配置其默認顏色或樣式:
mpl.rc('lines', linewidth = 2.) mpl.rc('axes', facecolor = 'k', edgecolor = 'w') mpl.rc('xtick', color = 'w') mpl.rc('ytick', color = 'w') mpl.rc('text', color = 'w') mpl.rc('figure', facecolor = 'k', edgecolor ='w') mpl.rc('axes', prop_cycle = mpl.cycler(color=[(0.1, .5, .75),(0.5, .5, .75)])) x = np.linspace(0, 7, 1024) plt.plot(x, np.sin(x)) plt.plot(x, np.cos(x)) plt.show()
2.3 自定義樣式
2.3.1 自定義線條樣式和線寬
在實踐中,除了顏色,大多數(shù)情況下我們還要對圖形的線條樣式等進行控制,以為線條樣式添加多樣性。
2.3.1.2 自定義線條樣式
linestyle
參數(shù)是Matplotlib中用于指定線條樣式的可選參數(shù)。它用于控制在繪制折線圖、曲線圖等線性圖時,線條的外觀樣式。
linestyle
參數(shù)的常用取值如下:
'-'
或'solid'
: 實線 (默認值)'--'
或'dashed'
: 虛線':'
或'dotted'
: 點線'-.'
或'dashdot'
: 點劃線
示例:
def gaussian(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, 1024) plt.plot(x, gaussian(x, 0., 1.), color = 'y', linestyle = 'solid') plt.plot(x, gaussian(x, 0., .5), color = 'c', linestyle = 'dashed') plt.plot(x, gaussian(x, 0., .25), color = 'm', linestyle = 'dashdot') plt.show()
使用 plt.plot()
的 linestyle
參數(shù)來控制曲線的樣式,其他可用線條樣式包括: solid
、 dashed
、 dotted
、 dashdot
。同樣,線條樣式設(shè)置不僅限于 plt.plot()
,任何由線條構(gòu)成的圖形都可以使用此參數(shù),也可以說 linestyle
參數(shù)可用于所有涉及線條渲染的命令。例如,可以修改條形圖的線條樣式:
n = 10 a = np.random.random(n) b = np.random.random(n) x = np.arange(n) plt.bar(x, a, color='c') plt.bar(x, a+b, bottom=a, color='w', edgecolor='black', linestyle = 'dashed') plt.show()
可以通過 edgecolor
參數(shù)改變邊線的默認顏色
2.3.1.2 自定義線寬
使用 linewidth
參數(shù)可以修改線條的粗細。默認情況下, linewidth
設(shè)置為1個單位。利用線條的粗細可以在視覺上強調(diào)某條特定的曲線。
示例:
def gaussian(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, 1024) for i in range(64): samples = np.random.standard_normal(50) mu, sigma = np.mean(samples), np.std(samples) #平均值和標準差 plt.plot(x, gaussian(x, mu, sigma), color = '.75', linewidth = .5) plt.plot(x, gaussian(x, 0., 1.), color = 'c', linewidth = 3.) plt.show()
2.3.2 控制填充樣式
Matplotlib
提供了填充圖案用于填充平面。這些填充圖案,對于僅包含黑白兩色的圖形中具有重要作用。
示例:
n = 10 a = np.random.random(n) b = np.random.random(n) x = np.arange(n) plt.bar(x, a, color='w', hatch='x', edgecolor='black') plt.bar(x, a+b, bottom=a, color='w', edgecolor='black', hatch='/') plt.show()
具有填充呈現(xiàn)性的函數(shù)(如 plt.bar()
)都可以使用可選參數(shù) hatch
控制填充樣式,此參數(shù)的可選值包括: /
, \
, |
, -
, +
, x
, o
, O
, .
和 *
,每個值對應(yīng)于不同的填充圖案; edgecolor
參數(shù)可用于控制填充圖案的顏色。
2.3.3 控制標記
2.3.3.1 控制標記樣式
在《Matplotlib圖形繪制》中,我們已經(jīng)了解了如何繪制曲線,并明白了曲線是由點之間的連線構(gòu)成的;此外,散點圖表示數(shù)據(jù)集中的每個點。而 Matplotlib
提供了多種形狀,可以用其他類型的標記替換點的樣式。 標記的指定方式包括以下幾種:
預(yù)定義標記:預(yù)定義的形狀,表示為
[0, 8]
范圍內(nèi)的整數(shù)或某些預(yù)定義的字符串。頂點列表:值對列表,用作形狀路徑的坐標。
正多邊形:表示
N
邊正多邊形的三元組(N, 0, angle)
,其中angle
為旋轉(zhuǎn)角度。星形多邊形:它表示為三元組
(N, 1, angle)
,代表N
邊正星形,其中angle
為旋轉(zhuǎn)角度。
a = np.random.standard_normal((100, 2)) a += np.array((-1, -1)) b = np.random.standard_normal((100, 2)) b += np.array((1, 1)) plt.scatter(a[:,0], a[:,1], color = 'm', marker = 'x') plt.scatter(b[:,0], b[:,1], color = 'c', marker = '^') plt.show()
使用 marker
參數(shù),可以為每個數(shù)據(jù)集合指定不同的標記。
如果我們需要為每個點定義不同樣式該怎么辦呢?與 color
參數(shù)不同, marker
參數(shù)不接受標記樣式列表作為輸入。因此,我們不能實現(xiàn) plt.scatter()
的單次調(diào)來顯示具有不同標記的多個點集。解決方案是,將每種類型的數(shù)據(jù)點分隔置不同集合中,并為每個集合單獨調(diào)用 plt.scatter()
調(diào)用:
label_list = ( b'Iris-setosa', b'Iris-versicolor', b'Iris-virginica', ) colors = ['c','y','m'] def read_label(label): return label_list.index(label) data = np.loadtxt('data.data', delimiter = ',', converters = { 4 : read_label }) marker_set = ('^', 'x', '.') for i, marker in enumerate(marker_set): data_subset = np.asarray([x for x in data if x[4] == i]) plt.scatter(data_subset[:,0], data_subset[:,1], color = colors[i], marker = marker) plt.show()
對于 plt.plot()
,也可以使用相同的標記參數(shù)訪問標記樣式。當數(shù)據(jù)點密集時,每個點都使用標記進行顯示將會導(dǎo)致圖片混亂,因此 Matplotlib
提供了 markevery
參數(shù),允許每隔 N
個點顯示一個標記:
示例:
x = np.linspace(-6, 6, 1024) y_1 = np.sinc(x) y_2 = np.sinc(x) + 1 plt.plot(x, y_1, marker = 'x', color = '.75',label = 'y-1') plt.plot(x, y_2, marker = 'o', color = 'k', markevery = 64,label = 'y-2') plt.legend() plt.show()
2.3.3.2 控制標記的大小
標記的大小可選參數(shù) s
進行控制:
示例:
a = np.random.standard_normal((100, 2)) a += np.array((-1, -1)) b = np.random.standard_normal((100, 2)) b += np.array((1, 1)) plt.scatter(a[:,0], a[:,1], c = 'm', s = 100.) plt.scatter(b[:,0], b[:,1], c = 'c', s = 25.) plt.show()
標記的大小由 plt.scatter()
的參數(shù) s
設(shè)置,但應(yīng)注意它設(shè)置的是標記的表面積倍率而非半徑。 plt.scatter()
函數(shù)還可以接受列表作為 s
參數(shù)的輸入,其表示每個點對應(yīng)的大小。
示例:
m = np.random.standard_normal((1000, 2)) r_list = np.sum(m ** 2, axis = 1) plt.scatter(m[:, 0], m[:, 1], c = 'w', edgecolor='c', marker = 'o', s = 32. * r_list) plt.show()
對于Plot方法, plt.plot()
函數(shù)允許在 markersize
(或簡寫為 ms
)參數(shù)的幫助下更改標記的大小,但是此參數(shù)不接受列表作為輸入。
2.3.3.3 自定義標記
雖然 Matplotlib
提供了多種標記形狀。但是在某些情況下我們可能仍然找不到適合具體需求的形狀。例如,我們可能希望使用公司徽標等作為形狀。 在 Matplotlib
中,將形狀描述為一條路徑——一系列點的連接。因此,如果要定義我們自己的標記形狀,必須提供一系列的點:
示例:
shape_description = [ ( 1., 2., mpath.Path.MOVETO), ( 1., 1., mpath.Path.LINETO), ( 2., 1., mpath.Path.LINETO), ( 2., -1., mpath.Path.LINETO), ( 1., -1., mpath.Path.LINETO), ( 1., -2., mpath.Path.LINETO), (-1., -2., mpath.Path.LINETO), (-1., -1., mpath.Path.LINETO), (-2., -1., mpath.Path.LINETO), (-2., 1., mpath.Path.LINETO), (-1., 1., mpath.Path.LINETO), (-1., 2., mpath.Path.LINETO), ( 0., 0., mpath.Path.CLOSEPOLY), ] #mpath.Path.MOVETO表示將移動到指定點,mpath.Path.LINETO表示在指定點之間繪制一條直線,mpath.Path.CLOSEPOLY表示繪制一個閉合路徑。 u, v, codes = zip(*shape_description) #這行代碼使用zip()函數(shù)和解包操作將shape_description列表中的元組拆分成三個分別包含x坐標、y坐標和代碼的元組。 my_marker = mpath.Path(np.asarray((u, v)).T, codes) #這是使用mpath.Path()方法創(chuàng)建自定義的路徑對象my_marker。這個路徑由x坐標數(shù)組u和y坐標數(shù)組v組成,并使用對應(yīng)的代碼數(shù)組codes來指定路徑上的點和連接方式。 data = np.random.rand(8, 8) plt.scatter(data[:,0], data[:, 1], c = 'm', marker = my_marker, s = 75) plt.show()
Path
對象的構(gòu)造函數(shù)將坐標列表和指令列表作為輸入;每個坐標一條指令,使用一個列表將坐標和指令融合在一起,然后將坐標列表和指令傳遞給路徑構(gòu)造函數(shù).
形狀是通過光標的移動來描述的:
MOVETO
:此指令將光標移動到指定的坐標,并不畫線。LINETO
:這將在光標當前點和目標點之間繪制直線,并將光標移動至目標點。CLOSEPOLY
:此指令僅用于關(guān)閉路徑,每個形狀都以這條指示結(jié)束。
理論上,任何形狀都是可能的。
總結(jié)
到此這篇關(guān)于python matplotlib繪圖詳解的文章就介紹到這了,更多相關(guān)python matplotlib繪圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python中collections.Counter()的具體使用
本文主要介紹了Python中collections.Counter()的具體使用,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-07-07Python數(shù)據(jù)分析之NumPy常用函數(shù)使用詳解
本篇將介紹怎樣從文件中載入數(shù)據(jù),以及怎樣使用NumPy的基本數(shù)學(xué)和統(tǒng)計分析函數(shù)、學(xué)習(xí)讀寫文件的方法,并嘗試函數(shù)式編程和NumPy線性代數(shù)運算,來學(xué)習(xí)NumPy的常用函數(shù),需要的可以參考一下2022-05-05python 基于opencv 實現(xiàn)一個鼠標繪圖小程序
這篇文章主要介紹了python 基于opencv 實現(xiàn)一個鼠標繪圖小程序,幫助大家更好的理解和使用python的opencv庫,感興趣的朋友可以了解下2020-12-12