一、Matplotlib 博文來源:https://www.runoob.com/matplotlib/matplotlib-tutorial.html Matplotlib 是 Python 的繪圖庫,它能讓使用者很輕鬆地將數據圖形化,並且提供多樣化的輸出格式。 Matplotlib 可以用來繪製 ...
一、Matplotlib
博文來源:https://www.runoob.com/matplotlib/matplotlib-tutorial.html
Matplotlib 是 Python 的繪圖庫,它能讓使用者很輕鬆地將數據圖形化,並且提供多樣化的輸出格式。
Matplotlib 可以用來繪製各種靜態,動態,互動式的圖表。
Matplotlib 是一個非常強大的 Python 畫圖工具,我們可以使用該工具將很多數據通過圖表的形式更直觀的呈現出來。
Matplotlib 可以繪製線圖、散點圖、等高線圖、條形圖、柱狀圖、3D 圖形、甚至是圖形動畫等等。
二、Matplotlib 安裝
我們使用 pip 工具來安裝 Matplotlib 庫,
升級 pip:
python3 -m pip install -U pip
安裝 matplotlib 庫:
python3 -m pip install -U matplotlib
安裝完成後,我們就可以通過 import 來導入 matplotlib 庫:
以下實例,我們通過導入 matplotlib 庫,然後查看 matplotlib 庫的版本號:
實例
import matplotlib print(matplotlib.__version__)
三、Matplotlib Pyplot
Pyplot 是 Matplotlib 的子庫,提供了和 MATLAB 類似的繪圖 API。
Pyplot 是常用的繪圖模塊,能很方便讓用戶繪製 2D 圖表。
Pyplot 包含一系列繪圖函數的相關函數,每個函數會對當前的圖像進行一些修改,例如:給圖像加上標記,生新的圖像,在圖像中產生新的繪圖區域等等。
使用的時候,我們可以使用 import 導入 pyplot 庫,並設置一個別名 plt:
這樣我們就可以使用 plt 來引用 Pyplot 包的方法。
以下實例,我們通過兩個坐標 (0,0) 到 (6,100) 來繪製一條線:
實例
import matplotlib.pyplot as plt import numpy as np xpoints = np.array([0, 6]) ypoints = np.array([0, 100]) plt.plot(xpoints, ypoints) plt.show()
輸出結果如下所示:
以上實例中我們使用了 Pyplot 的 plot() 函數, plot() 函數是繪製二維圖形的最基本函數。
plot() 用於畫圖它可以繪製點和線,語法格式如下:
# 畫單條線
plot([x], y, [fmt], *, data=None, **kwargs)
# 畫多條線
plot([x], y, [fmt], [x2], y2, [fmt2], ..., **kwargs)
參數說明:
- x, y:點或線的節點,x 為 x 軸數據,y 為 y 軸數據,數據可以列表或數組。
- fmt:可選,定義基本格式(如顏色、標記和線條樣式)。
- **kwargs:可選,用在二維平面圖上,設置指定屬性,如標簽,線的寬度等。
>>> plot(x, y, 'bo') # 創建 y 中數據與 x 中對應值的二維線圖,使用藍色實心圈繪製
>>> plot(y) # x 的值為 0..N-1
>>> plot(y, 'r+') # 使用紅色 + 號
顏色字元:'b' 藍色,'m' 洋紅色,'g' 綠色,'y' 黃色,'r' 紅色,'k' 黑色,'w' 白色,'c' 青綠色,'#008000' RGB 顏色符串。多條曲線不指定顏色時,會自動選擇不同顏色。
線型參數:'‐' 實線,'‐‐' 破折線,'‐.' 點劃線,':' 虛線。
標記字元:'.' 點標記,',' 像素標記(極小點),'o' 實心圈標記,'v' 倒三角標記,'^' 上三角標記,'>' 右三角標記,'<' 左三角標記...等等。
如果我們要繪製坐標 (1, 3) 到 (8, 10) 的線,我們就需要傳遞兩個數組 [1, 8] 和 [3, 10] 給 plot 函數:
實例
import matplotlib.pyplot as plt import numpy as np xpoints = np.array([1, 8]) ypoints = np.array([3, 10]) plt.plot(xpoints, ypoints) plt.show()
以上代碼輸出結果為:
如果我們只想繪製兩個坐標點,而不是一條線,可以使用 o 參數,表示一個實心圈的標記:
繪製坐標 (1, 3) 和 (8, 10) 的兩個點
import matplotlib.pyplot as plt import numpy as np xpoints = np.array([1, 8]) ypoints = np.array([3, 10]) plt.plot(xpoints, ypoints, 'o') plt.show()
以上代碼輸出結果為:
我們也可以繪製任意數量的點,只需確保兩個軸上的點數相同即可。
繪製一條不規則線,坐標為 (1, 3) 、 (2, 8) 、(6, 1) 、(8, 10),對應的兩個數組為:[1, 2, 6, 8] 與 [3, 8, 1, 10]。
實例
import matplotlib.pyplot as plt import numpy as np xpoints = np.array([1, 2, 6, 8]) ypoints = np.array([3, 8, 1, 10]) plt.plot(xpoints, ypoints) plt.show()
以上代碼輸出結果為:
如果我們不指定 x 軸上的點,則 x 會根據 y 的值來設置為 0, 1, 2, 3..N-1。
實例
import matplotlib.pyplot as plt import numpy as np ypoints = np.array([3, 10]) plt.plot(ypoints) plt.show()
以上代碼輸出結果為:
從上圖可以看出 x 的值預設設置為 [0, 1]。
再看一個有更多值的實例:
實例
import matplotlib.pyplot as plt import numpy as np ypoints = np.array([3, 8, 1, 10, 5, 7])i plt.plot(ypoints) plt.show()
以上代碼輸出結果為:
從上圖可以看出 x 的值預設設置為 [0, 1, 2, 3, 4, 5]。
以下實例我們繪製一個正弦和餘弦圖,在 plt.plot() 參數中包含兩對 x,y 值,第一對是 x,y,這對應於正弦函數,第二對是 x,z,這對應於餘弦函數。
實例
import matplotlib.pyplot as plt import numpy as np x = np.arange(0,4*np.pi,0.1) # start,stop,step y = np.sin(x) z = np.cos(x) plt.plot(x,y,x,z) plt.show()
以上代碼輸出結果為:
import matplotlib.pyplot as plt import numpy as np ypoints = np.array([1,3,4,5,8,9,6,1,3,4,5,2,4]) plt.plot(ypoints, marker = 'o') plt.show()
四、Matplotlib 繪圖標記
繪圖過程如果我們想要給坐標自定義一些不一樣的標記,就可以使用 plot() 方法的 marker 參數來定義。
以下實例定義了實心圓標記:
實例
import matplotlib.pyplot as plt import numpy as np ypoints = np.array([1,3,4,5,8,9,6,1,3,4,5,2,4]) plt.plot(ypoints, marker = 'o') plt.show()
顯示結果如下:
marker 可以定義的符號如下:
標記 | 符號 | 描述 |
---|---|---|
"." | 點 | |
"," | 像素點 | |
"o" | 實心圓 | |
"v" | 下三角 | |
"^" | 上三角 | |
"<" | 左三角 | |
">" | 右三角 | |
"1" | 下三叉 | |
"2" | 上三叉 | |
"3" | 左三叉 | |
"4" | 右三叉 | |
"8" | 八角形 | |
"s" | 正方形 | |
"p" | 五邊形 | |
"P" | 加號(填充) | |
"*" | 星號 | |
"h" | 六邊形 1 | |
"H" | 六邊形 2 | |
"+" | 加號 | |
"x" | 乘號 x | |
"X" | 乘號 x (填充) | |
"D" | 菱形 | |
"d" | 瘦菱形 | |
"|" | 豎線 | |
"_" | 橫線 | |
0 (TICKLEFT) | 左橫線 | |
1 (TICKRIGHT) | 右橫線 | |
2 (TICKUP) | 上豎線 | |
3 (TICKDOWN) | 下豎線 | |
4 (CARETLEFT) | 左箭頭 | |
5 (CARETRIGHT) | 右箭頭 | |
6 (CARETUP) | 上箭頭 | |
7 (CARETDOWN) | 下箭頭 | |
8 (CARETLEFTBASE) | 左箭頭 (中間點為基準) | |
9 (CARETRIGHTBASE) | 右箭頭 (中間點為基準) | |
10 (CARETUPBASE) | 上箭頭 (中間點為基準) | |
11 (CARETDOWNBASE) | 下箭頭 (中間點為基準) | |
"None", " " or "" | 沒有任何標記 | |
'$...$' | 渲染指定的字元。例如 "$f$" 以字母 f 為標記。 |
以下實例定義了 * 標記:
實例
import matplotlib.pyplot as plt import numpy as np ypoints = np.array([1,3,4,5,8,9,6,1,3,4,5,2,4]) plt.plot(ypoints, marker = '*') plt.show()
顯示結果如下:
fmt 參數
fmt 參數定義了基本格式,如標記、線條樣式和顏色。
例如 o:r,o 表示實心圓標記,: 表示虛線,r 表示顏色為紅色。
實例
import matplotlib.pyplot as plt import numpy as np ypoints = np.array([6, 2, 13, 10]) plt.plot(ypoints, 'o:r') plt.show()
顯示結果如下:
線類型:
線類型標記 | 描述 | |
---|---|---|
'-' | 實線 | |
':' | 虛線 | |
'--' | 破折線 | |
'-.' | 點劃線 |
顏色類型:
顏色標記 | 描述 | |
---|---|---|
'r' | 紅色 | |
'g' | 綠色 | |
'b' | 藍色 | |
'c' | 青色 | |
'm' | 品紅 | |
'y' | 黃色 | |
'k' | 黑色 | |
'w' | 白色 |
標記大小與顏色
我們可以自定義標記的大小與顏色,使用的參數分別是:
- markersize,簡寫為 ms:定義標記的大小。
- markerfacecolor,簡寫為 mfc:定義標記內部的顏色。
- markeredgecolor,簡寫為 mec:定義標記邊框的顏色。
設置標記大小:
實例
import matplotlib.pyplot as plt import numpy as np ypoints = np.array([6, 2, 13, 10]) plt.plot(ypoints, marker = 'o', ms = 20) plt.show()
顯示結果如下:
設置標記外邊框顏色:
實例
import matplotlib.pyplot as plt import numpy as np ypoints = np.array([6, 2, 13, 10]) plt.plot(ypoints, marker = 'o', ms = 20, mec = 'r') plt.show()
顯示結果如下:
設置標記內部顏色:
實例
import matplotlib.pyplot as plt import numpy as np ypoints = np.array([6, 2, 13, 10]) plt.plot(ypoints, marker = 'o', ms = 20, mfc = 'r') plt.show()
顯示結果如下:
自定義標記內部與邊框的顏色:
實例
import matplotlib.pyplot as plt import numpy as np ypoints = np.array([6, 2, 13, 10]) plt.plot(ypoints, marker = 'o', ms = 20, mec = '#4CAF50', mfc = '#4CAF50') plt.show()
顯示結果如下:
五、Matplotlib 繪圖線
繪圖過程如果我們自定義線的樣式,包括線的類型、顏色和大小等。
線的類型
線的類型可以使用 linestyle 參數來定義,簡寫為 ls。
類型 | 簡寫 | 說明 |
---|---|---|
'solid' (預設) | '-' | 實線 |
'dotted' | ':' | 點虛線 |
'dashed' | '--' | 破折線 |
'dashdot' | '-.' | 點劃線 |
'None' | '' 或 ' ' | 不畫線 |
實例
import matplotlib.pyplot as plt import numpy as np ypoints = np.array([6, 2, 13, 10]) plt.plot(ypoints, linestyle = 'dotted') plt.show()
顯示結果如下:
線的顏色
線的顏色可以使用 color 參數來定義,簡寫為 c。
顏色類型:
顏色標記 | 描述 | |
---|---|---|
'r' | 紅色 | |
'g' | 綠色 | |
'b' | 藍色 | |
'c' | 青色 | |
'm' | 品紅 | |
'y' | 黃色 | |
'k' | 黑色 | |
'w' | 白色 |
當然也可以自定義顏色類型,例如:SeaGreen、#8FBC8F 等,完整樣式可以參考 HTML 顏色值。
實例
import matplotlib.pyplot as plt import numpy as np ypoints = np.array([6, 2, 13, 10]) plt.plot(ypoints, color = 'r') plt.show()
顯示結果如下:
線的寬度
線的寬度可以使用 linewidth 參數來定義,簡寫為 lw,值可以是浮點數,如:1、2.0、5.67 等。
實例
import matplotlib.pyplot as plt import numpy as np ypoints = np.array([6, 2, 13, 10]) plt.plot(ypoints, linewidth = '12.5') plt.show()
顯示結果如下:
多條線
plot() 方法中可以包含多對 x,y 值來繪製多條線。
實例
import matplotlib.pyplot as plt import numpy as np y1 = np.array([3, 7, 5, 9]) y2 = np.array([6, 2, 13, 10]) plt.plot(y1) plt.plot(y2) plt.show()
顯示結果如下:
我們也可以自己設置 x 坐標等值:
六、Matplotlib 軸標簽和標題
我們可以使用 xlabel() 和 ylabel() 方法來設置 x 軸和 y 軸的標簽。
實例
import numpy as np import matplotlib.pyplot as plt x = np.array([1, 2, 3, 4]) y = np.array([1, 4, 9, 16]) plt.plot(x, y) plt.xlabel("x - label") plt.ylabel("y - label") plt.show()
顯示結果如下:
標題
我們可以使用 title() 方法來設置標題。
實例
import numpy as np import matplotlib.pyplot as plt x = np.array([1, 2, 3, 4]) y = np.array([1, 4, 9, 16]) plt.plot(x, y) plt.title("RUNOOB TEST TITLE") plt.xlabel("x - label") plt.ylabel("y - label") plt.show()
顯示結果如下:
圖形中文顯示
Matplotlib 預設情況不支持中文,如有需要參考:https://www.runoob.com/matplotlib/matplotlib-label.html
七、Matplotlib 網格線
我們可以使用 pyplot 中的 grid() 方法來設置圖表中的網格線。
grid() 方法語法格式如下:
matplotlib.pyplot.grid(b=None, which='major', axis='both', )
參數說明:
- b:可選,預設為 None,可以設置布爾值,true 為顯示網格線,false 為不顯示,如果設置 **kwargs 參數,則值為 true。
- which:可選,可選值有 'major'、'minor' 和 'both',預設為 'major',表示應用更改的網格線。
- axis:可選,設置顯示哪個方向的網格線,可以是取 'both'(預設),'x' 或 'y',分別表示兩個方向,x 軸方向或 y 軸方向。
- **kwargs:可選,設置網格樣式,可以是 color='r', linestyle='-' 和 linewidth=2,分別表示網格線的顏色,樣式和寬度。
以下實例添加一個簡單的網格線,參數使用預設值:
實例
import numpy as np import matplotlib.pyplot as plt x = np.array([1, 2, 3, 4]) y = np.array([1, 4, 9, 16]) plt.title("RUNOOB grid() Test") plt.xlabel("x - label") plt.ylabel("y - label") plt.plot(x, y) plt.grid() plt.show()
顯示結果如下:
以下實例添加一個簡單的網格線,axis 參數使用 x,設置 x 軸方向顯示網格線:
實例
import numpy as np import matplotlib.pyplot as plt x = np.array([1, 2, 3, 4]) y = np.array([1, 4, 9, 16]) plt.title("RUNOOB grid() Test") plt.xlabel("x - label") plt.ylabel("y - label") plt.plot(x, y) plt.grid(axis='x') # 設置 y 就在軸方向顯示網格線 plt.show()
顯示結果如下:
以下實例添加一個簡單的網格線,並設置網格線的樣式,格式如下:
grid(color = 'color', linestyle = 'linestyle', linewidth = number)
參數說明:
color:'b' 藍色,'m' 洋紅色,'g' 綠色,'y' 黃色,'r' 紅色,'k' 黑色,'w' 白色,'c' 青綠色,'#008000' RGB 顏色符串。
linestyle:'‐' 實線,'‐‐' 破折線,'‐.' 點劃線,':' 虛線。
linewidth:設置線的寬度,可以設置一個數字。
實例
import numpy as np import matplotlib.pyplot as plt x = np.array([1, 2, 3, 4]) y = np.array([1, 4, 9, 16]) plt.title("RUNOOB grid() Test") plt.xlabel("x - label") plt.ylabel("y - label") plt.plot(x, y) plt.grid(color = 'r', linestyle = '--', linewidth = 0.5) plt.show()
顯示結果如下:
八、Matplotlib 繪製多圖
我們可以使用 pyplot 中的 subplot() 和 subplots() 方法來繪製多個子圖。
subplot() 方法在繪圖時需要指定位置,subplots() 方法可以一次生成多個,在調用時只需要調用生成對象的 ax 即可。
subplot
subplot(nrows, ncols, index, **kwargs)
subplot(pos, **kwargs)
subplot(**kwargs)
subplot(ax)
以上函數將整個繪圖區域分成 nrows 行和 ncols 列,然後從左到右,從上到下的順序對每個子區域進行編號 1...N ,左上的子區域的編號為 1、右下的區域編號為 N,編號可以通過參數 index 來設置。
設置 numRows = 1,numCols = 2,就是將圖表繪製成 1x2 的圖片區域, 對應的坐標為:
(1, 1), (1, 2)
plotNum = 1, 表示的坐標為(1, 1), 即第一行第一列的子圖。
plotNum = 2, 表示的坐標為(1, 2), 即第一行第二列的子圖。
實例
import matplotlib.pyplot as plt import numpy as np #plot 1: xpoints = np.array([0, 6]) ypoints = np.array([0, 100]) plt.subplot(1, 2, 1) plt.plot(xpoints,ypoints) plt.title("plot 1") #plot 2: x = np.array([1, 2, 3, 4]) y = np.array([1, 4, 9, 16]) plt.subplot(1, 2, 2) plt.plot(x,y) plt.title("plot 2") plt.suptitle("RUNOOB subplot Test") plt.show()
顯示結果如下:
設置 numRows = 2,numCols = 2,就是將圖表繪製成 2x2 的圖片區域, 對應的坐標為:
(1, 1), (1, 2)
(2, 1), (2, 2)
plotNum = 1, 表示的坐標為(1, 1), 即第一行第一列的子圖。
plotNum = 2, 表示的坐標為(1, 2), 即第一行第二列的子圖。
plotNum = 3, 表示的坐標為(2, 1), 即第二行第一列的子圖。
plotNum = 4, 表示的坐標為(2, 2), 即第二行第二列的子圖。
實例
import matplotlib.pyplot as plt import numpy as np #plot 1: x = np.array([0, 6]) y = np.array([0, 100]) plt.subplot(2, 2, 1) plt.plot(x,y) plt.title("plot 1") #plot 2: x = np.array([1, 2, 3, 4]) y = np.array([1, 4, 9, 16]) plt.subplot(2, 2, 2) plt.plot(x,y) plt.title("plot 2") #plot 3: x = np.array([1, 2, 3, 4]) y = np.array([3, 5, 7, 9]) plt.subplot(2, 2, 3) plt.plot(x,y) plt.title("plot 3") #plot 4: x = np.array([1, 2, 3, 4]) y = np.array([4, 5, 6, 7]) plt.subplot(2, 2, 4) plt.plot(x,y) plt.title("plot 4") plt.suptitle("RUNOOB subplot Test") plt.show()
顯示結果如下:
Matplotlib 散點圖
我們可以使用 pyplot 中的 scatter() 方法來繪製散點圖。
scatter() 方法語法格式如下:
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, plotnonfinite=False, data=None, **kwargs)
參數說明:
x,y:長度相同的數組,也就是我們即將繪製散點圖的數據點,輸入數據。
s:點的大小,預設 20,也可以是個數組,數組每個參數為對應點的大小。
c:點的顏色,預設藍色 'b',也可以是個 RGB 或 RGBA 二維行數組。
marker:點的樣式,預設小圓圈 'o'。
cmap:Colormap,預設 None,標量或者是一個 colormap 的名字,只有 c 是一個浮點數數組的時才使用。如果沒有申明就是 image.cmap。
norm:Normalize,預設 None,數據亮度在 0-1 之間,只有 c 是一個浮點數的數組的時才使用。
vmin,vmax::亮度設置,在 norm 參數存在時會忽略。
alpha::透明度設置,0-1 之間,預設 None,即不透明。
linewidths::標記點的長度。
edgecolors::顏色或顏色序列,預設為 'face',可選值有 'face', 'none', None。
plotnonfinite::布爾值,設置是否使用非限定的 c ( inf, -inf 或 nan) 繪製點。
**kwargs::其他參數。
以下實例 scatter() 函數接收長度相同的數組參數,一個用於 x 軸的值,另一個用於 y 軸上的值:
實例
import matplotlib.pyplot as plt import numpy as np x = np.array([1, 2, 3, 4, 5, 6, 7, 8]) y = np.array([1, 4, 9, 16, 7, 11, 23, 18]) plt.scatter(x, y) plt.show()
顯示結果如下:
使用隨機數來設置散點圖:
實例
import numpy as np import matplotlib.pyplot as plt # 隨機數生成器的種子 np.random.seed(19680801) N = 50 x = np.random.rand(N) y = np.random.rand(N) colors = np.random.rand(N) area = (30 * np.random.rand(N))**2 # 0 to 15 point radii plt.scatter(x, y, s=area, c=colors, alpha=0.5) # 設置顏色及透明度 plt.title("RUNOOB Scatter Test") # 設置標題 plt.show()
顯示結果如下:
顏色條 Colormap
Matplotlib 模塊提供了很多可用的顏色條。
顏色條就像一個顏色列表,其中每種顏色都有一個範圍從 0 到 100 的值。
下麵是一個顏色條的例子:
設置顏色條需要使用 cmap 參數,預設值為 'viridis',之後顏色值設置為 0 到 100 的數組。
實例
import matplotlib.pyplot as plt import numpy as np x = np.array([5,7,8,7,2,17,2,9,4,11,12,9,6]) y = np.array([99,86,87,88,111,86,103,87,94,78,77,85,86]) colors = np.array([0, 10, 20, 30, 40, 45, 50, 55, 60, 70, 80, 90, 100]) plt.scatter(x, y, c=colors, cmap='viridis') plt.show()
顯示結果如下:
如果要顯示顏色條,需要使用 plt.colorbar() 方法:
實例
import matplotlib.pyplot as plt import numpy as np x = np.array([5,7,8,7,2,17,2,9,4,11,12,9,6]) y = np.array([99,86,87,88,111,86,103,87,94,78,77,85,86]) colors = np.array([0, 10, 20, 30, 40, 45, 50, 55, 60, 70, 80, 90, 100]) plt.scatter(x, y, c=colors, cmap='viridis') plt.colorbar() plt.show()
顯示結果如下:
九、Matplotlib 柱形圖
我們可以使用 pyplot 中的 bar() 方法來繪製柱形圖。
bar() 方法語法格式如下:
matplotlib.pyplot.bar(x, height, width=0.8, bottom=None, *, align='center', data=None, **kwargs)
參數說明:
x:浮點型數組,柱形圖的 x 軸數據。
height:浮點型數組,柱形圖的高度。
width:浮點型數組,柱形圖的寬度。
bottom:浮點型數組,底座的 y 坐標,預設 0。
align:柱形圖與 x 坐標的對齊方式,'center' 以 x 位置為中心,這是預設值。 'edge':將柱形圖的左邊緣與 x 位置對齊。要對齊右邊緣的條形,可以傳遞負數的寬度值及 align='edge'。
**kwargs::其他參數。
以下實例我們簡單實用 bar() 來創建一個柱形圖:
實例
import matplotlib.pyplot as plt import numpy as np x = np.array(["Runoob-1", "Runoob-2", "Runoob-3", "C-RUNOOB"]) y = np.array([12, 22, 6, 18]) plt.bar(x,y) plt.show()
顯示結果如下:
垂直方向的柱形圖可以使用 barh() 方法來設置:
實例
import matplotlib.pyplot as plt import numpy as np x = np.array(["Runoob-1", "Runoob-2", "Runoob-3", "C-RUNOOB"]) y = np.array([12, 22, 6, 18]) plt.barh(x,y) plt.show()
顯示結果如下:
自定義各個柱形的顏色:
實例
import matplotlib.pyplot as plt import numpy as np x = np.array(["Runoob-1", "Runoob-2", "Runoob-3", "C-RUNOOB"]) y = np.array([12, 22, 6, 18]) plt.bar(x, y, color = ["#4CAF50","red","hotpink","#556B2F"]) plt.show()
顯示結果如下:
設置柱形圖寬度,bar() 方法使用 width 設置,barh() 方法使用 height 設置 height
實例
import