matplotlib 模組
matplotlib是Python語言及其數值計算庫NumPy的繪圖庫,可以很輕鬆地將數據視覺化,且提供多樣的格式
1.折線圖:plot
plt.plot([x軸座標串列], [y軸座標串列] [,其他參數])
■ linewidth= or lw=:線條寬度,預設1.0
■ color=:設定線條顏色,預設為藍色,設定值如下
顏色 | 代表值 | 顏色 | 代表值 |
---|---|---|---|
藍色 | b, blue | 青色 | c, cyan |
紅色 | r, red | 酒紅 | m, megenta |
綠色 | g, green | 黑色 | k, black |
黃色 | y, yello | 白色 | w, white |
■ linestyle= or ls=:設定線條樣式,預設值為實線「-」, 其他有虛線「–」 、點虛線「-.」 、點線「:」 。
■ marker=:設定點的標記樣式,設定值如下
符號 | 說明 | 符號 | 說明 |
---|---|---|---|
“.”,”o”,”*” | 點型、圓型、星型 | “h”,”H” | 六邊形(立著、橫著) |
“^”,”v” | 正、反三角形 | “d”,”D” | 菱形(瘦、胖) |
“<“,”>” | 左、又三角形 | “x”,”+” | 十字 |
“s” | 矩形 | “_”,”|” | 橫線、直線 |
“p” | 五角形 | “1”,”2″,”3″,”4″ | 消波塊 |
■ markersize= or ms=:標記(marker)的大小
■ color、linestyle、marker組合字串:這三個值可以直接合併使用,如紅色時線星狀標記’r-*’
■ 設置中文:預設狀態下因模組沒有配置中文字形,需輸入中文可使用matplotlib的 rcParams函數更改字體
#為微軟正黑體,也可設mingliu(明體)或DFKai-SB(楷體)
plt.rcParams["font.sans-serif"] = "Microsoft JhengHei"
# 設定中文字型及負號正確顯示
plt.rcParams["axes.unicode_minus"] = False
import matplotlib.pyplot as plt
listx = [0,5,10,15,20,25,30]
listy = [10,13,40,32,20,60,70]
listx2 = [0,3,6,15,18,22,27]
listy2 = [10,20,10,33,26,55,62]
# 以座標為錨點,color為線的顏色,lw為線的寬度,ls為線的樣式,label為線的名子
#linewidth or lw
#color
#linestyle or ls
#marker
#markersize or ms
plt.plot(listx, listy,
linewidth='2.0',
linestyle='--',
color='red',
label='red_line',
marker='*',
markersize=16
)
plt.plot(listx2, listy2,
lw = '2.0',
ls = '-.',
color = 'b',
label = 'blue_line',
marker = '^',
ms = '12'
)
plt.title("red_title", fontsize=20) #圖表標題和字體大小
plt.xlabel("x-label", fontsize=10) #x軸標題和字體大小
plt.ylabel('y-label', fontsize=10) #y軸標題和字體大小
plt.xlim(0, 30) #設定x軸範圍
plt.ylim(0, 70) #設定y軸範圍
plt.xticks([x for x in range(0,30)]) #設定x軸座標的刻度,串列形式
plt.yticks(range(0,70,3)) #設定y軸座標的刻度
#也可設定刻度的格式
plt.tick_params(axis='both', labelsize=10, color='b')
#plt.grid(True) 設定格線,預設模式
#也可進一步設定格線模式,分別為顏色、線條模式、寬度及透明度
plt.grid(color='b', linestyle=":", linewidth=1, alpha=0.5)
# label='label'需要搭配legend()函數才有效果
plt.legend()
plt.show()
2.長條圖:bar
plt.bar(x軸串列, y軸串列, width=長條寬度, bottom=y軸起始位置 [,其他參數])
■ width=:每一個長條的寬度,以兩個長條間的距離為基準,用百分比來表示,預設值為0.8。
■ bottom=:設定每個長條的y軸起始位置,不設定時預設為0,用串列表示
■ color=:設定每個長條的顏色,預設為藍色,紅色可用color=’r’來表示,不同顏色可串列表示,如color=[‘r’,’g’,’b’] 紅綠藍顏色循環
■ plt.xlabel(‘名稱’)、plt.ylabel(‘名稱’):設定軸的名稱,需搭配legend()函數使用
■ plt.title(‘圖表名稱’):設定圖表的名稱
#長條圖:bar
import matplotlib.pyplot as plt
listx = ['Python','C','C++','C#','JAVA','Visual Basic', 'Other']
listy = [11.27,11.16,7.5,5.26,10.46,5.24,49.11]
#繪製長條圖,width為長條圖的寬度,依比例調整(0.0~1.0)
#color=['r', 'g', 'b']可以讓顏色照r,g,b順訊循環下去,可用list或tuple
plt.bar(listx, listy, width=0.8, bottom=0, color=['r','g','b'])
plt.title('程式語言使用人數')
plt.xlabel('程式語言')
plt.ylabel('使用人數')
#plt.barh(listy, listx, height=0.8, left=0 )
# 設定中文字型及負號正確顯示
plt.rcParams["font.sans-serif"] = "Microsoft JhengHei"
plt.rcParams["axes.unicode_minus"] = False
plt.legend()
plt.show()
3.橫條圖:barh
plt.barh(y軸串列, x軸串列, height=長條高度(寬度)預設0.8, left=x軸起始位置 )
■ y軸座標:顯示每個長條(項目)的名稱串列或是序列串列
■ x軸座標:顯示每個長條的數值串列
■ color=:設定每個長條的顏色,預設為藍色,紅色可用color=’r’來表示,不同顏色可串列表示,如color=[‘r’,’g’,’b’] 紅綠藍顏色循環
■ height=:設定每個長條的高度,因為是橫條圖所以設定上是寬度,以百分比來表示,預設0.8
■ left=:設定每個長條y軸的起始位置,可以串列表示每個長條不同的起始位置,預設值為0
■ plt.xlabel(‘名稱’)、plt.ylabel(‘名稱’):設定軸的名稱,需搭配legend()函數使用
■ plt.title(‘圖表名稱’):設定圖表的名稱
#橫條圖:barh
import matplotlib.pyplot as plt
listx = ['Python','C','C++','C#','JAVA','Visual Basic', 'Other']
listy = [11.27,11.16,7.5,5.26,10.46,5.24,49.11]
plt.barh(listx, listy, height=0.5, color=['r', 'g', 'b'], left=0)
plt.title('資訊課選修人數')
plt.xlabel('使用人數')
plt.ylabel('程式語言')
# 設定中文字型及負號正確顯示
plt.rcParams["font.sans-serif"] = "Microsoft JhengHei"
plt.rcParams["axes.unicode_minus"] = False
plt.legend()
plt.show()
4.散佈圖:scatter
plt.scatter(x軸串列, y軸串列, s=大小尺寸, color=’顏色’,marker=’標記’, alpha=透明度0~1)
■ s=:大小尺寸數值組成的串列
■ color= or c=:設定顏色,字串或是串列(多種顏色)
■ m=:marker標記樣式,預設為’o’圓形
■ alpha=:透明度,數值範圍在0.0~1.0之間
import matplotlib.pyplot as plt
listx = [31,15,20,25,12,18,45,21,33,5,18,22,37,42,10]
listy = [68,20,61,32,45,56,10,18,70,64,43,66,19,77,21]
scale = [x**3 for x in [5,4,2,6,7,1,8,9,2,3,2,4,5,7,2]]
# 上述scale的表示法,等同於底下利用for迴圈填值
# scale = []
# for x in [5,4,2,6,7,1,8,9,2,3,2,4,5,7,2]:
# scale.append(x**3)
plt.xlim(0,50)
plt.ylim(0,80)
# 繪製參考線
plt.plot([0,50], [0, 80])
# 繪製散佈圖,顏色只能放一種
plt.scatter(listx, listy, color='r', s=scale, marker='s', alpha=0.5)
# 繪製第二組散佈圖
listx2 = [31,33,5,18,22,37,42,10,15,20,25,12,18,45,21]
listy2 = [68,20,61,32,45,56,10,18,70,64,43,66,19,77,21]
scale2 = [x**2 for x in [1,8,9,2,3,2,4,5,7,2,5,4,2,6,7]]
plt.scatter(listx2, listy2, c='b', s=scale2, marker='o', alpha=0.7)
plt.show()
5.圓餅圖:pie
plt.pie(資料串列[, 其他串列參數])
■ labels=:每一組資料標題組成的串列
■ colors=:設定顏色,每一個資料顏色組成的字串或是串列,如[‘r’, ‘g’, ‘b’]
■ explode=:餅凸出來的距離參數,半徑為1
■ labeldistance=:項目的標題與圓心的距離是半徑的多少倍
■ autopct=:項目百分比的格式,例如:「%2.1f%%」表示整數兩位,小數一位
■ pctdistance=:百分比的文字與圓心的距離是半徑的多少倍
■ shadow=:是否顯示陰影,型態為bool
■ startangle=:開始繪圖的起始角度,起始角度從第一象限與第四象限的x軸以逆時針旋轉開始計算,90度代表從正y軸開始計算
import matplotlib.pyplot as plt
sizes = [25, 30, 15, 10]
labels = ["野比大雄", "源靜香", "骨川小夫", "剛田武"]
colors = ["red", "green", "blue", "yellow"]
explode = (0, 0, 0.2, 0)
plt.pie(sizes, #各個餅尺寸
explode = explode, #餅凸出來的參數
labels = labels, #每一個項目標題組成的串列
colors = colors, #每一個顏色組成的串列
labeldistance = 1.1, #項目標題離圓心的距離的半徑的倍數
autopct = "%2.1f%%", #項目百分比的格式,2為整數兩位,.1為小數後一位,依照sizes來計算百分比
pctdistance = 0.6, #百分比的文字距離圓心的半徑的倍數
shadow = True, #影子是否開啟
startangle = 90) #開始繪圖的起始角度,起始角度從第一象限與第四象限的x軸以逆時針旋轉開始計算,90度代表從正y軸開始計算
# 設定中文字型及負號正確顯示
plt.rcParams["font.sans-serif"] = "Microsoft JhengHei"
plt.rcParams["axes.unicode_minus"] = False
plt.show()
6.設定圖表區:figure
plt.figure([屬性參數])
■ figsize=[寬:高]:設定圖表區的寬高,預設為[6.4:4.8]
■ dip=:設定解析度,單位為每英寸像素點
■ facecolor=:設定背景顏色,預設為白色
■ edgecolor=:設定邊線顏色,預設值為白色
■ linewidth=:設定線寬
■ frameon=:是否有邊框,bool型態
■ tight_layout=:設定多個圖表是否有邊界,bool型態
# 新增圖表區
plt.figure()
plt.plot([1,2,3])
# 只有一個list會當成y軸
#plt.plot([0, 1, 2], [1,2,3])
#上面這行和plt.plot([1,2,3])的意思是一樣的,如果沒有給x軸參數會拿index當成x軸的參數
# 新增圖表區並設定屬性
plt.figure(figsize=[8,4],
dpi=84,
facecolor="whitesmoke",
edgecolor="r",
linewidth=1,
frameon=True
)
plt.plot([1,2,3],[5,11,3])
plt.show()
用欄列來表示多張圖表:
plt.subplot(row數,col數,圖表索引值)
import matplotlib.pyplot as plt
plt.figure(figsize=[8,8]) #設定圖表區尺寸為8*8英寸
plt.subplot(211) #row數為2,col數為1,圖表索引值指定為1
#兩列一欄的第一個圖
#plt.subplot(2,1,1)這種表示方法也可以
plt.title(label='index_1')
plt.plot([1,2,3],'r:o') #紅色、點線、圖示標籤為o
plt.subplot(212)
#兩列一欄的第二個圖
#plt.subplot(211)跟plt.subplot(212)也可以反過來,表示Chart 2在上面
plt.title(label='index_2')
plt.plot([1,2,3],'g--o') #綠色、虛線、圖示標籤為o
plt.show()
import matplotlib.pyplot as plt
plt.figure(figsize=[8,8]) #設定圖表區尺寸為8*8英寸
plt.subplot(121) #row數為1,col數為2,圖表索引值指定為1
plt.title(label='index_1')
plt.plot([1,2,3],'r:o')
plt.subplot(122) #row數為1,col數為2,圖表索引值指定為2
plt.title(label='index_2')
plt.plot([1,2,3],'g--o')
plt.show()
用相對位置排列多張圖表:
plt.axes([與左邊邊界的距離, 與下邊邊界的距離, 寬, 高])
注意!在vscode使用axes()函數可能會有點問題!
import matplotlib.pyplot as plt
plt.figure(figsize=[8, 4]) # 設定圖表大小
plt.axes([0, 0, 0.4, 1])
plt.title(label='no1')
plt.plot([1, 2, 3], 'r:o')
plt.axes([0.5, 0, 0.4, 1])
plt.title(label='no2')
plt.plot([1, 2, 3], 'g--o')
plt.show()
import matplotlib.pyplot as plt
plt.figure(figsize=[8,4])
plt.axes([0,0,0.8,1])
plt.title(label='no1')
plt.plot([1,2,3],'r:o')
plt.axes([0.55,0.1,0.2,0.2])
plt.title(label='no2')
plt.plot([1,2,3],'g--o')
plt.show()