公众号:尤而小屋
作者: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首秀!相关推荐

  1. Python绘图神器Matplotlib、Echarts、Pyecharts 和 Plotly ——可绘制各种图

    Python绘图神器Matplotlib和Echarts Matplotlib官网 https://matplotlib.org/stable/tutorials/toolkits/mplot3d.h ...

  2. Python机器学习基础之Matplotlib库的使用

    声明:代码的运行环境为Python3.Python3与Python2在一些细节上会有所不同,希望广大读者注意.本博客以代码为主,代码中会有详细的注释.相关文章将会发布在我的个人博客专栏<Pyth ...

  3. python画图三维-Python三维绘图之Matplotlib库的使用方法

    前言 在遇到三维数据时,三维图像能给我们对数据带来更加深入地理解.python的matplotlib库就包含了丰富的三维绘图工具. 1.创建三维坐标轴对象Axes3D 创建Axes3D主要有两种方式, ...

  4. 【机器学习】Python机器学习的神器- Scikit-learn使用说明

    全文共 26745 字,106 幅图表, 预计阅读时间 67 分钟. 0 引言 Sklearn (全称 Scikit-Learn) 是基于 Python 语言的机器学习工具.它建立在 NumPy, S ...

  5. 【机器学习基础】Python机器学习的神器- Scikit-learn使用说明

    全文共 26745 字,106 幅图表, 预计阅读时间 67 分钟. 0 引言 Sklearn (全称 Scikit-Learn) 是基于 Python 语言的机器学习工具.它建立在 NumPy, S ...

  6. python matplot绘图legend_Python matplotlib绘图基本元素

    数据准备 ``` importmatplotlib.pyplot as pltimportnumpy as npx=np.linspace(0.5,3.5,100)y=np.sin(x)y1=np.r ...

  7. python的mapl画图y轴排_Python三维绘图之Matplotlib库的使用方法

    前言 在遇到三维数据时,三维图像能给我们对数据带来更加深入地理解.python的matplotlib库就包含了丰富的三维绘图工具. 1.创建三维坐标轴对象Axes3D 创建Axes3D主要有两种方式, ...

  8. Python机器学习:数据科学,机器学习和人工智能的主要发展技术趋势概述

    1.介绍 Python因易于学习而广为人知,并且它仍然是数据科学,机器学习和科学计算中使用最广泛的语言.根据最近的一项民意的调查,该调查对1,800多名研究人员分析,数据科学和机器学习偏好的参与者进行 ...

  9. Python机器学习基础之Python的基本语法(一)

    当今世界已经进入了大数据的时代.随着信息化的不断发展,人工智能.机器学习等词语越来越被人们所熟知,而他们也渐渐地成了这个时代的弄潮儿,走在了信息时代的前端.从本篇博客开始,小编将带领大家一起走进人工智 ...

最新文章

  1. 使用Spring Roo进行快速云开发–第2部分:VMware Cloud Foundry
  2. 【转】漫谈ANN(2):BP神经网络
  3. 如果我是神,我让光速慢一点点,那就没有你
  4. ASP.NET——基础 12、Request
  5. 手机可用熵_时间之矢,生命之熵
  6. 轻量化网络:Xception
  7. 在Windows环境下为Python 2.5安装SSL模块
  8. 基于STM32F103C8T6 HAL库 TM7705数据读取
  9. aic值检验 p值_R语言入门之独立性检验
  10. 怎么 如何劫持DNS 加速 转发 教程
  11. VRP和调度问题的主流精确算法和启发式算法
  12. Android反模拟器的总结
  13. 浅谈autolayout
  14. u2硬盘测试软件,Buffalo HD-PET320U2移动硬盘检测报告
  15. oracle-win10-11g-R2 安装步骤
  16. 三菱FX DMUL指令
  17. node.js菜鸟问题—— data被报无定义
  18. 前端框架Layui学习五:弹出层和数据表格
  19. 下拉菜单中自动亮度调节P 上背光调节
  20. 淘宝网全国实时交易地图[转]

热门文章

  1. 【page-monitor 前端自动化 上篇】初步调研
  2. I2C总线以及GPIO模拟I2C
  3. ASCII与汉字编码方法
  4. 2011年 CIO简历该怎么写?
  5. IIS6中配置PHP
  6. 使用cert-manager实现Ingress https
  7. Map与object的区别
  8. SAN,NAS区别的联系
  9. 确定需要改变几个位,才能将整数A转变为整数B
  10. 30个数据可视化超级工具_Python5个数据可视化工具