目的:熟悉Matplotlib套件的使用



In [ ]:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
%matplotlib inline
sns.set()

以點加線的方式,於一張圖上畫sin(x),並給定x, y軸名稱,給定圖的標題為my plot


In [ ]:
plt.figure(figsize=(10,5))          # 建立一張圖,大小為5X10(英吋)

x=np.linspace(0,2.*np.pi,50)        # 建立線性空間x, 其範圍是0到2pi, 共有50個點
y=np.sin(x)                         # 建立y=sin(x)

plt.plot(x,y,marker='o',ms=5)       # 繪圖,資料點用圓圈標示,圓圈大小5
plt.xlabel('x')                     # 給x軸名稱
plt.ylabel('sin(x)')                # 給y軸名稱
plt.title('my plot')                # 給圖標題

plt.show()                          # 顯示該張圖

將linewidth(線寬)設定為零


In [ ]:
plt.plot(x,y,marker='o',lw=0)

更改x範圍至[0,$\pi$], y範圍至[0,1]


In [ ]:
plt.plot(x,y,marker='o',lw=0)

plt.xlim(0,np.pi,50)
plt.ylim(0,1)

以plt.subplot()畫兩張圖,一張在左,為sin(x);另一張在右,為cos(x)


In [ ]:
plt.figure(figsize=(10,5))
plt.suptitle('my figure')

plt.subplot(1,2,1)              #(1,2,1): 畫於1X2圖陣列中的第1個
x=np.linspace(0,2.*np.pi,50)
y=np.sin(x)
plt.plot(x,y,marker='o')

plt.xlabel('x')
plt.ylabel('sin(x)')
plt.title('fig1')

plt.subplot(1,2,2)              #(1,2,2): 畫於1X2圖陣列中的第2個
y=np.cos(x)
plt.plot(x,y,marker='o')
plt.xlabel('x')
plt.ylabel('cos(x)')
plt.title('fig2')

plt.show()

以plt.subplots()建圖

建一張空圖,含有座標1X2個


In [ ]:
fig,axes=plt.subplots(1,2)

In [ ]:
axes

建一張空圖,含有座標2X3個


In [ ]:
fig,axes=plt.subplots(2,3)

In [ ]:
axes

In [ ]:
axes.shape

以plt.subplots()畫兩張圖,一張在左,為sin(x);另一張在右,為cos(x),並共用x座標


In [ ]:
fig,axes=plt.subplots(1,2,figsize=(10,5),sharex=True)

fig.suptitle('my figure')

x=np.linspace(0,2.*np.pi)

y=np.sin(x)
axes[0].plot(x,y,marker='o')         #畫於1X2圖陣列中的第1個

axes[0].set_xlabel('x')
axes[0].set_ylabel('sin(x)')
axes[0].set_title('fig1')

y=np.cos(x)
axes[1].plot(x,y,marker='o')        #畫於1X2圖陣列中的第2個

axes[1].set_xlim((0,2.*np.pi))

axes[1].set_xlabel('x')
axes[1].set_ylabel('cos(x)')
axes[1].set_title('fig2')

以plt.subplots()畫sin(x)和cos(x)在同一張圖


In [ ]:
fig,ax=plt.subplots()

x=np.linspace(0,2.*np.pi,50)
y=np.sin(x)
ax.plot(x,y,marker='o',label='sin(x)')
ax.set_xlim((0,np.pi))

y=np.cos(x)
ax.plot(x,y,marker='v',label='cos(x)')

plt.legend()

以長條圖(bar plot)畫高斯分佈

建立100000個亂數,其是由$\mu=0$, $\sigma=1$的高斯分佈中取出的。

https://zh.wikipedia.org/wiki/%E6%AD%A3%E6%80%81%E5%88%86%E5%B8%83


In [ ]:
s=np.random.normal(0,1,100000)

In [ ]:
plt.plot(s)

將該亂數所在的區間切割兩百個小區間,統計各小區間有幾個亂數落在裡面。


In [ ]:
hist, bins =np.histogram(s,bins=200)
plt.bar(bins[:-1], hist, width=(bins[1]-bins[0]))

鳶(ㄩㄢ)尾花 (iris)資料集


In [ ]:
df=pd.DataFrame.from_csv('https://raw.githubusercontent.com/chi-hung/PythonTutorial/master/datasets/iris.csv',index_col=None)

In [ ]:
df[:3]

備註:sepal: 花萼; petal: 花瓣

先研究花鄂長度和花鄂寬度有什麼關係


In [ ]:
df=df[['sepal_length','sepal_width','species']]

In [ ]:
groups=df.groupby('species')

In [ ]:
groups.indices

以花鄂長度和花鄂寬度畫散佈圖(scatter plot)


In [ ]:
fig,ax=plt.subplots(figsize=(5,5))

for name,group in groups:
    ax.scatter(group['sepal_length'],group['sepal_width'],label=name)
plt.legend()

看一下各種類的最短花鄂長,以及最長花鄂長


In [ ]:
for name,group in groups:
    print(name,np.min(group['sepal_length']),np.max(group['sepal_length']))

不同種類的花鄂長度區間分佈


In [ ]:
fig,ax=plt.subplots(3,figsize=(5,5))
color=['b','g','r']
for idx,(name,group) in enumerate(groups):
    hist, bins =np.histogram(group['sepal_length'],bins=10,range=(4.3,7.9))
    ax[idx].label=name
    ax[idx].bar(bins[:-1], hist, width=(bins[1]-bins[0]),align='edge',label=name,color=color[idx])
    print(idx,name)
    ax[idx].legend()
    ax[idx].set_ylim((0,30))

三個種類的花鄂長度區間分佈(堆疊式長條圖)


In [ ]:
fig,ax=plt.subplots(figsize=(5,5))
for idx,(name,group) in enumerate(groups):
    if(idx==0):
        bottom=0
    else:
        bottom+=hist
    hist, bins =np.histogram(group['sepal_length'],bins=10,range=(4.3,7.9))
    ax.bar(bins[:-1], hist,bottom=bottom, width=(bins[1]-bins[0]),align='edge',label=name)
    ax.set_xlim((4,8))
plt.legend()

以上我們做的事情,事實上,seaborn已經幫我們做好了


In [ ]:
sns.pairplot(df, hue="species")

Seaborn可將各變量(花瓣長、花瓣寬、花鄂長、花鄂寬)兩兩成對去畫散佈圖,並將不同種類的花以不同顏色區分


In [ ]:
df=pd.DataFrame.from_csv('https://raw.githubusercontent.com/chi-hung/PythonTutorial/master/datasets/iris.csv',index_col=None)

In [ ]:
df[:3]

In [ ]:
sns.pairplot(df, hue="species")

練習:畫出Sierpinski 三角形

利用以下練習畫圖,NumPy array和程式設計:

  1. 在平面上決定三個點(不需要把它們畫出來),此三點將形成一個三角形。
  2. 隨機選取此三角形的任意頂點(也就是從剛所決定的三個點中隨機選取一個點),此點為一個隨機旅行者的所在位置。
  3. 再次隨機選取此三角形的任意頂點。並且讓隨機旅行者移動至該頂點和旅行者的所在位置的一半。
  4. 畫出旅行者的所在位置。
  5. 重複步驟三。

In [ ]:
v=np.array([[0,np.sqrt(3.)/2.],[-0.5,0],[0.5,0]])
print(np.sqrt(3.)/2.)

In [ ]:
v=np.array([[0,np.sqrt(3.)/2.],[-0.5,0],[0.5,0]])
print(np.sqrt(3.)/2.)

n=10000
v_i=v[0]
v_walker=np.zeros(2)

for i in range(n):
    v_rand=np.random.randint(0,3)
    v_selected=v[v_rand]
    # 完成以下程式碼
    v_walker=...

In [12]:
# 產生好座標後,畫出以下三角形:
plt.plot(....)


Out[12]:
[<matplotlib.lines.Line2D at 0x7fad20652ac8>]