从零开始学matplotlib画图(一): 极速上手
首先,不能馬上讓人上手的教程,就是耍流氓。
我們都知道,matplotlib是Python下一個極其強大的作圖庫。但是它雖然強大,卻有著陡峭的學習曲線,想要用它來靈活地作圖需要花費大量的學習時間,這也是為什么近年來基于matplotlib封裝的Seaborn等作圖庫迅速流行起來的原因。
我們希望能迅速上手一個工具并畫出美觀而有說服力、有解釋力的圖形,而不是花費大量的時間卻仍然飄在云里霧里。
matplotlib有兩種語言風格,一種是沿襲自MatLab的命令式風格,一種是Python的面向對象風格。不同的作圖風格有時會讓我們感到混亂,這也在無形中增加了我們的學習難度。不過我們今天不是來討論風格優劣的,我們今天的目的是熟悉matplotlib的基本作圖函數,以達到快速上手Python可視化的目的。
今天,我們先拋卻又臭又長的官方文檔,拋卻龐大的作圖知識體系,嘗試在30分鐘內掌握基本的作圖能力。
我們先從最常用的作圖函數以及樣式調整函數學起,其他的讓它們先玩兒去吧。
歡迎大家關注我的個人博客【數洞】 【備用站】
1. plot()
plot()函數包含了很多基礎的繪圖功能,這里我們用它來繪制線圖,用以展現數據的變化趨勢。
import matplotlib.pyplot as plt import numpy as np# 生成數據 x = np.linspace(0, 10, 1000) y = np.sin(x)# 使用plt.plot()繪圖 # lw ~ line width,用于設置線條寬度 # '-r'是說線條使用正常的連續曲線,顏色使用紅色 # label設置線條的標簽,我們會在圖例中看到它 plt.plot(x, y, ls='-r', lw=2, label='sin(x)') plt.legend() plt.show()2. scatter()
scatter()函數用以繪制散點圖,我們常用它來觀察變量間的相關性。
import matplotlib.pyplot as plt import numpy as np# 生成數據 x = np.linspace(0, 10, 100) y = np.random.rand(100)# 使用plt.scatter()繪圖 # c ~ color,用于設置顏色 # alpha用于控制透明度 plt.scatter(x, y, c='g', alpha=0.5, label='scatters') plt.legend() plt.show()3. xlim() / ylim()
這兩個函數用于設置坐標軸的數值顯示范圍。
import matplotlib.pyplot as plt import numpy as np# 生成數據 x = np.linspace(0, 10, 100) y = np.random.rand(100)# 使用scatter繪圖 plt.scatter(x, y, label='scatters') plt.legend()# 使用xlim()/ylim()調整坐標軸 # 我們需要上下(左右)兩個邊界的數值 plt.xlim(2, 10) plt.ylim(-0.2, 1.2) plt.show()可以看到,雖然我們數據的范圍是x ∈ [0, 10], y ∈ [0, 1],但在我們的強烈要求下,圖片上只展示出了其中的一部分。
4. xlabel() / ylabel()
顧名思義,這兩個函數用于設置坐標軸的標簽。
import matplotlib.pyplot as plt import numpy as np# 生成數據 x = np.linspace(0, 10, 100) y = np.sin(x)# 使用scatter繪圖 # ls ~ line style,用于設置線條類型 plt.plot(x, y, ls='-.', lw=2, c='g', label='sin(x)') plt.legend()# 使用xlim()/ylim()調整坐標軸 plt.xlabel('x-axis') plt.ylabel('y-axis') plt.show()5. grid()
就喜歡這么直白的命名,grid()函數正是用于設置圖形中的網格線。
import matplotlib.pyplot as plt import numpy as np# 生成數據 x = np.linspace(0, 10, 100) y = np.sin(x)# 使用scatter繪圖 plt.plot(x, y, ls='-.', lw=2, c='c', label='sin(x)') plt.legend()# 使用grid()調整網格線 # linestyle用于設置網格的線條類型,color用于設置網格的線條顏色 plt.grid(linestyle=':', color='r')plt.show()啊,好丑。
6. axhline() / axvline()
ax ~ axis
h ~ horizontal,水平的
v ~ vertical,垂直的
組合起來看,我們可以猜到,這兩個函數分別用于設置水平參考線和垂直參考線。
import matplotlib.pyplot as plt import numpy as np# 生成數據 x = np.linspace(0, 10, 100) y = np.sin(x)# 使用scatter繪圖 plt.plot(x, y, ls='-.', lw=2, c='c', label='sin(x)') plt.legend()# 這里的參數跟之前幾個函數的參數類似,不再贅述 plt.axhline(y=0, c='r', ls='--', lw=2) plt.axvline(x=5, c='g', ls='-.', lw=2)plt.show()7. axhspan() / axvspan()
ax ~ axis
h ~ horizontal,水平的
v ~ vertical,垂直的
span ~ 跨度,區間,范圍
這兩個函數分別用于設置平行于x軸/y軸的參考區域。
import matplotlib.pyplot as plt import numpy as np# 生成數據 x = np.linspace(0, 10, 100) y = np.sin(x)# 使用scatter繪圖 plt.plot(x, y, ls='-.', lw=2, c='c', label='sin(x)') plt.legend()# xmin/xmax/ymin/ymax用于設置區間范圍 # facecolor用于設置區域顏色 # alpha用于設置透明度 plt.axhspan(ymin=-0.25, ymax=0.25, facecolor='purple', alpha=0.3) plt.axvspan(xmin=4, xmax=6, facecolor='g', alpha=0.3)plt.show()8. annotate()
這個函數就是為了在圖形中添加指向性注釋文本,為了能靈活調整注釋的位置以及指示箭頭的樣式,這個函數提供了豐富的可選參數,想要熟練使用這一函數需要我們花一些功夫去探索。
import matplotlib.pyplot as plt import numpy as np# 生成數據 x = np.linspace(0, 10, 100) y = np.sin(x)# 使用scatter繪圖 plt.plot(x, y, ls='-.', lw=2, c='c', label='sin(x)') plt.legend()# 這里的參數跟之前幾個函數的參數類似,不再贅述 plt.axhspan(ymin=-0.25, ymax=0.25, facecolor='purple', alpha=0.3) plt.axvspan(xmin=4, xmax=6, facecolor='g', alpha=0.3)# 使用annotate()添加注釋 plt.annotate('maximum',xy = (np.pi * 3 / 2, -1), xytext = (np.pi * 3 / 2 - 0.6, -0.7),weight = 'bold', color = 'r',arrowprops = {'arrowstyle': '->','connectionstyle': 'arc3','color': 'r','alpha': 0.3})plt.show()可以看到,我們為(π/2, -1)位置的最低點加了一個“minimum”的紅色文本注釋,這里邊我們用到了以下的配置項,它們的含義是:
-
xy: 指示點的坐標,即我們希望注釋箭頭指向的點的坐標
-
xytext: 注釋文本左端的坐標(不是文本中心的坐標)
-
weight: 注釋文本的字體粗細風格,bold是粗體,正常粗細則用regular
-
color: 注釋文本的顏色
-
arrowprops: arrow + props(properties),箭頭屬性,字典格式
- arrowstyle: 箭頭類型
- connectionstyle: 連接類型
- color: 箭頭顏色
-
…
更多的參數大家可以查閱文檔,里邊有詳細的介紹。至于查閱文檔,為大家推薦一個軟件,在Mac下有一個叫Dash的軟件,簡直是文檔查閱神器,在Linux和Windows下有一個叫Zeal的替代軟件。強烈推薦沒用過的同學體驗下。
9. text()
這個函數同樣是用于圖形中的注釋,但它跟annotate()的區別是它用于添加無指向性注釋文本,也就是不帶指向性箭頭的文本注釋。
import matplotlib.pyplot as plt import numpy as np# 生成數據 x = np.linspace(0, 10, 100) y = np.sin(x)# 使用scatter繪圖 plt.plot(x, y, ls='-.', lw=2, c='c', label='sin(x)') plt.legend()# 這里的參數跟之前幾個函數的參數類似,不再贅述 plt.axhspan(ymin=-0.25, ymax=0.25, facecolor='purple', alpha=0.3) plt.axvspan(xmin=np.pi*3/2-1, xmax=np.pi*3/2+1, facecolor='g', alpha=0.3)# 使用annotate()添加注釋 plt.text(np.pi * 3 / 2 - 0.7, -0.7, 'minimum', weight='regular', color='r', fontsize=12) plt.text(np.pi * 3 / 2 - 1, 0.7, 'y=sin(x)', weight='regular', color='r', fontsize=16)plt.show()由于沒有了箭頭,我們就不需要那個字典參數了,同時坐標等參數都更直接地使用x、y等來表達。我們使用fontsize參數設置了注釋文本的大小。
10. title()
這個函數最簡單,就是用于設置圖形的標題。
import matplotlib.pyplot as plt import numpy as np# 生成數據 x = np.linspace(0, 10, 100) y = np.sin(x)# 使用scatter繪圖 plt.plot(x, y, ls='-.', lw=2, c='c', label='sin(x)') plt.legend()# 設置標題 plt.title('A Sine Curve')plt.show()11. legend()
這個函數我們已經見過好多次了,它用于添加圖例。
10. title()
這個函數最簡單,就是用于設置圖形的標題。
import matplotlib.pyplot as plt import numpy as np# 生成數據 x = np.linspace(0, 10, 100) y = np.sin(x)# 使用scatter繪圖 plt.plot(x, y, ls='-.', lw=2, c='c', label='sin(x)')# 控制圖例位置 plt.legend(loc='lower right')# 設置標題 plt.title('A Sine Curve')plt.show()這里我們將圖例放在了右下角,圖例的位置使用loc參數來控制:
- upper left: 左上角
- upper center: 中上
- upper right: 右上角
- lower left: 左下角
- lower center: 中下
- lower right: 右下角
12. 小挑戰
在最后,我們用一個小挑戰來回顧下之前的內容:
import matplotlib.pyplot as plt import numpy as np from matplotlib import cm as cm# 生成數據 x = np.linspace(0.5, 3.5, 100) y = np.sin(x) y1 = np.random.randn(100)# 創建圖形并設置大小 plt.figure(figsize=(12, 8))# 散點圖 plt.scatter(x, y1, c='0.5', label='scatters')# sin(x)圖 plt.plot(x, y, '--g', lw=2, label='sin(x)')# 樣式調整 # 去掉圖形上邊和右側的邊框 for spine in plt.gca().spines.keys():if spine == 'top' or spine == 'right':plt.gca().spines[spine].set_color('none')# 設置坐標軸上的刻度線位置(其實這里的設置跟默認一樣) plt.gca().xaxis.set_ticks_position('bottom') plt.gca().yaxis.set_ticks_position('left')# 將刻度線放在坐標軸內側 plt.tick_params(direction = 'in')# 設置坐標軸范圍 plt.xlim(0, 4) plt.ylim(-3, 3)# 設置軸標簽 plt.xlabel('X 軸') plt.ylabel('Y 軸')# 設置網格線 plt.grid(True, ls=':', color='r', alpha=0.5)# 添加水平參考線 plt.axhline(y=0, c='r', ls='--', lw=2)# 添加垂直參考區間 plt.axvspan(xmin=1, xmax=2, facecolor='g', alpha=0.1)# 添加sin(x)的最高點注釋 plt.annotate('maximum', xy = (np.pi/2, 1), xytext = (np.pi/2, 1.3), weight = 'regular', color = 'r',fontsize = 12,arrowprops = {'arrowstyle': '->','connectionstyle': 'arc3','color': 'r'})# 添加y軸邊框注釋 plt.annotate('spines', xy = (0, -2.5), xytext = (0.25, -2.3), weight = 'regular', color = 'c',fontsize = 12,arrowprops = {'arrowstyle': '->','connectionstyle': 'arc3','color': 'c'})# 添加x軸邊框注釋 plt.annotate('', xy = (0.25, -3), xytext = (0.37, -2.4), arrowprops = {'arrowstyle': '->','connectionstyle': 'arc3','color': 'c'})# 添加一個指向tick的箭頭 plt.annotate('',xy = (3.5, -2.98),xytext = (3.6, -2.7),arrowprops = {'arrowstyle': '->','connectionstyle': 'arc3','color': 'c'})# 在上邊的箭頭旁添加注釋文字 plt.text(3.6, -2.7, "'|' is tickline", weight='bold', color='c') plt.text(3.6, -2.9, "3.5 is ticklabel", weight='bold', color='c')# 設置標題 plt.title('Structure of matplotlib')# 添加圖例 plt.legend()# 展示圖形 plt.show()可以看到,我們配置了很多小細節,是不是很有成就感?
沒錯,matplotlib就是這么強大,這還僅僅是它的冰山一角呢!
好了,以上就是用來作圖以及調整圖形樣式的十來個常用的函數,本文嚴重參考劉大成先生的《Python數據可視化之matplotlib實踐》一書,這本書的組織形式是截止目前我認為講解matplotlib庫中最清晰、最適合新手的,強烈推薦。
總結
以上是生活随笔為你收集整理的从零开始学matplotlib画图(一): 极速上手的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Where storage lives(
- 下一篇: Ad Hoc网络路由协议