matplotlib详细介绍
matplotlib详细介绍
1.颜色和样式
1)如何调整颜色
八种内建默认颜色缩写
b: blue
g: green
r: red
c: cyan
m: magenta
y: yellow
k: black
w: white
其它颜色表示方法
灰色阴影
html 十六进制
RGB元组
# 颜色
import numpy as np
import matplotlib.pyplot as plt
# 8种默认缩写
y=np.arange(1,5)
plt.plot(y,color='g')
# 灰色阴影
plt.plot(y+1,color='1.5')
# html 16进制,代码可以在网上直接搜
plt.plot(y+2,color='#FF00FF')
# RGB元祖
plt.plot(y+3,color=(0.1,0.2,0.3))
plt.show()
2)如何调整点型
23种点形状。注意,不同点形状默认使用不同颜色。
”.” point
”,” pixel
“o” circle
“v” triangle_down
“^” triangle_up
“<” triangle_left
“>” triangle_right
“1” tri_down
“2” tri_up
“3” tri_left
“4” tri_right
“8” octagon
“s” square
“p” pentagon
“*” star
“h” hexagon1
“H” hexagon2
“+” plus
“x” x
“D” diamond
“d” thin_diamond
“|” vline
“_” hline
# 点样式
import numpy as np
import matplotlib.pyplot as plt
y=np.arange(1,5)
# 指定marker,默认会画出线段;不指定marker,默认只画出点
# 当在一个图中绘制多条线段时,matplotlib会默认采用不同的的颜色
plt.plot(y,marker='o')
# 指定marker的时候会画出线
plt.plot(y+1,marker='D')
plt.plot(y+2,'^')
plt.plot(y+3,'s')
plt.plot(y+4,'p')
plt.plot(y+5,'x')
plt.show()
3)如何调整线型
四种线型:
- 实线
-- 虚线
-. 点划线
: 点线
# 线样式
import numpy as np
import matplotlib.pyplot as plt
y=np.arange(1,5)
# 4种线的样式
plt.plot(y,'--')
plt.plot(y+1,'-.')
plt.plot(y+2,':')
plt.plot(y+3,'-')
plt.show()
4)样式字符串
可以将颜色,点型,线型写成一个字符串。如:
cx--
mo:
kp-
# 样式字符串
import numpy as np
import matplotlib.pyplot as plt
y=np.arange(1,5)
# 将颜色、线型、点型写成一个字符串
plt.plot(y,'cx--')
plt.plot(y+1,'kp:')
plt.plot(y+2,'mo-.')
plt.show()
2.三种方式
三种方式简介
- pyplot :经典高层封装,到目前为止,我们所用的都是pyplot
- pylab: 将Matplotlib 和 NumPy 合并的模块,模拟Matlab的编程环境
- 面向对象的方式:Matplotlib的精髓,更基础和底层的方式
三种方式优劣 - pyplot :简单易用。交互使用时方便,可以根据命令实时作图。但底层定制能力不足。
- pylab: 完全封装,环境最接近Matlab。不推荐使用。
- 面向对象(Object-Oriented)的方式:接近Matplotlib基础和底层的方式。难度稍大。但定制能力强。而且是Matplotlib的精髓。
- 总结:实战中推荐,根据需求,综合使用 pyplot和OO的方式,显示导入numpy
- 常用模块导入代码:
import matplotlib.pyplot as plt
import numpy as np
1)pylab方式
#pylab方式 不推荐
from pylab import *
x=arange(0,10,1)
y=randn(len(x))
plot(x,y)
title('random numbers')
show()
2)pyplot方式
# pyplot方式
import matplotlib.pyplot as plt
import numpy as np
x=np.arange(0,10,1)
y=np.random.randn(len(x))
plt.plot(x,y)
plt.title('pyplot')
plt.show()
3)面向对象方式
# 面向对象方式
import matplotlib.pyplot as plt
import numpy as np
x=np.arange(0,10,1)
y=np.random.randn(len(x))
# 生成一个对象(figure对象)
fig = plt.figure()
# 生成一个坐标轴对象
ax = fig.add_subplot(111)
l, = plt.plot(x,y)
# 对标题命名
t = ax.set_title('object oriented')
plt.show()
3.子图-subplot
在同一张图上画多个子图
- Matplotlib对象简介
- FigureCanvas
- Figure
- Axes
实践:
-
fig=plt.figure()
- Figure实例
- 可以添加Axes实例
-
ax=fig.add_subplot(111)
- 返回Axes实例
- 参数一,子图总行数
- 参数二,子图总列数
- 参数三,子图位置
- 在Figure上添加Axes的常用方法
# 面向对象的方式画子图
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(1,100)
fig = plt.figure()
# 221表示子图总行数为2,子图总列数为2,子图在第一个位置
ax1 = fig.add_subplot(221)
ax1.plot(x,x)
ax2 = fig.add_subplot(222)
ax2.plot(x,-x)
ax3 = fig.add_subplot(223)
ax3.plot(x,x**x)
ax4 = fig.add_subplot(224)
ax4.plot(x,np.log(x))
plt.show()
# pyplot画子图
import matplotlib.pyplot as plt
import numpy as np
x=np.arange(1,100)
plt.subplot(221)
plt.plot(x,x)
plt.subplot(222)
plt.plot(x,-x)
plt.subplot(223)
plt.plot(x,x*x)
plt.subplot(224)
plt.plot(x,np.log(x))
plt.show()
4.多图-可以创建多个Figure
同一时间产生多张图
# 多图
import matplotlib.pyplot as plt
fig1=plt.figure()
ax1=fig1.add_subplot(111)
ax1.plot([1,2,3],[3,2,1])
fig2=plt.figure()
ax2=fig2.add_subplot(111)
ax2.plot([1,2,3],[1,2,3])
plt.show()
5.网格
图以网格为背景
# pyplot方式---在交互里面用的很多
import numpy as np
import matplotlib.pyplot as plt
y=np.arange(1,5)
plt.plot(y,y*2)
# 控制打开关闭网格,
# plt.grid(True)
# color控制网格的颜色,控制网格的线条宽度,控制网格线型
plt.grid(True,color='r',linestyle='-.',linewidth='2')
plt.show()
# 用面向对象的方式绘制网格
import matplotlib.pyplot as plt
import numpy as np
x=np.arange(0,10,1)
y=np.random.randn(len(x))
fig=plt.figure()
ax=fig.add_subplot(111)
l,=plt.plot(x,y)
# 网格
ax.grid(True,color='r',linestyle='-.',linewidth='2')
plt.show()
6.图例
# 图例--交互式
import matplotlib.pyplot as plt
import numpy as np
x=np.arange(1,11,1)
y=x*x
plt.plot(x,x*2,label='Normal')
plt.plot(x,x*3,label='Fast')
plt.plot(x,x*4,label='Faster')
# legend函数---让图例显示在图中
# 参数loc来控制图例的位置,0-自适应,1-右上角,2-左上角,3-左下角,4-右下角
# 参数ncol可以是图例扁平化,ncol等于几表明有几列
plt.legend(loc=2,ncol=2)
plt.show()
# 图例-面向对象--第一种方式
import matplotlib.pyplot as plt
import numpy as np
x=np.arange(0,10,1)
y=np.random.randn(len(x))
fig=plt.figure()
ax=fig.add_subplot(111)
# 第一种方式
l,=plt.plot(x,y)
ax.legend(['ax legend'])
plt.show()
# 图例-面向对象--第二种方式
import matplotlib.pyplot as plt
import numpy as np
x=np.arange(0,10,1)
y=np.random.randn(len(x))
fig=plt.figure()
ax=fig.add_subplot(111)
line, =plt.plot(x,y,label='Inline label')
plt.show()
# 图例-面向对象---第三种方式
import matplotlib.pyplot as plt
import numpy as np
x=np.arange(0,10,1)
y=np.random.randn(len(x))
fig=plt.figure()
ax=fig.add_subplot(111)
line, = plt.plot(x,y)
line.set_label('label via method')
ax.legend()
plt.show()
7.坐标轴范围的调整
# 显示调整x轴、y轴的最大坐标
plt.axis()
plt.axis([-5,5,-10,10])
# 显示调整x轴
plt.xlim()
plt.xlim([-10,10])
plt.xlim(xmin=-5)
# 显示调整y轴
plt.ylim()
# 坐标轴范围调整
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(-10,11,1)
plt.plot(x,x)
# 显示调整x轴、y轴的最大坐标
plt.axis([-20,20,-20,10])
plt.show()
8.坐标轴刻度的调整
# 坐标轴刻度的调整
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(1,11,1)
# 获取当前图形的坐标轴
ax = plt.gca()
# 函数 locator_params调整坐标轴刻度
# 参数nbins表示坐标轴有多少格
# 第一个参数x或者y可以指定调整,未指定的默认;没有的话,x与y都调整
ax.locator_params('x',nbins=20)
plt.show()
# 日期的调整
# 坐标轴刻度的调整-日期调整
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
import datetime
fig = plt.figure()
start = datetime.datetime(2015,1,1)
stop = datetime.datetime(2016,1,1)
delta = datetime.timedelta(days=1)
dates = mpl.dates.drange(start,stop,delta)
y = np.random.rand(len(dates))
ax = plt.gca()
ax.plot_date(dates,y,linestyle='-',marker='')
# 格式化日期
date_format = mpl.dates.DateFormatter('%Y-%m')
ax.xaxis.set_major_formatter(date_format)
# 将日期的大小根据图形的大小自适义
fig.autofmt_xdate()
plt.show()
9.添加坐标轴-双坐标轴
# 添加坐标轴
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(2,20,1)
y1 = x*x
y2 = np.log(x)
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.plot(x,y1)
ax1.set_ylabel('Y1')
# 添加坐标轴
ax2 = ax1.twinx()
ax2.plot(x,y2,'r')
ax2.set_ylabel('Y2')
ax1.set_xlabel('Compare Y1 and Y2')
plt.show()
10.注释
在一个图形上画注释的符号,在某一个地方给予信息提示
# 注释
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(-10,11,1)
y = x*x
plt.plot(x,y)
# 注释使用annotate函数
# 第一个参数:注释的内容
# 第二个参数:xy填写箭头的坐标
# 第三个参数:xytext填写注释内容的坐标
# 第四个参数arrowprops定义注释箭头信息,其中facecolor表示箭头颜色,frac表示箭头比例
# headwidth定义箭头的宽度,width表示箭身的宽度
plt.annotate('this is the bottom',xy=(0,1),xytext=(0,20),
arrowprops=dict(facecolor='r',frac=0.2,headwidth=20,width=10))
plt.show()
11.文字-图形中纯粹的文字标注
# 在图中生成一段文字
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-10,11,1)
y = x*x
plt.plot(x,y)
# 使用text函数在图中生成一段文字
# 前两个参数是文字起始点的横纵坐标,第三个参数是文字
# 第四个参数是family表示文字字体,
# size参数定义字体的大小,color定义颜色,style定义字体格式,weight定义字体的粗细
# bbox(箱体)定义一个框用来框住字体,里面有facecolor参数定义箱体颜色,alpha定义透明度
plt.text(-3,30,'function:y=x*x',family='fantasy',size=20,color='g',
style='italic',weight=500,bbox=dict(facecolor='r',alpha=0.2))
plt.show()
12.Tex公式
matplotlib自带mathtext引擎,作为开始和结束符如 作为开始和结束符如作为开始和结束符如 y=x*x$
画出数学公式
# Tex公式
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
# 设置x与y坐标轴
ax.set_xlim([1,7])
ax.set_ylim([1,5])
ax.text(2,4,r"$ \alpha_i \beta_j \pi \lambda \omega $",size=25)
ax.text(4,4,r"$ \sin(0)=\cos(\frac{\pi}{2}) $",size=25)
ax.text(2,2,r"$ \lim_{x \rightarrow y} \frac{1}{x^3} $",size=25)
ax.text(4,2,r"$ \sqrt[4]{x}=\sqrt{y} $",size=25)
plt.show()
13.区域填充
给一块区域上色
函数:fill、fill_between
# 区域填充
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,5*np.pi,1000)
y1 = np.sin(x)
y2 = np.sin(2*x)
# 填充图形与x轴相交的部分
plt.fill(x,y1,'b',alpha=0.3)
plt.fill(x,y2,'r',alpha=0.3)
plt.show()
# 区域填充--面向对象
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,5*np.pi,1000)
y1 = np.sin(x)
y2 = np.sin(2*x)
fig = plt.figure()
ax = plt.gca()
ax.plot(x,y1,color='r')
ax.plot(x,y2,color='black')
# 根据条件分别填充where
# interpolate=True表示当x离散的厉害时,对空白部分自动填充
ax.fill_between(x,y1,y2,where=y1>=y2,facecolor='y',interpolate=True)
ax.fill_between(x,y1,y2,where=y1<y2,facecolor='g',interpolate=True)
plt.show()
14.形状-画填充好的形状
# 形状
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
fig,ax = plt.subplots()
xy1 = np.array([0.2,0.2])
xy2 = np.array([0.2,0.8])
xy3 = np.array([0.8,0.2])
xy4 = np.array([0.8,0.8])
# 画圆,圆心-半径
circle = mpatches.Circle(xy1,0.05)
# 把圆添加到画幕上
ax.add_patch(circle)
# 画矩形 左下角点的坐标-长-宽-颜色
rect = mpatches.Rectangle(xy2,0.2,0.1,color='r')
ax.add_patch(rect)
# 画多边形 图形中心-边数-中心到顶点长度-颜色
polygon = mpatches.RegularPolygon(xy3,5,0.1,color='g')
ax.add_patch(polygon)
# 画椭圆形 圆心-长直径-短直径-颜色
ellipse = mpatches.Ellipse(xy4,0.4,0.2,color='y')
ax.add_patch(ellipse)
# 调整x轴y轴比例
plt.axis('equal')
# 网格
plt.grid()
plt.show()
15.样式-美化
使用自带样式进行美化
# 样式-美化
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
# 生成两行两列的子图
fig,axes = plt.subplots(ncols=2,nrows=2)
# 将四个子图的坐标轴分别fu为四个对象
ax1,ax2,ax3,ax4 = axes.ravel()
x,y = np.random.normal(size=(2,100))
# 散点图
ax1.plot(x,y,'o')
# 直线图
x = np.arange(0,10)
y = np.arange(0,10)
# 循环颜色的数目,axes.prop_cycle来控制颜色循环
ncolors = len(plt.rcParams['axes.prop_cycle'])
# 间距
shift = np.linspace(0,10,ncolors)
for s in shift:
ax2.plot(x,y+s,'-')
# 柱状图
x = np.arange(5)
y1,y2,y3 = np.random.randint(1,25,size=(3,5))
width = 0.25
# 绘制柱状图
ax3.bar(x, y1, width, color=mpl.rcParams['axes.prop_cycle'].by_key()['color'][0])
ax3.bar(x + width, y2, width, color=mpl.rcParams['axes.prop_cycle'].by_key()['color'][1])
ax3.bar(x + 2 * width, y3, width, color=mpl.rcParams['axes.prop_cycle'].by_key()['color'][2])
#添加圆形
print(plt.rcParams['axes.prop_cycle'])
# python其实提供了内置的enumerate函数可以同时获得索引和值
# np.random.normal(size,loc,scale)
for i, xcolor in enumerate(plt.rcParams['axes.prop_cycle']):
xy = np.random.normal(size=2)
ax4.add_patch(plt.Circle(xy, radius=0.3, color=xcolor['color']))
# x、y调成对称
ax4.axis('equal')
plt.show()
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
# 1) 默认样式
def DrwaFigures():
# 绘制散点
fig, ax = plt.subplots(ncols=2, nrows=2)
ax1, ax2, ax3, ax4 = ax.ravel()
x, y = np.random.normal(size=(2, 100))
ax1.plot(x, y, 'o')
# 绘制10条不同颜色线段
x = np.arange(0, 10)
y = np.arange(0, 10)
ncolors = len(mpl.rcParams['axes.prop_cycle']) # 显示颜色种类
shift = np.linspace(0, 10, ncolors)
for s in shift:
ax2.plot(x, y + s, '-')
# 绘制柱状图-分别使用默认的0-1-2号颜色
x = np.arange(5)
y1, y2, y3 = np.random.randint(1, 25, size=(3, 5))
width = 0.25
# print(mpl.rcParams['axes.prop_cycle'])
ax3.bar(x, y1, width, color=mpl.rcParams['axes.prop_cycle'].by_key()['color'][0])
ax3.bar(x + width, y2, width, color=mpl.rcParams['axes.prop_cycle'].by_key()['color'][1])
ax3.bar(x + 2 * width, y3, width, color=mpl.rcParams['axes.prop_cycle'].by_key()['color'][2])
# 添加圆形
print(plt.rcParams['axes.prop_cycle'])
for i, xcolor in enumerate(plt.rcParams['axes.prop_cycle']):
xy = np.random.normal(size=2)
ax4.add_patch(plt.Circle(xy, radius=0.3, color=xcolor['color']))
ax4.axis('equal')
plt.show()
if __name__ == '__main__':
DrwaFigures()
16.极坐标
绘制以极坐标系为坐标轴的图形(角度和半径)
# 极坐标
import numpy as np
import matplotlib.pyplot as plt
# 半径
r = np.arange(1,6,1)
# 角度
theta = [0,np.pi/2,np.pi,3*np.pi/2,2*np.pi]
# projection='polar'表示将坐标投影为极坐标
ax = plt.subplot(111, projection = 'polar')
ax.plot(theta,r,color='r',linewidth=3)
# 网格
ax.grid(True)
plt.show()
# 极坐标
import numpy as np
import matplotlib.pyplot as plt
# 半径
# np.empty()根据给定的维度和数值类型返回一个新的数组,其元素不进行初始化。
r = np.empty(5)
r.fill(5)
# 角度
theta = [0,np.pi/2,np.pi,3*np.pi/2,2*np.pi]
# projection='polar'表示将坐标投影为极坐标
ax = plt.subplot(111, projection = 'polar')
ax.plot(theta,r,color='r',linewidth=3)
# 网格
ax.grid(True)
plt.show()