1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 5367字,需瀏覽 11分鐘

         ·

        2021-12-14 09:10

        公眾號(hào):尤而小屋
        作者:Peter
        編輯:Peter

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

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

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

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

        導(dǎo)入庫(kù)

        一般繪圖的時(shí)候需要導(dǎo)入常見(jiàn)的庫(kù);在使用matplotlib繪制的時(shí)候還需要解決中文的問(wèn)題

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

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

        #?用來(lái)正常顯示中文標(biāo)簽
        plt.rcParams['font.sans-serif']?=?['SimHei']??
        #?解決負(fù)號(hào)“-”顯示為
        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()

        散點(diǎn)圖

        x?=?np.random.rand(20)??#?0-1之間的20個(gè)隨機(jī)數(shù)
        y?=?np.random.rand(20)

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

        直方圖

        #?隨機(jī)生成1000個(gè)服從正態(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()

        添加文字說(shuō)明

        文字說(shuō)明包含標(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']?#用來(lái)正常顯示中文標(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)

        #顏色的多種寫(xiě)法
        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)某個(gè)軸的刻度值過(guò)長(zhǎng)的時(shí)候,我們可以通過(guò)旋轉(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張子圖:散點(diǎn)圖
        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ù)主要是兩個(gè)參數(shù):nrows表示行數(shù),ncols表示列數(shù);同時(shí)設(shè)置大小figsize。

        函數(shù)返回的是畫(huà)布fig和子圖合集axes

        fig,?axes?=?plt.subplots(nrows=2,?ncols=2,figsize=(10,6))

        #?flatten表示將子圖合集展開(kāi),得到每個(gè)子圖
        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()

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

        我們從Tushare官網(wǎng)來(lái)獲取股票的數(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)繪圖

        我們使用收盤(pán)價(jià)close來(lái)繪制默認(rèn)的圖形

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

        plt.show()

        添加標(biāo)題

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

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

        #?使用Matplotlib繪圖

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

        #?調(diào)整時(shí)間
        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()

        實(shí)戰(zhàn)進(jìn)階:繪制K線圖+成交量

        首先,我們了解一點(diǎn)基本的股票知識(shí):股市的漲跌對(duì)K線圖的影響

        安裝庫(kù)

        為了繪制k線圖,我們需要安裝一個(gè)庫(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:開(kāi)盤(pán)價(jià)
        • close:收盤(pán)價(jià)
        • high:最高價(jià)
        • low:最低價(jià)
        • volume:成交量
        • code:股票代碼

        日期格式轉(zhuǎn)化

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

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

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

        下面進(jìn)行的操作是取出上面數(shù)據(jù)中的values部分并轉(zhuǎn)成numpy;同時(shí)調(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的實(shí)例,畫(huà)布中的子圖
        ?????????????????????df1,??#?帶繪圖的數(shù)據(jù)
        ?????????????????????width=0.5,??#?K線柱形的寬度
        ?????????????????????colorup="red",??#?收盤(pán)價(jià)>開(kāi)盤(pán)價(jià)
        ?????????????????????colordown="green",??#?收盤(pán)價(jià)<開(kāi)盤(pán)價(jià)
        ?????????????????????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的實(shí)例,畫(huà)布中的子圖
        ?????????????????????df1,??#?帶繪圖的數(shù)據(jù)
        ?????????????????????width=0.5,??#?K線柱形的寬度
        ?????????????????????colorup="red",??#?收盤(pán)價(jià)>開(kāi)盤(pán)價(jià)
        ?????????????????????colordown="green",??#?收盤(pán)價(jià)<開(kāi)盤(pán)價(jià)
        ?????????????????????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線圖放在第一個(gè)子圖位置,將成交量放在第二個(gè)位置即可:

        #用來(lái)正常顯示中文標(biāo)簽
        plt.rcParams['font.sans-serif']=['SimHei']
        plt.rcParams['axes.unicode_minus']=False

        #?畫(huà)布、子圖、共享x軸
        fig,?ax?=?plt.subplots(2,1,sharex=True,figsize=(15,6))?

        ax1,ax2?=?ax.flatten()

        #?第一個(gè)圖
        mpf.candlestick_ochl(ax1,?#?繪圖Axes的實(shí)例,畫(huà)布中的子圖
        ?????????????????????df1,??#?帶繪圖的數(shù)據(jù)
        ?????????????????????width=0.5,??#?K線柱形的寬度
        ?????????????????????colorup="red",??#?收盤(pán)價(jià)>開(kāi)盤(pán)價(jià)
        ?????????????????????colordown="green",??#?收盤(pán)價(jià)<開(kāi)盤(pán)價(jià)
        ?????????????????????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("平安股價(jià)走勢(shì)圖")
        ax1.set_xlabel("時(shí)間")
        ax1.set_ylabel("價(jià)格")
        #?--------------------------

        #?第2個(gè)子圖
        ax2.bar(df1[:,0],df1[:,5])
        ax2.set_xlabel("時(shí)間")
        ax2.set_ylabel("成交量")??#?成交量
        ax2.grid(True)
        ax2.xaxis_date()

        plt.show()
        往期精彩回顧




        站qq群955171419,加入微信群請(qǐng)掃碼:
        瀏覽 64
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            国産精品久久久久久久AV超碰 | 天天爽夜夜春 | 国产成人精品无码免费视频A | 一边吃奶一边做爰舒服 | 最新AV在线 | 一級免費网站 | 五月天伊人 | 日韩欧美区 | 攵女乱爱视频国语 | 夜夜夜夜夜猛噜噜噜噜gg夜 |