文章原創(chuàng),最近更新:2018-05-8
1.子圖的繪制
2.在同一個圖中畫兩條折線圖
課程來源: python數(shù)據(jù)分析與機器學習實戰(zhàn)-唐宇迪
為了方便大家學習,將練習所涉及的練習unrate.csv文件以百度網(wǎng)盤共享的方式分享出來.
鏈接: https://pan.baidu.com/s/1ixwJ8OLkVuO36E2f28ZtmQ 密碼: qcvh
1.子圖的繪制
1.1關于子圖的介紹
很多情況下,在一個區(qū)域,不光畫一個圖,而且要畫很多個圖,相當于一個子圖的結構.比如說,在一個區(qū)域里面,要統(tǒng)計多個指標,這些指標沒辦法放在一個圖當中,因此需要畫很多的子圖.比如如下截圖有3種格式.四個圖形可以按自定義的方式羅列在一起,接下來是子圖的操作.
以下子圖常見的定義介紹:
- 子圖:就是在一張figure里面生成多張子圖。
- Matplotlib:對象簡介
- FigureCanvas:畫布
- Figure:圖
- Axes:坐標軸(實際畫圖的地方)
1.2 add_subplot & subplot函數(shù)的介紹
注意批什,pyplot的方式中plt.subplot()參數(shù)和面向對象中的add_subplot()參數(shù)和含義都相同蛹稍。
針對add_subplot對以下截圖的子圖布局進行一個簡單的介紹
fig.add_subplot(4,1,x),是造一個子圖,子圖的結構是4行1列的結構
fig.add_subplot(2,2,x),是造一個子圖,子圖的結構是2行2列的結構.特別注意排列的規(guī)則,從上到下,從左到右的排序結構.
fig.add_subplot(2,3,x),是造一個子圖,子圖的結構是2行3列的結構.
1.3畫子圖
首先導進matplotlib.pyplot,如下:
import matplotlib.pyplot as plt
對plt.figure函數(shù)進行了解,具體如下:
plt.figure(figsize=(w, h)) #創(chuàng)建對象徒扶,并指定寬度w高度h嵌施,默認像素為80ppi奈泪,單位為100像素几于?還是英寸佛析?
plt.figure是指畫圖的時候的一個默認區(qū)間.是一個畫圖區(qū)域.
在畫圖域加子圖,我們看一下是怎么加子圖的?
答案是通過flg.add_subplot函數(shù)加子圖,比如
- flg.add_subplot(2,2,1)
- flg.add_subplot(2,2,2)
- flg.add_subplot(2,2,4)
這里的1,2,4分別表達式什么含義呢?
import matplotlib.pyplot as plt
fig=plt.figure()
ax1=fig.add_subplot(2,2,1)
ax2=fig.add_subplot(2,2,2)
ax3=fig.add_subplot(2,2,4)
plt.show()
輸出的結果如下:
通過結果可以看出,將一個圖劃分為2行2列,1代表的是左上角的位置,2代表的是右上角的位置,,4代表的是右下角的位置.因為3沒有寫代碼定義,因此右下角沒有畫出來.
plt.figure(figsize=(w, h)) #創(chuàng)建對象,并指定寬度w高度h.plt.figure(figsize=(3, 3)),這里指的是不光要指定一個畫圖的區(qū)域,而且要定義畫圖區(qū)域的大小.寬度為3,高度為3.
import matplotlib.pyplot as plt
import numpy as np
fig=plt.figure(figsize=(3,3))
ax1=fig.add_subplot(2,1,1)
ax2=fig.add_subplot(2,1,2)
ax1.plot(np.random.randint(1,5,5),np.arange(5))
ax2.plot(np.arange(10)*3,np.arange(10))
plt.show()
顯示的結果如下:
如果將fig=plt.figure(figsize=(3,3))改成fig=plt.figure(figsize=(3,6))結果會怎么樣?
import matplotlib.pyplot as plt
import numpy as np
fig=plt.figure(figsize=(6,6))
ax1=fig.add_subplot(2,1,1)
ax2=fig.add_subplot(2,1,2)
ax1.plot(np.random.randint(1,5,5),np.arange(5))
ax2.plot(np.arange(10)*3,np.arange(10))
plt.show()
顯示的結果如下:
通過以上的顯示的結果,發(fā)現(xiàn)(3,3)改成(3,6)之后,長不變,寬變大了.
2.在同一個圖中畫兩條折線圖
在同一個圖中畫兩條折現(xiàn)應該怎么畫呢?并且線的顏色不一樣的?
2.1了解plot函數(shù)
-
拓外plot函數(shù):
下面首先了解plot這個函數(shù):
plot()提供曲線與標志"兩種"類型圖形(重要)闯参。下面以簡單語法為例進行講解瞻鹏。
plot(x,y,’cs’,label=’testin‘)#其中x表示X軸數(shù)據(jù);y表示Y軸數(shù)據(jù)(如Y值沒有輸入鹿寨,X軸坐標為自動分配新博,x值將會作為Y軸數(shù)據(jù));c為顏色定義字符串脚草;s為圖形定義字符串赫悄,label為圖內(nèi)標簽。
2.2了解timedate庫
- 拓外timedate:
具體學習參考鏈接:Python之日期與時間處理模塊(date和datetime)
help(dt.month)
Help on getset descriptor datetime.date.month:
month
具體案例如下:
import matplotlib.pyplot as plt
import numpy as np
unrate=pd.read_csv("unrate.csv")
unrate["DATE"]=pd.to_datetime(unrate["DATE"])
unrate['MONTH'] = unrate['DATE'].dt.month
unrate['MONTH'] = unrate['DATE'].dt.month
fig = plt.figure(figsize=(6,3))
plt.plot(unrate[0:12]['MONTH'], unrate[0:12]['VALUE'], c='red')
plt.plot(unrate[12:24]['MONTH'], unrate[12:24]['VALUE'], c='blue')
plt.show()
輸出結果如下:
從結果來看,紅藍色的線分別代表什么?從圖片看不出來,需要額外的操作指定出來.
具體實例如下:
首先把1948-1952年,每年的浮動情況都畫出來.
import matplotlib.pyplot as plt
import numpy as np
unrate=pd.read_csv("unrate.csv")
unrate["DATE"]=pd.to_datetime(unrate["DATE"])
unrate['MONTH'] = unrate['DATE'].dt.month
unrate['MONTH'] = unrate['DATE'].dt.month
fig = plt.figure(figsize=(10,6))
colors = ['red', 'blue', 'green', 'orange', 'black']
for i in range(5):
start_index = i*12
end_index = (i+1)*12
subset = unrate[start_index:end_index]
plt.plot(subset['MONTH'], subset['VALUE'], c=colors[i])
plt.show()
顯示的結果如下:
2.3了解plt.legend函數(shù)
雖然線畫出來了,但是每條線代表什么樣的指標,圖片看不出來,藍色的線表示哪一年?綠色的線表示哪一年?紅色的線又代表哪一年?需要設置圖例的位置.
需要用到plt.legend函數(shù),具體用法可參考matplotlib命令與格式:圖例legend語法及設置
plt.legend(loc=參數(shù)),這個loc參數(shù)指的是顯示圖例的位置,而plt.plot()中的lable參數(shù),設置圖例的標簽,但是不會顯示出來,需要用到plt.legend()函數(shù)才可以顯示.
對原有的代碼新增代碼,以增加及顯示圖例的位置及圖例標簽
label = str(1948 + i)
plt.plot(subset['MONTH'], subset['VALUE'], c=colors[i],label=label)
plt.legend(loc="best")
完整的代碼如下:
import matplotlib.pyplot as plt
import numpy as np
unrate=pd.read_csv("unrate.csv")
unrate["DATE"]=pd.to_datetime(unrate["DATE"])
unrate['MONTH'] = unrate['DATE'].dt.month
fig = plt.figure(figsize=(10,6))
colors = ['red', 'blue', 'green', 'orange', 'black']
for i in range(5):
start_index = i*12
end_index = (i+1)*12
subset = unrate[start_index:end_index]
label = str(1948 + i)
plt.plot(subset['MONTH'], subset['VALUE'], c=colors[i],label=label)
plt.legend(loc="best")
plt.show()
輸出的結果如下:
為了完善,新增x,y軸的坐標名稱以及圖片的標題,又應該怎么做呢?將圖例位置放在左上角,該怎么操作?
新增以下代碼,以完善以上的要求:
plt.legend(loc="upper left")
plt.xlabel("Month, Integer")
plt.ylabel("Unemployment Rate, Percent")
plt.title("Monthly Unemployment Trends, 1948-1952")
完整代碼如下:
unrate=pd.read_csv("unrate.csv")
unrate["DATE"]=pd.to_datetime(unrate["DATE"])
unrate['MONTH'] = unrate['DATE'].dt.month
fig = plt.figure(figsize=(10,6))
colors = ['red', 'blue', 'green', 'orange', 'black']
for i in range(5):
start_index = i*12
end_index = (i+1)*12
subset = unrate[start_index:end_index]
label = str(1948 + i)
plt.plot(subset['MONTH'], subset['VALUE'], c=colors[i],label=label)
plt.legend(loc="upper left")
plt.xlabel("Month, Integer")
plt.ylabel("Unemployment Rate, Percent")
plt.title("Monthly Unemployment Trends, 1948-1952")
plt.show()
輸出的結果如下:
以上就是相對完整的一個折線圖.