Matplotlib畫圖小結

最近幫朋友用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()函數就看不見啦。

  1. 調整座標軸的數值顯示範圍
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()

效果如下:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章