【Python】机器学习绘图神器Matplotlib首秀!
公眾號:尤而小屋
作者:Peter
編輯:Peter
Matplotlib是一個非常經典的繪圖庫,甚至有人將numpy+pandas+matplotlib稱之為數據分析三劍客,足以說明這個庫的重要性。雖然Peter鐘情于Plotly,但掌握Matplotlib繪制技巧也非常重要。
基于Matplotlib的繪圖技巧太多了,想深入學習的小伙伴建議直接官網:https://matplotlib.org/
從本文中你將學習到以下幾點:
基本圖形繪制:折線圖、柱狀圖、直方圖、雙軸線圖等
繪制小技巧:添加圖例、標題、注釋、顏色等
實戰:股票趨勢圖和K線圖制作
導入庫
一般繪圖的時候需要導入常見的庫;在使用matplotlib繪制的時候還需要解決中文的問題
import?pandas?as?pd import?numpy?as?npimport?matplotlib.pyplot?as?plt %matplotlib?inline#?用來正常顯示中文標簽 plt.rcParams['font.sans-serif']?=?['SimHei']?? #?解決負號“-”顯示為 plt.rcParams['axes.unicode_minus']?=?False折線圖
x?=?[2,3,4] y?=?[4,6,8]plt.plot(x,y) plt.show()多折線圖
#?默認參數 x1?=?np.array([1,3,5]) y1?=?x1?+?4 plt.plot(x1,y1)#?第二條紅線 y2?=?x1?*?2 plt.plot(x1,y2,color="red",linewidth=3,linestyle="--") plt.show()柱狀圖
x?=?[2,3,4,5,6] y?=?[4,6,8,10,12]plt.bar(x,y) plt.show()散點圖
x?=?np.random.rand(20)??#?0-1之間的20個隨機數 y?=?np.random.rand(20)plt.scatter(x,y) plt.show()直方圖
#?隨機生成1000個服從正態分布的數據,均值為0,標準差為1 data?=?np.random.randn(1000)plt.hist(data,?bins=40,?edgecolor="black") plt.show()頻率直方圖
主要是y軸發生了變化,全部是小數表示的
data?=?np.random.randn(1000)#?區別:加上參數density=1 plt.hist(data,?bins=40,?density=1,?edgecolor="black") plt.show()繪圖技巧
技巧1:設置大小
x?=?[2,3,4] y?=?[4,6,8]plt.plot(x,y) #設置大小??8代表800像素 plt.rcParams["figure.figsize"]?=?(8,6)plt.show()添加文字說明
文字說明包含標題、軸標簽等
x?=?[2,3,4] y?=?[4,6,8]plt.plot(x,y) #?添加標題和軸名稱 plt.title("Title") plt.xlabel("x?axis") plt.ylabel("y?axis")plt.show()修改線條樣式
import?numpy?as?np import?matplotlib.pyplot?as?plt %matplotlib?inline x=np.arange(1,8)plt.plot(x,marker='>') plt.plot(x+4,marker='+') plt.plot(x*2,marker='o') plt.show()添加注釋
plt.rcParams['font.sans-serif']=['SimHei']?#用來正常顯示中文標簽 plt.rcParams['axes.unicode_minus']=Falsex=[1,?2,?3,?4] y=[1,?4,?9,?16]plt.plot(x,y) plt.xlabel('x坐標軸') plt.ylabel('y坐標軸') plt.title('標題')#?添加注釋 plt.annotate('我是注釋',?xy=(2,5),?xytext=(2,?10),arrowprops=dict(facecolor='black',?shrink=0.01),)plt.show()添加圖例
#?第一條 x1?=?np.array([1,3,5]) y1?=?x1?+?4 plt.plot(x1,y1,label="y=x+4?")#?第二條紅線 y2?=?x1?*?2 plt.plot(x1,y2,color="red",linewidth=3,linestyle="--",label="y=x*2")#?設定位置 plt.legend(loc='upper?left') plt.show()調整顏色
import?numpy?as?np import?matplotlib.pyplot?as?plt %matplotlib?inlinex=np.arange(1,8)#顏色的多種寫法 plt.plot(x,color='r')??#?r表示red??g表示green??b表示blue plt.plot(x+1,color='0.5') plt.plot(x+2,color='#AF00FF') plt.plot(x+3,color=(0.1,0.2,0.3)) plt.show()設置雙軸
#?1 x1?=?np.array([1,3,5]) y1?=?50*x1?+?14 plt.plot(x1,y1,label="y=50?*?x?+?4?") plt.legend(loc='upper?right')?#?圖例位置#?重要代碼:設置雙軸 plt.twinx()??#?2 y2?=?-x1?*?20?+?3 plt.plot(x1,y2,color="red",linewidth=3,linestyle="--",label="y=-x?*?20?+?3") plt.legend(loc='upper?left')plt.show()旋轉軸刻度
當某個軸的刻度值過長的時候,我們可以通過旋轉的方式進行顯示
x?=?["Monday","Thursday","Wednesday"] y?=?[4,6,8]plt.plot(x,y) plt.xticks(rotation=45)plt.show()繪制多圖-方法1
import?matplotlib.pyplot?as?plt#?繪制第1張子圖:折線圖 ax1?=?plt.subplot(221) plt.plot([1,?2,?3],?[2,?4,?6])#?繪制第2張子圖:柱形圖 ax2?=?plt.subplot(222) plt.bar([1,?2,?3],?[2,?4,?6])#?繪制第3張子圖:散點圖 ax3?=?plt.subplot(223) plt.scatter([1,?3,?5],?[7,?9,?11])#?繪制第4張子圖:直方圖 ax4?=?plt.subplot(224) plt.hist([2,?5,?2,?8,?4])plt.show()繪制多圖-方法2
subplots函數主要是兩個參數:nrows表示行數,ncols表示列數;同時設置大小figsize。
函數返回的是畫布fig和子圖合集axes
fig,?axes?=?plt.subplots(nrows=2,?ncols=2,figsize=(10,6))#?flatten表示將子圖合集展開,得到每個子圖 ax1,ax2,ax3,ax4?=?axes.flatten()ax1.plot([1,?2,?3],?[2,?4,?6]) ax2.bar([1,?2,?3],?[2,?4,?6]) ax3.scatter([1,?3,?5],?[7,?9,?11]) ax4.hist([2,?5,?2,?8,?4])plt.show()實戰:繪制股票趨勢圖
我們從Tushare官網來獲取股票的數據,首先安裝:
pip?install?tushare獲取數據
import?tushare?as?tsdf?=?ts.get_k_data("000001",start="2020-05-08",end="2020-08-08") df為了方便后續的繪圖,需要將日期date字段改成索引:
#?將日期設置成索引 df1?=?df.set_index("date")默認繪圖
我們使用收盤價close來繪制默認的圖形
fig?=?df1["close"].plot()plt.show()添加標題
#?Pandas直接繪圖 fig?=?df["close"].plot(title="PingAn") plt.show()上面是使用Pandas內置的折線圖方法來繪制,下面使用Matplobtlib來繪制:
#?使用Matplotlib繪圖#?獲取數據 #?import?tushare?as?ts #?df?=?ts.get_k_data("000001",start="2018-08-08",end="2020-08-08")#?調整時間 from?datetime?import?datetime df["date"]?=?df["date"].apply(lambda?x:datetime.strptime(x,"%Y-%m-%d"))#?繪制折線圖 import?matplotlib.pyplot?as?plt %matplotlib?inlineplt.plot(df["date"],df["close"]) #?標題 plt.title("PingAn") #?旋轉 plt.xticks(rotation=-45)?? plt.show()實戰進階:繪制K線圖+成交量
首先,我們了解一點基本的股票知識:股市的漲跌對K線圖的影響
安裝庫
為了繪制k線圖,我們需要安裝一個庫:
#安裝庫mpl_finance pip?install?mpl_finance獲取代碼
df?=?ts.get_k_data("000001",start="2020-09-08",end="2021-03-08") df.head()date:日期
open:開盤價
close:收盤價
high:最高價
low:最低價
volume:成交量
code:股票代碼
日期格式轉化
定義一個將字符串形式的日期轉成數字型的函數:
from?matplotlib.pylab?import?date2num import?datetimedef?date_to_number(dates):number_time?=?[]for?date?in?dates:#?字符串轉時間戳格式date_time?=?datetime.datetime.strptime(date,"%Y-%m-%d")#?時間戳格式轉成數字格式number_date?=?date2num(date_time)number_time.append(number_date)return?number_time下面進行的操作是取出上面數據中的values部分并轉成numpy;同時調用上面的函數:
#?DataFrame轉成numpy數組格式 df1?=?df.values??#?將二維數組的日期轉成數字(使用上面的函數) df1[:,0]?=?date_to_number(df1[:,0])繪制K線圖
fig,?ax?=?plt.subplots(figsize=(15,6))mpf.candlestick_ochl(ax,?#?繪圖Axes的實例,畫布中的子圖df1,??#?帶繪圖的數據width=0.5,??#?K線柱形的寬度colorup="red",??#?收盤價>開盤價colordown="green",??#?收盤價<開盤價alpha=5)??#?柱子的透明度plt.grid(True)??#?顯示網格線 ax.xaxis_date()?#?將x軸設置成常規的日期格式添加均線
下面的代碼是添加5日和20日的均線數據:
繪制均線圖
fig,?ax?=?plt.subplots(figsize=(15,6))mpf.candlestick_ochl(ax,?#?繪圖Axes的實例,畫布中的子圖df1,??#?帶繪圖的數據width=0.5,??#?K線柱形的寬度colorup="red",??#?收盤價>開盤價colordown="green",??#?收盤價<開盤價alpha=5)??#?柱子的透明度#?添加均線 plt.plot(df1[:,0],df["MA5"],?c="black") plt.plot(df1[:,0],df["MA20"])plt.grid(True)??#?顯示網格線 ax.xaxis_date()?#?將x軸設置成常規的日期格式#?添加標題 plt.title("PingAn") plt.xlabel("date") plt.ylabel("Price") plt.show()添加成交量
我們將K線圖放在第一個子圖位置,將成交量放在第二個位置即可:
#用來正常顯示中文標簽 plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus']=False#?畫布、子圖、共享x軸 fig,?ax?=?plt.subplots(2,1,sharex=True,figsize=(15,6))?ax1,ax2?=?ax.flatten()#?第一個圖 mpf.candlestick_ochl(ax1,?#?繪圖Axes的實例,畫布中的子圖df1,??#?帶繪圖的數據width=0.5,??#?K線柱形的寬度colorup="red",??#?收盤價>開盤價colordown="green",??#?收盤價<開盤價alpha=5)??#?柱子的透明度#?添加均線 ax1.plot(df1[:,0],df["MA5"],?c="black") ax1.plot(df1[:,0],df["MA20"])#?顯示網格線 ax1.grid(True)?? #?將x軸設置成常規的日期格式 ax1.xaxis_date()? #?添加標題、軸名稱等 ax1.set_title("平安股價走勢圖") ax1.set_xlabel("時間") ax1.set_ylabel("價格") #?--------------------------#?第2個子圖 ax2.bar(df1[:,0],df1[:,5]) ax2.set_xlabel("時間") ax2.set_ylabel("成交量")??#?成交量 ax2.grid(True) ax2.xaxis_date()plt.show()往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載黃海廣老師《機器學習課程》視頻課黃海廣老師《機器學習課程》711頁完整版課件本站qq群955171419,加入微信群請掃碼:
總結
以上是生活随笔為你收集整理的【Python】机器学习绘图神器Matplotlib首秀!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jeecg框架alert消息样式
- 下一篇: Android同屏或摄像头RTMP推送常