Python Matplotlib add_subplot 和 subplots_adjust詳解及程式碼詳細說明 配圖片說明

獨步天秤發表於2019-01-16

Table of Contents

Matplotlib

add_subplot(self, *args, **kwargs)新增子圖

說明、引數、返回值

引數

返回值

程式碼例項

效果圖:

subplots_adjust

​​​​​​​說明、引數

​​​​​​​對比效果圖:

​​​​​​​在子圖座標軸ax4中畫出sin(x)的曲線

完整程式碼


Matplotlib

Matplotlib是一個Python庫,用於通過使用Python指令碼建立二維圖形和圖表。

它有一個名為pyplot的模組,通過提供控制線條樣式,字型屬性,格式化軸等功能,使得繪圖變得容易。

支援各種各樣的圖形和圖形 - 即直方圖,條形圖,功率譜,誤差圖等

與NumPy一起使用,為MatLab提供了一個有效的開源替代方案。

也可以用於像PyQt和wxPython這樣的圖形工具包。

以上介紹選自https://www.yiibai.com/python_data_science/python_matplotlib.html

通常,通過新增以下語句將包匯入到Python指令碼中

import matplotlib.pyplot as plt

​​​​​​​add_subplot(self, *args, **kwargs)新增子圖

​​​​​​​說明、引數、返回值

Add an Axes to the figure as part of a subplot arrangement.

作為子圖佈置的一部分,將座標軸新增到圖中。

 

Call signatures:如何呼叫:

add_subplot(nrows, ncols, index, **kwargs)

add_subplot(pos, **kwargs)

add_subplot(ax)

方法說明位於:

C:\anaconda3\Lib\site-packages\matplotlib\figure.py模組下figure類方法 add_subplot(self, *args, **kwargs)

引數

Parameters

        ----------

        *args

            Either a 3-digit integer or three separate integers

            describing the position of the subplot. If the three

            integers are *nrows*, *ncols*, and *index* in order, the

            subplot will take the *index* position on a grid with *nrows*

            rows and *ncols* columns. *index* starts at 1 in the upper left

            corner and increases to the right.

 

            *pos* is a three digit integer, where the first digit is the

            number of rows, the second the number of columns, and the third

            the index of the subplot. i.e. fig.add_subplot(235) is the same as

            fig.add_subplot(2, 3, 5). Note that all integers must be less than

            10 for this form to work.

筆者翻譯:

引數

        ----------

        * ARGS

             3位整數或3個單獨的整數來描述子圖的位置。 如果三個

             整數是* nrows *,* ncols *和* index *的順序,

             子圖將採用 nrows * ncols 的網格上的* index *位置。

             * index *從左上角的1開始,並向右增加。

 

             * pos *是一個三位整數,其中第一個數字是

             行數,第二個數字是列數和第三個數字是

             子圖的索引。 即fig.add_subplot(235)與fig.add_subplot(2,3,5)相同。

             請注意,希望這個格式正確工作,所有整數必須小於10。

舉個栗子,如果nrows = 3,ncols = 2,那麼這個網格(grid)大小為3*2,即總共有6個格子。

Index從左上角的1開始(不是零),依次向右增加。可以參考如下表格:

表格中的數字代表index,以下兩句程式碼是等效的

add_subplot(3, 2, 1) # 推薦此種寫法

add_subplot(321)

(3,2,1)

(3,2,2)

(3,2,3)

(3,2,4)

(3,2,5)

(3,2,6)

projection預設為rectilinear(矩形圖)

返回值

Returns

        -------

        axes : an `.axes.SubplotBase` subclass of `~.axes.Axes` (or a subclass of `~.axes.Axes`)

            The axes of the subplot. The returned axes base class depends on

            the projection used. It is `~.axes.Axes` if rectilinear projection

            are used and `.projections.polar.PolarAxes` if polar projection

            are used. The returned axes is then a subplot subclass of the

            base class.

 

返回值

        -------

         axes:`~.axes.Axes`的子類`.axes.SubplotBase`(或`~.axes.Axes`的子類)

             子圖的座標軸。 返回的軸基類取決於

             使用的投影。 如果是直線投影,它是`~.axes.Axes`;

             如果投影為polar則返回`.projections.polar.PolarAxes` 。

            然後返回的軸是基類的子圖子類。

程式碼例項

以下程式碼出自add_subplot的說明,我改了個row的引數,加了點東西,方便大家看效果

#! /usr/bin/env python
# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt

fig=plt.figure('subplot demo')  # 影象標題為'subplot demo',否則預設為'Figure 1'

# 接下來是在一個3行*2列的網格里新增子圖
# row = 3, col = 2,該網格可以擺放六張子圖index total為6
# fig.add_subplot(221)          # row = 3, col = 2, index = 1
# equivalent but more general【與上面一行等價,但是這種更普遍】
ax1=fig.add_subplot(3, 2, 1)    # row = 3, col = 2, index = 1

# add a subplot with no frame
ax2=fig.add_subplot(322, frameon=False) # row = 3, col = 2, index = 2

# add a polar subplot
fig.add_subplot(323, projection='polar')    # row = 3, col = 2, index = 3

# add a red subplot that share the x-axis with ax1
fig.add_subplot(324, sharex=ax1, facecolor='red')   # row = 3, col = 2, index = 4

# add a polar subplot
fig.add_subplot(325, projection='lambert')    # row = 3, col = 2, index = 5

# add a red subplot, mollweide 即是橢圓ellipse
fig.add_subplot(326, projection='mollweide')   # row = 3, col = 2, index = 6

#delete ax2 from the figure
fig.delaxes(ax2)

#add ax2 to the figure again
fig.add_subplot(ax2)

plt.show()  # 顯示影象

效果圖:

帶括號的紫色文字是我後期加上去的,為了說明各個座標軸的index位置

更多資訊請參考

https://matplotlib.org/api/_as_gen/matplotlib.figure.Figure.html?highlight=add_subplot#matplotlib.figure.Figure.add_subplot

​​​​​​​subplots_adjust

​​​​​​​說明、引數

Adjusting the spacing of margins and subplots調整邊距和子圖的間距

subplots_adjust(self, left=None, bottom=None, right=None, top=None,
                    wspace=None, hspace=None)

Tune the subplot layout.調整子圖佈局。

The parameter meanings (and suggested defaults) are:引數含義(和建議的預設值)是:

left  = 0.125  # the left side of the subplots of the figure圖片中子圖的左側

right = 0.9    # the right side of the subplots of the figure圖片中子圖的右側

bottom = 0.1   # the bottom of the subplots of the figure圖片中子圖的底部

top = 0.9      # the top of the subplots of the figure圖片中子圖的頂部

wspace = 0.2   # the amount of width reserved for space between subplots,

               # expressed as a fraction of the average axis width

#為子圖之間的空間保留的寬度,平均軸寬的一部分

hspace = 0.2   # the amount of height reserved for space between subplots,

               # expressed as a fraction of the average axis height

#為子圖之間的空間保留的高度,平均軸高度的一部分

加了這個語句,子圖會稍變小,因為空間也佔用座標軸的一部分

fig.subplots_adjust(wspace=0.5,hspace=0.5)

​​​​​​​對比效果圖:

右圖是加加了subplots_adjust

更多細節及程式碼例項可參考:

https://matplotlib.org/api/_as_gen/matplotlib.pyplot.subplots_adjust.html

​​​​​​​在子圖座標軸ax4中畫出sin(x)的曲線

新增以下程式碼

# add a red subplot that share the x-axis with ax1
ax4 = fig.add_subplot(324, sharex=ax1, facecolor='red')   # row = 3, col = 2, index = 4
# 在座標軸ax4中新增畫曲線圖y = sin(x)
# Compute the x and y coordinates for points on a sine curve
x = np.arange(0, 3 * np.pi, 0.1)    # 建立一個一維陣列,[0, 3*pi),步長為0.1
y = np.sin(x)
# Plot the points using matplotlib - y = sin(x)
ax4.plot(x, y)
plt.title("sin wave form")  # 為該曲線取名為"sin wave form"

完整程式碼

效果圖如上圖

#! /usr/bin/env python
# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt
import numpy as np

fig=plt.figure('subplot demo')  # 影象標題為'subplot demo',否則預設為'Figure 1'
fig.subplots_adjust(wspace=0.5,hspace=0.5)  # 調整邊距和子圖的間距

# 接下來是在一個3行*2列的網格里新增子圖
# row = 3, col = 2,該網格可以擺放六張子圖index total為6
# fig.add_subplot(221)          # row = 3, col = 2, index = 1
# equivalent but more general【與上面一行等價,但是這種更普遍】
ax1 = fig.add_subplot(3, 2, 1)    # row = 3, col = 2, index = 1

# add a subplot with no frame
ax2 = fig.add_subplot(322, frameon=False) # row = 3, col = 2, index = 2

# add a polar subplot
ax3 = fig.add_subplot(323, projection='polar')    # row = 3, col = 2, index = 3

# add a red subplot that share the x-axis with ax1
ax4 = fig.add_subplot(324, sharex=ax1, facecolor='red')   # row = 3, col = 2, index = 4
# 在座標軸ax4中新增畫曲線圖y = sin(x)
# Compute the x and y coordinates for points on a sine curve
x = np.arange(0, 3 * np.pi, 0.1)    # 建立一個一維陣列,[0, 3*pi),步長為0.1
y = np.sin(x)
# Plot the points using matplotlib - y = sin(x)
ax4.plot(x, y)
plt.title("sin wave form")  # 為該曲線取名為"sin wave form"

# add a polar subplot
ax5 = fig.add_subplot(325, projection='lambert')    # row = 3, col = 2, index = 5

# add a red subplot, mollweide 即是橢圓ellipse
ax6 = fig.add_subplot(326, projection='mollweide')   # row = 3, col = 2, index = 6

#delete ax2 from the figure
fig.delaxes(ax2)

#add ax2 to the figure again
fig.add_subplot(ax2)

plt.show()  # 顯示影象

相關文章