Matplotlib是一個非常經(jīng)典的繪圖庫,,甚至有人將numpy+pandas+matplotlib
稱之為數(shù)據(jù)分析三劍客,,足以說明這個庫的重要性,。雖然Peter鐘情于Plotly,,但掌握Matplotlib繪制技巧也非常重要,。
基于Matplotlib的繪圖技巧太多了,想深入學(xué)習(xí)的小伙伴建議直接官網(wǎng):https:///
從本文中你將學(xué)習(xí)到以下幾點:
- 基本圖形繪制:折線圖,、柱狀圖,、直方圖、雙軸線圖等
- 繪制小技巧:添加圖例,、標(biāo)題,、注釋、顏色等
導(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()
日期格式轉(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()