2017年9月10日 星期日

Python_Matplotlib

Python_Matplotlib

IMPORT

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

載入資料集

如果想要多點測試數據的話,就自己弄個亂數!
產生500個亂數,再把顏色©部份改成t就可以
numpy可以改天整理好再po上來。
n = 500
x = np.random.normal(0,1,n)
y = np.random.normal(0,1,n)
t = np.arctan2(y,x)
或是
x = [1, 2, 3, 4, 5, 6, 7, 8]
y = [8, 7, 6, 5, 4, 3, 2, 1]

共用設置

標籤、圖面、標題…等產生圖面的時候會共同使用到的!
要用什麼就執行什麼,大概就是疊床架屋的概念,在你執行plt.show()之前,你執行的每一步都會被記錄下來!
要產生網格,那就執行plt.grid(),要隱藏x軸座標,那就執行plt.xticks(())!
要預設就好,你也可以丟給xy給scatter直接show。
plt.scatter(x,
            y, 
            label='Test', 
            color='red', 
            s=25,     
            marker="o")
plt.xlim(0,20)  #  x軸的座標軸範圍
plt.ylim(0,20)  #  y軸的座標軸範圍
plt.xlabel('xlabel')  #  產生x軸的標籤
plt.ylabel('ylabel')  #  產生y軸的標籤
plt.title('Title')  #  產生圖面的標題
plt.legend(loc='upper right')  #  圖標
plt.grid()  #  顯示網格
plt.show()  #  產生圖面

如果故意讓xlim的範圍值小於來源值行不行?

當然行,只是圖看起來就是上面的樣子了!切掉!
所以,可以配合max與min來做座標範圍的設置,或是乾脆不設置了,讓系統自帶也可以!
簡單說,lib的部份專家都寫的很好了,交給lib自己來,不喜歡的再來微調就可以了。
plt.xticks(())  #  隱藏x軸座標
plt.yticks(())  #  隱藏y軸座標

plt.figtext(x,y,'文字',ha='right',va='bottom')
#  圖表上添加文字
#  x:x軸,y:y軸,ha:水平,va:垂直
plt.text(x,y,'文字',fontsize = 12)
#  x:x軸,y:y軸
plt.tight_layout()  #  保證所有元素都會出現圖表上
plt.savefig('aaa.格式')  #  保存圖表

plt.legend

plt.legend用於產生圖標!
透過loc可以調整上下左右中
用法不少,可參閱原文說明
設定plt.legend(loc=‘best’)可以避免遮住圖表線條
plt.legend(loc='best',  #  圖標位置
           framealpha=0.5  #  透明度0-1)

scatter:散布(點)圖

透過散布圖可以很快的發現到數據密度集中度以及分佈,是數據分析的時候常用的一個圖。
在做線性迴歸時會配合原始資料的散布以及那條心目中的線呈現來做一個圖面判斷
x = [1, 2, 3, 4, 5, 6, 7, 8]
y = [8, 7, 6, 5, 4, 3, 2, 1]
plt.scatter(x,
            y,
            label='ScatterPic',
            c='red',      
            s=50,
            marker='X',
            alpha=0.5 ,
            edgecolors='green')
plt.legend()            
plt.show()       

資料多比較有fu
基本上,你不想設定太多的話,就給它xy也是可以直接執行。
但是如果希望透過一點不一樣來呈現,那就是像開頭說的,再依參數微調。

參數說明

基本上參數不止這些,只是挑較常用的說明而以!
x:x軸的座標資料集
y:y軸的座標資料集
label:標籤(搭配plt.legend())
c:點點的顏色
s:點點的大小
marker:點點的圖示
alpha:透明度,介於0-1
edgecolors:外環的顏色

marker:點點的圖示種類

更多的點點在原文連結
代碼 圖示 代碼 圖示
‘o’
‘v’ ‘^’ ![] (https://i.imgur.com/GhxOnXS.png)
‘<’ ‘>’
‘8’ ‘s’
‘p’ ‘*’
‘h’ ‘H’
‘D’ ‘d’
‘P’ ‘X’

bar:直條圖

經典圖,不能不會用!
labels = ['A', 'B', 'C', 'D']  #  直條圖的標籤
foo_val = [10, 3, 5, 7]  #  資料來源
ind = np.arange(len(labels))  #  直條圖的位置(0, 1, 2, 3)
plt.xticks(ind, labels)  #  x軸的座標
plt.bar(left=ind, 
        height=foo_val, 
        width=0.5,
        color='green',
        edgecolor='red')
plt.show()        

圖框的大小記得可以透過plt.xlim(),plt.ylim()來設置!

參數說明

left:設置x的起始座標
height:高度,即數值
width:直條圖寬度
bottom:y軸的初始值
color:直條圖的顏色
edgecolor:直條圖的外圍顏色
參數還有很多,只是常用的拉出來說明而以。

群組直條圖

labels = ['A', 'B', 'C', 'D']  #  直條圖的標籤
foo_val = [10, 3, 5, 7]  #  資料來源
foo_val2 = [5, 4, 3, 2]  #  資料來源2
ind = np.arange(len(labels))  #  直條圖的位置(0, 1, 2, 3)
bar_width=0.4  #  間隔的產生
plt.bar(left=ind-bar_width,   #  讓一個寬度給他先入-0.4,0.6,1.6,2.6
        height=foo_val, 
        width=bar_width,
        color='green',
        edgecolor='red')
plt.bar(left=ind, 
        height=foo_val2, 
        width=bar_width,
        color='blue',
        edgecolor='white')  
plt.show()   

接下來要上標籤
所以再來調整一下!
#  產生y軸標用
def ylabel(Bars): 
    for Bar in Bars:
        height = Bar.get_height()  #  透過迴圈每個bar都加上去
        #  matplotlib.pyplot.text(x, y, s, fontdict=None, withdash=False, **kwargs)
        #  xy是座標,s是文字!透過迴圈每個bar都加上去!
        plt.text(Bar.get_x()+Bar.get_width()/5., 1.02*height, '%s' % float(height))
#  記得每個圖都是一個一個堆出來的吧!        
        
labels = ['A', 'B', 'C', 'D']  #  直條圖的標籤
foo_val = [10, 3, 5, 7]  #  資料來源
foo_val2 = [5, 4, 3, 2]  #  資料來源2
ind = np.arange(len(labels))  #  直條圖的位置(0, 1, 2, 3)
bar_width=0.4  #  間隔的產生
Bars = plt.bar(left=ind-bar_width,   #  讓一個寬度給他先入-0.4,0.6,1.6,2.6
        height=foo_val, 
        width=bar_width,
        color='green',
        edgecolor='red',
        label='GreenBar')
ylabel(Bars)  #  產生座標說明       
Bars = plt.bar(left=ind, 
        height=foo_val2, 
        width=bar_width,
        color='blue',
        edgecolor='white',
        label='BlueBar')   
ylabel(Bars)  #  產生座標說明   
#  調整標籤        
plt.yticks(range(15))  #  拉大y軸
plt.xticks(ind-0.2,labels)  #  位置、標籤
plt.title('Matplotlib Bar')
plt.legend(loc='best')  #  顯示標籤
plt.grid(axis='y', ls=':')  #  只讓y軸有線,並且調整格線
plt.show()   

這樣就人模人樣了!

堆疊直條圖



橫條圖

直線

原文連結
plt.plot(x,
         y,
         marker='x',
         c='red',
         ms=0.5,
         ls='dashdot',
         lw=1)

plt.show()

參數說明

x:1D陣列來源資料
y:1D陣列來源資料
marker:點點的型狀
c:線的顏色
ms:點點的大小
ls:線的型狀
lw:線的寬度
參數還有很多,只是常用的拉出來說明而以。

散布(點)圖矩陣

參數說明

相關矩陣

參數說明

加入子圖表

如果要像股票一樣,有個大表可能是個股,然後小表是目前的股市表現!
#  定義一個大相框
fig = plt.figure(figsize=(8, 4))
#  你要的個股資料
#  左下(0.1, 0.1)與右上(0.8, 0.8)的位置
#  如果設置1就全開紙了
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])
#  加入股市表現
ax = fig.add_axes([0.15, 0.15, 0.3, 0.3])
plt.show()

多圖表

其實,不只是在加入子圖表的時候使用,一般情況下也是可以這樣子使用。
又或者,現在在網路看到的大部份範例(含原廠文件)也是這樣子用!
fig, ax = plt.subplots(figsize=(8, 4),  #  大相框尺寸
                       dpi=100,  #  每英吋幾個點
                       tight_layout=True,  #  把所有東西限縮在大相框內
                       linewidth=1,  #  寬
                       edgecolor='r')  #  大相框顏色
在呼叫subplots的時候,會回傳一個有一組axes的figure物件
fig(figure):把它想成是一個有N格相框的『大相框』!
ax(axes或稱軸):把它想成是上面N格相框中的其中一個『相框』!
只是大部份的時候我們用的都是一格相框罷了!
接下來的動作沒有不一樣!
scatter = ax.scatter(x, y, label='TestScatter')
ax.legend(loc='best')
ax.set_title('TestScatter')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.grid(True)
fig.text(0.995,0.01,'test',ha='right',va='bottom')
fig.tight_layout()
plt.show()

所以,當我們明白了,原來figure是一個大相框可以給我放入N張照片的時候,還客氣什麼?
fig, ax = plt.subplots(nrows=3,  #  要三個橫軸
                       ncols=1,  #  要一個直軸
                       sharex=True,  #  是否共用x軸座標
                       sharey=True,  #  是否共用y軸座標
                       figsize=(8,4))
ax0 = ax[0]
ax0.scatter(x,y, label='axes0')
ax0.legend(loc='best')
ax1 = ax[1]
ax1.scatter(x,y, label='axes1')
ax1.legend(loc='best')
ax2 = ax[2]
ax2.scatter(x,y, label='axes2')
ax2.legend(loc='best')
plt.show()

還有沒有其它的方法?
有的!
#  當你做了plt.subplot的時候,你把這個控制權拉到上面呼叫的圖表。
plt.subplot(221)
plt.scatter(x, y, label='221')
plt.legend(loc='best')
plt.subplot(222) 
plt.scatter(x, y, label='222')
plt.legend(loc='best')
plt.subplot(212) 
plt.scatter(x, y, label='211')
plt.legend(loc='best')
plt.show()

差別在於一個是用全域的plt來做操作,一個是以物件導向的方式來操作!
都可以做,挑一個吧。

左右箭頭

官方說明
import matplotlib.pylab as plt
import matplotlib.patches as patches

#  設置一個大相框,大小為8*8
fig1 = plt.figure(figsize=[8,8])
#  加入一張照片
ax1 = fig1.add_subplot(111,aspect = 'equal')
ax1.add_patch(
    patches.Arrow(0.45,0.5,-0.25,0.25,width=0.3,color='green',alpha = 0.5)
    )  #  patches.Arrow(x, y, dx, dy, width=1.0, **kwargs)    
ax1.add_patch(
    patches.Arrow(0.5,0.45,0.25,-0.25,width=0.3,color='red',alpha = 0.5)
    )  #  patches.Arrow(x, y, dx, dy, width=1.0, **kwargs)
plt.show()

參數說明

由x往dx、y往dy方向去指向,所以指左dx是-0.25,指下的dy是-0.25
width為箭頭胖瘦控制
記得下去操作一次感受差異

沒有留言:

張貼留言