1. 程式人生 > >Matplotlib隨記1

Matplotlib隨記1

face port 容易 是我 ins ylabel set 兩種方法 結果

Matplotlib概況

在我們進行機器學習分析的時候,通常需要將我們所需要的結果進行圖像化表示出來,以方便我們可以更加形象的看到數據變化大趨勢。在我進行尋找相應的工具時,我發現了Matplotlib是一個相當好的工具,主要是因為Matplotlib有很強大的功能,它可以為我們匯出各種美麗的圖形,比如線圖,散點圖,等高線圖,條形圖,柱狀圖,3D圖形,甚至是動畫圖像等等,我們可以根據自己的需求繪出自己所需要的圖形。比如說,以下幾個圖形就是我們通過Matplotlib進行繪制的

技術分享 技術分享

技術分享

Matplotlib安裝

俗話說,“工欲善其事必先利其器”,在學習matplotlib之前,必先安裝好matplotlib相關環境,我用的是ubuntu16.04系統,安裝相對比較簡單。打開控制臺窗口,在窗口中輸入:

#python 3+ 請使用以下代碼
$ sudo apt-get install python3-matplotlib
#python 2+ 請使用以下代碼
$ sudo apt-get install  python-matplotlib

在安裝好matplotlib之後,我們就可以盡興的翺翔在matplotlib的海洋裏面了

matplotlib基本用法

首先我們要使用import 導入matplotlib,在使用matplotlib時,我們通常不需要導入matplotlib整個模塊,而是只需導入matplotlib中的pyplot這一個模塊即可,並簡寫成plt;使用import 導入模塊numpy,並簡寫成np

import matplotlib.pyplot as plt
import numpy as np

使用np.linspace定義x:範圍是(-1,1);個數是50,仿真一位數據組(x,y)表示曲線1

x=np.linspace(-1,1,50)
y=2*x + 1

使用plt.figure定義一個圖像窗口,使用plt.plot畫(x,y)曲線。使用plt.show顯示圖像

plt.figure()
plt.plot(x,y)
plt.show()

完整代碼如下:

import matplotlib.pyplot as plt
import numpy as np
x=np.linspace(-1,1,50)
y
=2*x + 1 plt.figure() plt.plot(x,y) plt.show()

繪成的圖像如下:

技術分享

figure線條

在上面的基礎上,使用plt.figure()定義一個圖像窗口:編號為3;大小為(8,5)。使用plt.plot畫(x,y2)曲線。使用plt.plot畫(x,y1)曲線,曲線的顏色屬性(color)為紅色;曲線的寬度(linewidth)為1.0;曲線的類型(linestyle)為虛線。使用plt.show顯示圖像

plt.figure(num=3,figsize=(8,5),)
plt.plot(x,y2)
plt.plot(x,y1,color=red,linewidth=1.0,linestyle=--)

完成代碼為:

import matplotlib.pyplot as plt
import numpy as np

x=np.linspace(-3,3,50)
y1=2*x +1
y2=x**2

plt.figure()
plt.plot(x,y1)

plt.figure(num=3,figsize=(8,5),)
plt.plot(x,y2)
plt.plot(x,y1,color=red,linewidth=1.0,linestyle=--)
plt.show()

其產生的圖像為:

技術分享技術分享

設置坐標軸

下面主要是介紹如何在matplotlib中如何設置坐標軸的範圍,單位長度,替代文字等等

使用plt.figure定義一個圖像窗口,使用plt.plot畫(x,y2)曲線。使用plt.plot畫(x,y1)曲線,曲線的顏色屬性(color)為紅色;曲線的寬度(linewidth)為1.0;曲線的類型(linestyle)為虛線

plt.figure()
plt.plot(x,y2)
plt.plot(x,y1,color=red,linewidth=1.0,linestyle=--)

使用plt.xlim設置x坐標軸範圍:(-1,2);使用plt.ylim設置y坐標軸範圍:(-2,3);使用plt.xlable設置x坐標軸名稱:‘I am X‘;使用plt.ylabel設置y坐標軸名稱:‘I am y‘;

plt.xlim((-1,2))
plt.ylim((-2,3))
plt.xlabel(I am x)
plt.ylabel(I am y)

使用np.linspace定義範圍及個數:範圍是(-1,2);個數是5.使用print函數打印出新定義的範圍。使用plt.xticks設置x軸刻度:範圍是(-1,2);個數是5

new_ticks=np.linspace(-1,2,5)
print(new_ticks)
plt.xticks(new_ticks)

使用plt.yticks設置y軸刻度以及名稱:刻度為[-2,-1.8,-1,1.22,3];對應刻度的名稱為[‘really bad‘,‘bad‘,‘normal‘,‘good‘,‘really good‘].使用plt,show顯示圖像。

plt.yticks([-2,-1.8,-1,1.22,3],[r$really\ bad$,r$bad$,r$normal$,r$good$,r$eally\ good$])

使用plt.gca獲取當前坐標軸的信息。使用.spines設置邊框:右側邊框;使用.set_color設置邊框顏色:默認白色;使用.spines設置邊框:上邊框;使用.set_color設置邊框顏色:默認白色;

ax=plt.gca()
ax.spines[right].set_color(none)
ax.spines[top].set_color(none)

下一步我們調整坐標軸。使用.xaxis.set_ticks_position設置x坐標刻度數字或名稱的位置:bottom(所有位置:top,bottom,both,default,none)

ax.xaxis.set_ticks_position(bottom)

使用.spines設置邊框:x軸;使用.set_position設置邊框位置:y=0的位置;(位置所有屬性:outward,axes,data)

ax.spines[bottom].set_position((data,0))

使用.yaxis.set_ticks_position設置y坐標刻度數字或者名稱的位置:left(所有位置:left,right,both,default,none)

ax.yaxis.set_ticks_position(left)

使用.spines設置邊框:y軸;使用.set_position設置邊框位置:x=0的位置;(位置所有屬性:outward,axes,data) 使用plt.show顯示圖像

ax.spines[left].set_position((data,0))
plt.show()

全部代碼如下:

import matplotlib.pyplot as plt
import numpy as np

x=np.linspace(-3,3,50)
y1=2*x + 1
y2=x**2

plt.figure()
plt.plot(x,y2)
plt.plot(x,y1,color=red,linewidth=1.0,linestyle=--)

plt.xlim((-1,2))
plt.ylim((-2,3))
plt.xlabel(I am x)
plt.ylabel(I am y)

new_ticks=np.linspace(-1,2,5)
print(new_ticks)
plt.xticks(new_ticks)

plt.yticks([-2,-1.8,-1,1.22,3],[r$really\ bad$,r$bad$,r$normal$,r$good$,r$eally\ good$])


ax=plt.gca()
ax.spines[right].set_color(none)
ax.spines[top].set_color(none)

ax.xaxis.set_ticks_position(bottom)

ax.spines[bottom].set_position((data,0))

ax.yaxis.set_ticks_position(left)
ax.spines[left].set_position((data,0))


plt.show()

結果如下:

技術分享

legend 圖例

在matplotlib中,我們通常使用其中的legend圖例來幫助我們展示每個數據對應的圖像名稱,從而更好的讓讀者認識你的數據結構

在這裏,我們對圖中的兩條線進行繪制,首先我們設置兩條線的類型信息(藍色實線和紅色虛線)

l1,=plt.plot(x,y2,label=linear line)
l2,=plt.plot(x,y1,color=red,lineWidth=1.0,linestyle=--,label=square line)

legend將要顯示的信息來自於上面代碼中的label,所以我們只需要簡單寫一下代碼,plt就能自動的為我們添加圖例

plt.legend(loc=upper right)

其中,參數 loc=‘upper right‘ 表示圖例將添加在圖中的右上角

但是,有時候我們想調整圖例的位置和名稱,比如如果我們想單獨修改之前的label信息,給不同類型的線條設置圖例信息,我們可以在plt.legend中輸入更多的參數。如果以以下這種形式添加legend,我們需要確保,在上面的代碼plt.plot(x,y2,label=‘linear line‘)和plt.plot(‘x,y1,label=‘‘square line‘)中有用變量l1,l2分別存儲起來。而且我們需要註意的是l1,l2要以逗號結尾,因為我們需要確保plt.plot()返回的是一個列表。

plt.legend(handles=[l1,l2],labels=[up,down],loc=best)

這樣我們就能分別重新設置線條對應的label了

其中,‘loc‘參數有很多,‘best‘表示自動分配最佳位置,其余的如下:

‘best’:0,
upper right : 1,
upper left : 2,
lower left : 3,
lower right : 4,
right : 5,
center left : 6,
center right : 7,
lower center : 8,
upper center : 9,
center : 10,

這部分的完整代碼如下:

import matplotlib.pyplot as plt
import numpy as np

x=np.linspace(-3,3,50)
y1=2*x + 1
y2=x**2

plt.figure()

plt.xlim((-1,2))
plt.ylim((-2,3))

new_ticks=np.linspace(-1,2,5)
print(new_ticks)
plt.xticks(new_ticks)

plt.yticks([-2,-1.8,-1,1.22,3],[r$really\ bad$,r$bad$,r$normal$,r$good$,r$eally\ good$])

l1,=plt.plot(x,y2,label=linear line)
l2,=plt.plot(x,y1,color=red,lineWidth=1.0,linestyle=--,label=square line)
#plt.legend(loc=‘upper right‘)
plt.legend(handles=[l1,l2],labels=[up,down],loc=best)
plt.show()

所產生的圖像如下:

技術分享

Annotation標註

在我們畫圖形需要對某些特殊地方進行標註時,我們可以使用annotation.matplotlib中的annotation中的兩種方法,一種是plt裏面的annotate,另外一種直接用plt裏面的text來寫標註

首先,我們繪制一條直線

import matplotlib.pyplot as plt
import numpy as np

x=np.linspace(-3,3,50)
y=2*x + 1

plt.figure(num=1,figsize=(8,5),)
plt.plot(x,y,)

之後,我們再移動坐標軸的位置

ax=plt.gca()
ax.spines[right].set_color(none)
ax.spines[top].set_color(none)
ax.spines[top].set_color(none)
ax.xaxis.set_ticks_position(bottom)
ax.spines[bottom].set_position((data,0))
ax.yaxis.set_ticks_position(left)
ax.spines[left].set_position((data,0))

之後,我們再標註出(x0,y0)的位置信息,用plt.plot([x0,x0,],[0,y0,],‘k--‘,linewidth=2.5)畫出一條垂直於x軸的虛線

x0=1
y0=2*x0 + 1;
plt.plot([x0,x0,],[0,y0,],k--,linewidth=2.5)
plt.scatter([x0, ],[y0, ],s=50,color=b)

再之後,我們對圖像添加一些註釋,比如我們可以對(x0,y0)這個點添加註釋

plt.annotate(r$2x+1=%s$ % y0 , xy = (x0,y0) , xycoords=data , xytext=(+30,-30) ,
    textcoords=offset points , fontsize=16 ,
    arrowprops=dict(arrowstyle=->,connectionstyle="arc3,rad=.2"))

我們也可以對文本中添加一些需要的註釋

plt.text(-3.7,3,r$This\ is\ the\ some\ text. \mu\ \sigma_i\ \alpha_t$,
    fontdict={size:16,color:r})

其中,-3.7和3是選取在文本中添加註釋的位置,空格需要用到轉字符\,fontdict設置字體。

其中,本部分的全部源碼是:

import matplotlib.pyplot as plt
import numpy as np

x=np.linspace(-3,3,50)
y=2*x + 1

plt.figure(num=1,figsize=(8,5),)
plt.plot(x,y,)

ax=plt.gca()
ax.spines[right].set_color(none)
ax.spines[top].set_color(none)
ax.spines[top].set_color(none)
ax.xaxis.set_ticks_position(bottom)
ax.spines[bottom].set_position((data,0))
ax.yaxis.set_ticks_position(left)
ax.spines[left].set_position((data,0))


x0=1
y0=2*x0 + 1;
plt.plot([x0,x0,],[0,y0,],k--,linewidth=2.5)
plt.scatter([x0, ],[y0, ],s=50,color=b)

plt.annotate(r$2x+1=%s$ % y0 , xy = (x0,y0) , xycoords=data , xytext=(+30,-30) ,
    textcoords=offset points , fontsize=16 ,
    arrowprops=dict(arrowstyle=->,connectionstyle="arc3,rad=.2"))

plt.text(-3.7,3,r$This\ is\ the\ some\ text. \mu\ \sigma_i\ \alpha_t$,
    fontdict={size:16,color:r})

plt.show()

所產生的圖片是:

技術分享

tick能見度

當我們生成圖片太多的時候,往往會出現圖片的內容較多,相互掩蓋的情況。我們可以通過設置相關內容的透明度來使圖片更加容易觀察,也即是通過本節中的bbox參數設置來調節圖像信息。

參考之前的例子,我們可以繪制出圖片的基本信息:

import matplotlib.pyplot as plt
import numpy as np

x=np.linspace(-3,3,50)
y=0.1*x

plt.figure()
plt.plot(x,y,linewidth=10)
plt.ylim(-2,2)

ax=plt.gca()
ax.spines[right].set_color(none)
ax.spines[top].set_color(none)
ax.spines[top].set_color(none)
ax.xaxis.set_ticks_position(bottom)
ax.spines[bottom].set_position((data,0))
ax.yaxis.set_ticks_position(left)
ax.spines[left].set_position((data,0))

然後我們對遮擋的圖像調節相關透明度,在本例中設置x軸和y軸的刻度數字來進行透明度設置

for label in ax.get_xticklabels() + ax.get_yticklabels():
    label.set_fontsize(12)
    label.set_bbox(dict(facecolor=white,edgecolor=None,alpha=0.7))

其中,label.set_fontsize(12)用來重新調整字體大小,set_bbox設置目的內容中關於透明度參數,facecolor調節box前景色,edgecolor設置邊框,在本處我們將邊框設置成無,alpha用來設置透明度。

在這一階段,其全部源碼為:

import matplotlib.pyplot as plt
import numpy as np

x=np.linspace(-3,3,50)
y=0.1*x

plt.figure()
plt.plot(x,y,linewidth=10)
plt.ylim(-2,2)

ax=plt.gca()
ax.spines[right].set_color(none)
ax.spines[top].set_color(none)
ax.spines[top].set_color(none)
ax.xaxis.set_ticks_position(bottom)
ax.spines[bottom].set_position((data,0))
ax.yaxis.set_ticks_position(left)
ax.spines[left].set_position((data,0))


for label in ax.get_xticklabels() + ax.get_yticklabels():
    label.set_fontsize(12)
    label.set_bbox(dict(facecolor=white,edgecolor=None,alpha=0.7))

plt.show()

所繪出來的圖片為:

技術分享

Matplotlib隨記1