最近幫朋友用python畫了一些圖,發現對這塊不是很熟悉。每次得不斷的在網上查資料,所以想着好好整理一些基本的圖形構造方法。現在流行的python製圖方法就是matplotlib了,我們也是用這個,我下面會依次介紹曲線圖,散點圖,直方圖以及多子圖的方法。此處是代碼
曲線圖
凡是連續的曲線圖都是用plt.plot()函數繪製的,以下是一段最簡單的代碼:
# 使用plt.plot()繪圖。"lw"-線條的寬度;"ls"-線條的風格樣式:"-", "--", '-.', ':'
# label-曲線對應的標籤,一般在四個邊角出現;color-曲線對應的顏色:'b', 'g', 'r', 'c', 'm', 'y', 'k', 'w'
# marker-標記風格,'o', '*, '+'
plt.plot(x, y, lw=2, ls=':', label="xinge", color="r", marker="*")
# 設置圖案位置
plt.legend()
plt.show()
plot()函數裏的參數我都備註的很清楚了,以下是生成的圖片:
這兒還得記住一點:plt.legend()這個函數是必須得加的,否則你的label備註就顯示不出來了。比如我的label="xinge",不加legend()函數就看不見啦。
- 調整座標軸的數值顯示範圍
plt.xlim(xmin=-2, xmax=12)
plt.ylim(ymin=-2, ymax=2)
2. 設置座標軸的名稱.
# 設置座標軸的名稱.fontsize-字體大小;horizontalalignment-座標軸名稱排列的方向:center’, ‘right’, ‘left’
plt.xlabel("x-axis", fontsize=16, horizontalalignment="center")
plt.ylabel("y-axis", fontsize=16, horizontalalignment="center")
3. 設置水平參考線和垂直參考線
plt.axhline(y=0, lw=2, ls="--", color="g")
plt.axvline(x=0, lw=2, ls="--", color="g")
4. 使用annotate()對曲線添加註釋
# 使用annotate()對曲線添加註釋
# xy: 指示點的座標,即我們希望註釋箭頭指向的點的座標;
# xytext: 註釋文本左端的座標(不是文本中心的座標)
# weight: 註釋文本的字體粗細風格,'light', 'normal', 'regular', 'book', 'medium', 'roman'
# color: 註釋文本的顏色
# arrowstyle: 箭頭類型,'->', '|-|', '-|>'
# connectionstyle: 連接類型,'arc3', 'arc', 'angle', 'angle3'
plt.annotate('maximum',
xy=(np.pi * 3 / 2, -1),
xytext=(np.pi * 3 / 2 - 0.6, -0.7),
weight='light',
color='r',
arrowprops={
'arrowstyle': '->',
'connectionstyle': 'arc3',
'color': 'r',
'alpha': 0.3
})
5. 使用text生成絕對位置的註釋
plt.text(np.pi * 3 / 2 - 0.7, -1.7, s='minimum', weight='regular', color='r', fontsize=12)
就大概介紹這些基礎的函數,這是最終生成的圖片:
散點圖
畫散點圖使用plt.scatter()函數,裏面的參數會和plot()函數有些區別,其他的方法則是都一樣了。
plt.scatter(x, y, lw=2, marker="o", label="xinge", color="r")
# 設置圖案位置
plt.legend()
plt.show()
以下是效果圖。
直方圖
直方圖使用plt.hist()方法的。說實話顯示圖形很簡單,也是隻需要一行代碼,如下所示:
# histtype: 可選{'bar', 'barstacked', 'step', 'stepfilled'}之一,默認爲bar,推薦使用默認配置,step使用的是梯狀,
plt.hist(x, bins, color='deepskyblue', width=width, alpha=0.7, histtype="bar")
但一般情況下,我們是使用連線將直方圖的頻數給連接起來。其實這也好做,只要我們獲得了直方圖中每個小圖的數據以及相應頻數(x, y座標),我們就能用plt.plot()函數給勾勒出來了。而plt.hist()函數正好是可以返回每個小圖的頻數的。
x = np.random.randint(0, 100, 100) # 生成【0-100】之間的100個數據,即 數據集
bins = np.arange(0, 101, 10) # 設置連續的邊界值,即直方圖的分佈區間[0,10],[10,20]...
width = 10 # 柱狀圖的寬度
# 生成直方圖
# density: bool,默認爲false,顯示的是頻數統計結果,爲True則顯示頻率統計結果
# histtype: 可選{'bar', 'barstacked', 'step', 'stepfilled'}之一,默認爲bar,推薦使用默認配置,step使用的是梯狀,
frequency_each, _, _ = plt.hist(x, bins, color='deepskyblue', width=width, alpha=0.7, histtype="bar")
plt.xlabel('scores')
plt.ylabel('count')
plt.xlim(0, 100) # 設置x軸分佈範圍
# 利用返回值來繪製區間中點連線
plt.plot(bins[1:] - (width // 2), frequency_each, color='palevioletred')
plt.show()
效果如下:
多子圖
其實就是plt.figure()函數加上subplot()函數。請注意:定義一張畫布後,如果是要顯示多張子圖,那麼一定要讓這塊畫布將每個子圖都添加進去,否則不會顯示出來。
x = np.linspace(0, 5)
y1 = np.sin(np.pi * x)
y2 = np.sin(np.pi * x * 2)
# 直接用plt.figure()顯示不了子圖
plt.figure(num="xinge", figsize=(10, 10))
# subplot()函數返回兩個對象。一個是fig畫布,一個是ax子圖:ax.plot()
fig, ax = plt.subplots(1, 2)
ax[0].plot(x, y1, ls="-", label="sin(pi*x)", c="b")
# 子圖設置x,y軸標籤時寫法不一樣。set_xlabel()
ax[0].set_xlabel("x1 label")
ax[0].set_ylabel("y1 value")
ax[0].legend()
ax[1].plot(x, y2, ls="-", label="sin(pi*x*2)", c="r")
ax[1].set_xlabel("x1 label")
ax[1].set_ylabel("y2 value")
ax[1].legend()
plt.show()
效果如下: