<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【Python】機(jī)器學(xué)習(xí)繪圖神器Matplotlib首秀!

          共 5367字,需瀏覽 11分鐘

           ·

          2021-12-14 09:10

          公眾號:尤而小屋
          作者:Peter
          編輯:Peter

          Matplotlib是一個非常經(jīng)典的繪圖庫,甚至有人將numpy+pandas+matplotlib稱之為數(shù)據(jù)分析三劍客,足以說明這個庫的重要性。雖然Peter鐘情于Plotly,但掌握Matplotlib繪制技巧也非常重要。

          基于Matplotlib的繪圖技巧太多了,想深入學(xué)習(xí)的小伙伴建議直接官網(wǎng):https://matplotlib.org/

          從本文中你將學(xué)習(xí)到以下幾點:

          • 基本圖形繪制:折線圖、柱狀圖、直方圖、雙軸線圖等
          • 繪制小技巧:添加圖例、標(biāo)題、注釋、顏色等
          • 實戰(zhàn):股票趨勢圖和K線圖制作

          導(dǎo)入庫

          一般繪圖的時候需要導(dǎo)入常見的庫;在使用matplotlib繪制的時候還需要解決中文的問題

          import?pandas?as?pd
          import?numpy?as?np

          import?matplotlib.pyplot?as?plt
          %matplotlib?inline

          #?用來正常顯示中文標(biāo)簽
          plt.rcParams['font.sans-serif']?=?['SimHei']??
          #?解決負(fù)號“-”顯示為
          plt.rcParams['axes.unicode_minus']?=?False??

          折線圖

          x?=?[2,3,4]
          y?=?[4,6,8]

          plt.plot(x,y)
          plt.show()

          多折線圖

          #?默認(rèn)參數(shù)
          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個隨機(jī)數(shù)
          y?=?np.random.rand(20)

          plt.scatter(x,y)
          plt.show()

          直方圖

          #?隨機(jī)生成1000個服從正態(tài)分布的數(shù)據(jù),均值為0,標(biāo)準(zhǔn)差為1
          data?=?np.random.randn(1000)

          plt.hist(data,?bins=40,?edgecolor="black")
          plt.show()

          頻率直方圖

          主要是y軸發(fā)生了變化,全部是小數(shù)表示的

          data?=?np.random.randn(1000)

          #?區(qū)別:加上參數(shù)density=1
          plt.hist(data,?bins=40,?density=1,?edgecolor="black")
          plt.show()

          繪圖技巧

          技巧1:設(shè)置大小

          x?=?[2,3,4]
          y?=?[4,6,8]

          plt.plot(x,y)
          #設(shè)置大小??8代表800像素
          plt.rcParams["figure.figsize"]?=?(8,6)

          plt.show()

          添加文字說明

          文字說明包含標(biāo)題、軸標(biāo)簽等

          x?=?[2,3,4]
          y?=?[4,6,8]

          plt.plot(x,y)
          #?添加標(biāo)題和軸名稱
          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']?#用來正常顯示中文標(biāo)簽
          plt.rcParams['axes.unicode_minus']=False

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

          plt.plot(x,y)
          plt.xlabel('x坐標(biāo)軸')
          plt.ylabel('y坐標(biāo)軸')
          plt.title('標(biāo)題')

          #?添加注釋
          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")

          #?設(shè)定位置
          plt.legend(loc='upper?left')
          plt.show()

          調(diào)整顏色

          import?numpy?as?np
          import?matplotlib.pyplot?as?plt
          %matplotlib?inline

          x=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()

          設(shè)置雙軸

          #?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')?#?圖例位置

          #?重要代碼:設(shè)置雙軸
          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()

          旋轉(zhuǎn)軸刻度

          當(dāng)某個軸的刻度值過長的時候,我們可以通過旋轉(zhuǎn)的方式進(jìn)行顯示

          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函數(shù)主要是兩個參數(shù):nrows表示行數(shù),ncols表示列數(shù);同時設(shè)置大小figsize。

          函數(shù)返回的是畫布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()

          實戰(zhàn):繪制股票趨勢圖

          我們從Tushare官網(wǎng)來獲取股票的數(shù)據(jù),首先安裝:

          pip?install?tushare

          獲取數(shù)據(jù)

          import?tushare?as?ts

          df?=?ts.get_k_data("000001",start="2020-05-08",end="2020-08-08")
          df

          為了方便后續(xù)的繪圖,需要將日期date字段改成索引:

          #?將日期設(shè)置成索引
          df1?=?df.set_index("date")

          默認(rèn)繪圖

          我們使用收盤價close來繪制默認(rèn)的圖形

          fig?=?df1["close"].plot()

          plt.show()

          添加標(biāo)題

          #?Pandas直接繪圖
          fig?=?df["close"].plot(title="PingAn")
          plt.show()

          上面是使用Pandas內(nèi)置的折線圖方法來繪制,下面使用Matplobtlib來繪制:

          #?使用Matplotlib繪圖

          #?獲取數(shù)據(jù)
          #?import?tushare?as?ts
          #?df?=?ts.get_k_data("000001",start="2018-08-08",end="2020-08-08")

          #?調(diào)整時間
          from?datetime?import?datetime
          df["date"]?=?df["date"].apply(lambda?x:datetime.strptime(x,"%Y-%m-%d"))

          #?繪制折線圖
          import?matplotlib.pyplot?as?plt
          %matplotlib?inline

          plt.plot(df["date"],df["close"])
          #?標(biāo)題
          plt.title("PingAn")
          #?旋轉(zhuǎn)
          plt.xticks(rotation=-45)??
          plt.show()

          實戰(zhàn)進(jìn)階:繪制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:股票代碼

          日期格式轉(zhuǎn)化

          定義一個將字符串形式的日期轉(zhuǎn)成數(shù)字型的函數(shù):

          from?matplotlib.pylab?import?date2num
          import?datetime

          def?date_to_number(dates):
          ????number_time?=?[]
          ????for?date?in?dates:
          ????????#?字符串轉(zhuǎn)時間戳格式
          ????????date_time?=?datetime.datetime.strptime(date,"%Y-%m-%d")
          ????????#?時間戳格式轉(zhuǎn)成數(shù)字格式
          ????????number_date?=?date2num(date_time)
          ????????number_time.append(number_date)
          ????return?number_time

          下面進(jìn)行的操作是取出上面數(shù)據(jù)中的values部分并轉(zhuǎn)成numpy;同時調(diào)用上面的函數(shù):

          #?DataFrame轉(zhuǎn)成numpy數(shù)組格式
          df1?=?df.values??

          #?將二維數(shù)組的日期轉(zhuǎn)成數(shù)字(使用上面的函數(shù))
          df1[:,0]?=?date_to_number(df1[:,0])??

          繪制K線圖

          fig,?ax?=?plt.subplots(figsize=(15,6))

          mpf.candlestick_ochl(ax,?#?繪圖Axes的實例,畫布中的子圖
          ?????????????????????df1,??#?帶繪圖的數(shù)據(jù)
          ?????????????????????width=0.5,??#?K線柱形的寬度
          ?????????????????????colorup="red",??#?收盤價>開盤價
          ?????????????????????colordown="green",??#?收盤價<開盤價
          ?????????????????????alpha=5)??#?柱子的透明度

          plt.grid(True)??#?顯示網(wǎng)格線
          ax.xaxis_date()?#?將x軸設(shè)置成常規(guī)的日期格式

          添加均線

          下面的代碼是添加5日和20日的均線數(shù)據(jù):

          繪制均線圖

          fig,?ax?=?plt.subplots(figsize=(15,6))

          mpf.candlestick_ochl(ax,?#?繪圖Axes的實例,畫布中的子圖
          ?????????????????????df1,??#?帶繪圖的數(shù)據(jù)
          ?????????????????????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)??#?顯示網(wǎng)格線
          ax.xaxis_date()?#?將x軸設(shè)置成常規(guī)的日期格式

          #?添加標(biāo)題
          plt.title("PingAn")
          plt.xlabel("date")
          plt.ylabel("Price")
          plt.show()

          添加成交量

          我們將K線圖放在第一個子圖位置,將成交量放在第二個位置即可:

          #用來正常顯示中文標(biāo)簽
          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,??#?帶繪圖的數(shù)據(jù)
          ?????????????????????width=0.5,??#?K線柱形的寬度
          ?????????????????????colorup="red",??#?收盤價>開盤價
          ?????????????????????colordown="green",??#?收盤價<開盤價
          ?????????????????????alpha=5)??#?柱子的透明度

          #?添加均線
          ax1.plot(df1[:,0],df["MA5"],?c="black")
          ax1.plot(df1[:,0],df["MA20"])

          #?顯示網(wǎng)格線
          ax1.grid(True)??
          #?將x軸設(shè)置成常規(guī)的日期格式
          ax1.xaxis_date()?
          #?添加標(biāo)題、軸名稱等
          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()
          往期精彩回顧




          站qq群955171419,加入微信群請掃碼:
          瀏覽 64
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  囯产乱一区二区三区夜爽 | 羞羞插插无码 | 夜夜骚av一区二区三区 | 操逼的网站 | 青青草91久久久久久久久 |