打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
机器学习绘图神器Matplotlib首秀!

Matplotlib是一个非常经典的绘图库,甚至有人将numpy+pandas+matplotlib称之为数据分析三剑客,足以说明这个库的重要性。虽然Peter钟情于Plotly,但掌握Matplotlib绘制技巧也非常重要。

基于Matplotlib的绘图技巧太多了,想深入学习的小伙伴建议直接官网:https://matplotlib.org/

从本文中你将学习到以下几点:

  • 基本图形绘制:折线图、柱状图、直方图、双轴线图等
  • 绘制小技巧:添加图例、标题、注释、颜色等
  • 实战:股票趋势图和K线图制作

导入库

一般绘图的时候需要导入常见的库;在使用matplotlib绘制的时候还需要解决中文的问题

import pandas as pd
import numpy as np

import 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']=False

x=[1234]
y=[14916]

plt.plot(x,y)
plt.xlabel('x坐标轴')
plt.ylabel('y坐标轴')
plt.title('标题')

# 添加注释
plt.annotate('我是注释'
             xy=(2,5), 
             xytext=(210),
            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 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()

设置双轴

# 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([123], [246])

# 绘制第2张子图:柱形图
ax2 = plt.subplot(222)
plt.bar([123], [246])

# 绘制第3张子图:散点图
ax3 = plt.subplot(223)
plt.scatter([135], [7911])

# 绘制第4张子图:直方图
ax4 = plt.subplot(224)
plt.hist([25284])

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([123], [246])
ax2.bar([123], [246])
ax3.scatter([135], [7911])
ax4.hist([25284])

plt.show()

实战:绘制股票趋势图

我们从Tushare官网来获取股票的数据,首先安装:

pip install tushare

获取数据

import tushare as ts

df = 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 inline

plt.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 datetime

def 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()


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
python数据分析工具之 matplotlib详解
50题Matplotlib从入门到精通
PYTHON数据可视化:利用COLORMAP让你的图表与众不同
matplotlib in Ipython Notebook
Python Matplotlib简易教程
Python可视化.1
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服