2021/10/25 NLP Matplotlib(範例1)

Axes

Axes 圖框

程式語言-看盤版面(上)-圖框教學

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#產生圖中圖的效果
#%matplotlib inline #此行是為了將圖表呈現在jupyter notebook中
#import 需要的套件
import matplotlib
import numpy as np
import matplotlib.pyplot as plt

#開始繪圖
fig = plt.figure()
#指定x,y軸座標
x = [1, 2, 3, 4, 5, 6, 7]
y = [1, 3, 4, 2, 5, 8, 6]

# below are all percentage 下面的數字全部都是以百分比為單位
#使用add_axes繪製圖框,圖框的位置是自己定義的,兩個圖塊可以重疊
#參數:add_axes( x初始座標, y初始座標, 寬, 高 )
left, bottom, width, height = 0.1, 0.1, 0.8, 0.8
ax1 = fig.add_axes([left, bottom, width, height]) # main axes
ax1.plot(x, y, 'r') #將線段以紅色繪出
ax1.set_xlabel('x') #賦予坐標軸名稱
ax1.set_ylabel('y')
ax1.set_title('title') #圖表的標題

ax2 = fig.add_axes([0.2, 0.6, 0.25, 0.25]) # inside axes
ax2.plot(y, x, 'b') #同上
ax2.set_xlabel('x')
ax2.set_ylabel('y')
ax2.set_title('title inside 1')

# different method to add axes 另一種新增圖框的方法
####################################
plt.axes([0.05, 0.2, 0.8, 0.25])
plt.plot(y[::-1], x, 'g') #同上
plt.xlabel('x')
plt.ylabel('y')
plt.title('title inside 2')

plt.show()
#plt.savefig("./axes_plot.png",dpi=72)


x/y limit

xlim、ylim 限制作畫的座標軸範圍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# x/y limit 限制 x,y 畫的範圍
%matplotlib inline
#引入需要的套件
import matplotlib
import numpy as np
import matplotlib.pyplot as plt

#在 -pi~pi 之間產生256個均分點(等差數列),包含 stop(endpoint=True)
X = np.linspace(-np.pi, np.pi, 256, endpoint=True)
C,S = np.cos(X), np.sin(X) #換算成 sin、cos 值

# x limits
#plt.xlim(0, 3) #在 x 軸只畫 0~3 的範圍

plt.xlim(X.min()*1.1, X.max()*1.1) #乘上 1.1 是為了完整呈現圖表預留空間
# y limits
plt.ylim(C.min()*1.1, C.max()*1.1) #如果不乘上 1.1 則圖表會顯得比較擠


plt.plot(X,C) #繪製線段
plt.plot(X,S, color='red', linewidth=10) #linewidth 調整線條粗細

plt.show() #顯示圖表
#plt.savefig("./limit_plot1.png",dpi=72)


x/y tick

xticks、yticks 用來設定圖表座標軸刻度

xticks的詳細參數說明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#%matplotlib inline
import matplotlib
import numpy as np
import matplotlib.pyplot as plt

X = np.linspace(-np.pi, np.pi, 256, endpoint=True) #跟之前一樣產生256個數字的等差數列
C,S = np.cos(X), np.sin(X) #換算sin、cos值

# x limits
plt.xlim(-4.0,4.0) #設定 x 座標的範圍

# x ticks
#在 -4~4 間,產生9個均分點,包含 stop,並以此作為 x 軸上的刻度
plt.xticks(np.linspace(-4,4,9,endpoint=True))

# y limits
plt.ylim(-1.0,1.0) #在不調整的情況下,會有部分圖形消失

# y ticks
#同於 x 軸
plt.yticks(np.linspace(-1,1,5,endpoint=True))

plt.plot(X,C) #繪製線段
plt.plot(X,S, color='red', linewidth=10)

plt.show() #顯示圖表
#plt.savefig("./ticks_plot1.png",dpi=72)

使用 LaTex Format 作為 ticks label

Latex各种命令、符号、公式、数学符号、排版

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#%matplotlib inline
import matplotlib
import numpy as np
import matplotlib.pyplot as plt

X = np.linspace(-np.pi, np.pi, 256, endpoint=True)
C,S = np.cos(X), np.sin(X)

# latex format 數學格式轉換
#下面將刻度以 latex 方式呈現
plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi],
[r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$']) #第一個參數是實際的數值、第二個參數作為label使用

plt.yticks([-1, 0, +1],
[r'$-1$', r'$0$', r'$+1$']) #前面加上 r 表示是原始字串

plt.plot(X,C)
plt.plot(X,S, color='red', linewidth=10)

plt.show() #顯示圖表
#plt.savefig("./ticks_plot2.png",dpi=72)


Coordinate axis

移動x,y座標軸

ax.spines——matplotlib坐标轴设置
Matplotlib入门-3-plt.gca( )挪动坐标轴

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#%matplotlib inline
import matplotlib
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-3, 3, 50) #在-3到3間產生等差數列(數量為50)
y1 = 2*x + 1
y2 = x**2

plt.figure() #開始繪圖
plt.plot(x, y2)
# plot the second curve in this figure with certain parameters
plt.plot(x, y1, color='red', linewidth=1.0, linestyle='--') #調整線段粗細以及樣式
# set x limits
plt.xlim((-1, 2)) #設定座標軸範圍限制
plt.ylim((-2, 3))

# set new ticks
new_ticks = np.linspace(-1, 2, 5) #設定圖表的刻度
plt.xticks(new_ticks)

# set tick labels
plt.yticks([-2, -1.8, -1, 1.22, 3],
['$really\ bad$', '$bad$', '$normal$', '$good$', '$really\ good$'])
# to use '$ $' for math text and nice looking, e.g. '$\pi$'

# gca = 'get current axis'
ax = plt.gca() #獲取圖像的軸,總共有四個軸top、bottom、left和right
#不需要right、top的座標軸,故將其顏色設為none(透明)
#ax.spines['right']取得右方的軸,以此類推
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')

ax.xaxis.set_ticks_position('bottom') #設定x軸方向刻度的位置
# ACCEPTS: [ 'top' | 'bottom' | 'both' | 'default' | 'none' ]

ax.spines['bottom'].set_position(('data', 0)) #'data'表示按數值挪動,其後數字代表挪動到Y軸的刻度值
# the 1st is in 'outward' | 'axes' | 'data'
# axes: percentage of y axis
# data: depend on y data

ax.yaxis.set_ticks_position('left') #同x軸刻度
# ACCEPTS: [ 'left' | 'right' | 'both' | 'default' | 'none' ]

ax.spines['left'].set_position(('data',0)) #同上
plt.show() #繪製出圖表
#plt.savefig("./Coordinate_axis.png",dpi=72)


Annotation

用於寫註解

plt.scatter()函数解析(最清晰的解释)
matplotlib.pyplot.annotate
matplotlib.pyplot.text

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#%matplotlib inline
import matplotlib
import numpy as np
import matplotlib.pyplot as plt

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.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) #linestyle='k--'
plt.scatter([x0, ], [y0, ], s=50, color='b') #s代表的是點的大小,scatter()用來畫散佈圖

# method 1:
#####################
#用於寫註解 詳細參數說明: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.annotate.html
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"))

# method 2:
########################
#用於在圖表中加入文字 詳細參數說明: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.text.html
plt.text(-3.7, 3, r'$This\ is\ the\ some\ text. \mu\ \sigma_i\ \alpha_t$',
fontdict={'size': 16, 'color': 'r'})

plt.show() #繪製出圖表
#plt.savefig("./Annotation.png",dpi=72)


Line Style

調整線的樣式 (ex. 虛線)

matplotlib.pyplot.plot
(裡面有關於marker、linestyle的詳細說明)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#%matplotlib inline
import matplotlib
import numpy as np
import matplotlib.pyplot as plt

color = 'cornflowerblue'

X = np.linspace(-np.pi, np.pi, 256, endpoint=True) #等差數列
C = np.cos(X) #計算 cos 值

linestyles = ['-', '--', '-.', ':'] #不同的線段樣式

for x, linestyle in enumerate(linestyles): #enumerate產生索引序列
plt.plot(X, C+x, linestyle=linestyle, color=color, linewidth=3)

plt.show() #繪製圖表
#plt.savefig("./linestyle.png",dpi=72)


Marker

在線段上實際標出點,參考Line Style的補充資料

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#%matplotlib inline
import matplotlib
import numpy as np
import matplotlib.pyplot as plt

color = 'cornflowerblue'

X = np.linspace(-np.pi, np.pi, 12, endpoint=True)
C = np.cos(X)

markers = ['o', 'v', '^', '<'] #標出點的樣式

for x, linestyle in enumerate(markers): #enumerate產生索引序列
plt.plot(X, C+x, marker=markers[x], color=color, linewidth=1)

plt.show() #繪製圖表
#plt.savefig("./marker.png",dpi=72)

不實際畫出線,而是描出點

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#%matplotlib inline
import matplotlib
import numpy as np
import matplotlib.pyplot as plt

x = [1, 2, 3, 4]
y = [1, 4, 9, 16]

plt.plot(x, y,'ro') #參數ro中r為red,o代表使用圓形標記繪製而不是用線繪製
plt.ylabel('y label') #更改坐標軸標題
plt.xlabel('x label')

plt.show() #繪製圖表
#plt.savefig("./marker2.png",dpi=72)


Legend

區分出線段

matplotlib.pyplot.legend

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#%matplotlib inline
import matplotlib
import numpy as np
import matplotlib.pyplot as plt

X = np.linspace(-np.pi, np.pi, 256, endpoint=True)
C,S = np.cos(X), np.sin(X)

plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi],
[r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$'])

plt.yticks([-1, 0, +1],
[r'$-1$', r'$0$', r'$+1$']) # latex format

plt.plot(X,C, label='cosine') #label標記線段名稱
plt.plot(X,S, color='red', linewidth=10, label='sine')

#plt.legend(loc='upper left', frameon=True)
# frameon 決定是否有外框、設定 loc='best',python會自動找到有空位的地方放legend
plt.legend(loc='best', frameon=False)

plt.show() #繪製圖表
#plt.savefig("./legend.png",dpi=72)


Figure

下次內容紀錄的是從bar chart開始的部分。

分享到