1、快速绘图

matplotlib的pyplot子库提供了和matlab类似的绘图API,方便快速绘制2D图表

# -*- coding: utf-8 -*-
"""
Created on Thu Aug 10 18:14:43 2017@author: LiLong
"""
import numpy as np
import matplotlib.pyplot as pltx = np.linspace(0, 10, 1000)
y = np.sin(x)
z = np.cos(x**2)# 调用figure创建一个绘图对象,figsize参数指定绘图对象的宽度和高度
plt.figure(figsize=(8,4))
plt.plot(x,y,label="$sin(x)$",color="red",linewidth=2)
# 参数"b--"指定曲线的颜色和线型,这个参数称为格式化参数
plt.plot(x,z,"b--",label="$cos(x^2)$")
# 标签值
plt.xlabel("Time(s)")
plt.ylabel("Volt")
# 标题
plt.title("PyPlot First Example")
# ylim : 设置Y轴的范围
plt.ylim(-1.2,1.2)
# legend : 显示图示
plt.legend()
plt.show()
  • label : 给所绘制的曲线一个名字,此名字在图示(legend)中显示。只要在字符串前后添加”$”符号,matplotlib就会使用其内嵌的latex引擎绘制的数学公式。
  • color : 指定曲线的颜色
  • linewidth : 指定曲线的宽度

运行结果:

2、Artist对象

Artists分为简单类型和容器类型两种。简单类型的Artists为标准的绘图元件,例如Line2D、 Rectangle、 Text、AxesImage 等等。而容器类型则可以包含许多简单类型的Artists,使它们组织成一个整体,例如Axis、 Axes、Figure等。

直接使用Artists创建图表的标准流程如下:

  • 创建Figure对象
  • 用Figure对象创建一个或者多个Axes或者Subplot对象
  • 调用Axies等对象的方法创建各种简单类型的Artists
fig = plt.figure()
ax = fig.add_axes([0.15, 0.1, 0.7, 0.3])
line= ax.plot([1,2,3],[1,2,1])
ax.set_xlabel("time")
fig.show()

下面首先调用pyplot.figure辅助函数创建Figure对象,然后调用Figure对象的add_axes方法在其中创建一个Axes对象,add_axes的参数是一个形如[left, bottom, width, height]的列表,这些数值分别指定所创建的Axes对象相对于fig的位置和大小,取值范围都在0到1之间。

调用ax的plot方法绘图,创建一条曲线,并且返回此曲线对象(Line2D)

ax.lines是一个为包含ax的所有曲线的列表,后续的ax.plot调用会往此列表中添加新的曲线。如果想删除某条曲线的话,直接从此列表中删除即可。

运行结果:

2.1 Artist的属性

图表中的每个元素都用一个matplotlib的Artist对象表示,而每个Artist对象都有一大堆属性控制其显示效果。例如Figure对象和Axes对象都有patch属性作为其背景,它的值是一个Rectangle对象。通过设置此它的一些属性可以修改Figrue图表的背景颜色或者透明度等属性

patch的color属性通过set_color函数进行设置,属性修改之后并不会立即反映到图表的显示上,还需要调用fig.canvas.draw()函数才能够更新显示。

下面是Artist对象都具有的一些属性:

alpha : 透明度,值在0到1之间,0为完全透明,1为完全不透明
animated : 布尔值,在绘制动画效果时使用
axes : 此Artist对象所在的Axes对象,可能为None
clip_box : 对象的裁剪框
clip_on : 是否裁剪
clip_path : 裁剪的路径
contains : 判断指定点是否在对象上的函数
figure : 所在的Figure对象,可能为None
label : 文本标签
picker : 控制Artist对象选取
transform : 控制偏移旋转
visible : 是否可见
zorder : 控制绘图顺序

2.2 Figure容器

最大的Artist容器是matplotlib.figure.Figure,它包括组成图表的所有元素。图表的背景是一个Rectangle对象,用Figure.patch属性表示。当你通过调用add_subplot或者add_axes方法往图表中添加轴(子图时),这些子图都将添加到Figure.axes属性中,同时这两个方法也返回添加进axes属性的对象,注意返回值的类型有所不同,实际上AxesSubplot是Axes的子类。

Figure对象可以拥有自己的文字、线条以及图像等简单类型的Artist。缺省的坐标系统为像素点,但是可以通过设置Artist对象的transform属性修改坐标系的转换方式。最常用的Figure对象的坐标系是以左下角为坐标原点(0,0),右上角为坐标(1,1)。下面的程序创建并添加两条直线到fig中:

from matplotlib.lines import Line2D
fig = plt.figure()
line1 = Line2D([0,1],[0,1], transform=fig.transFigure, figure=fig, color="r")
line2 = Line2D([0,1],[1,0], transform=fig.transFigure, figure=fig, color="g")
fig.lines.extend([line1, line2])
fig.show()

注意为了让所创建的Line2D对象使用fig的坐标,我们将fig.TransFigure赋给Line2D对象的transform属性;为了让Line2D对象知道它是在fig对象中,我们还设置其figure属性为fig;最后还需要将创建的两个Line2D对象添加到fig.lines属性中去。

Figure对象有如下属性包含其它的Artist对象:

axes : Axes对象列表
patch : 作为背景的Rectangle对象
images : FigureImage对象列表,用来显示图片
legends : Legend对象列表
lines : Line2D对象列表
patches : patch对象列表
texts : Text对象列表,用来显示文字

2.3 Axes容器

Axes容器是整个matplotlib库的核心,它包含了组成图表的众多Artist对象,并且有许多方法函数帮助我们创建、修改这些对象。和Figure一样,它有一个patch属性作为背景,当它是笛卡尔坐标时,patch属性是一个Rectangle对象,而当它是极坐标时,patch属性则是Circle对象

fig = plt.figure()
ax = fig.add_subplot(111)
ax.patch.set_facecolor("green")
x, y = np.random.rand(2, 100)
line, = ax.plot(x, y, "-", color="blue", linewidth=2)
fig.show()

当你调用Axes的绘图方法(例如plot),它将创建一组Line2D对象,并将所有的关键字参数传递给这些Line2D对象,并将它们添加进Axes.lines属性中
当你调用Axes的绘图方法(例如plot),它将创建一组Line2D对象,并将所有的关键字参数传递给这些Line2D对象,并将它们添加进Axes.lines属性中

与plot方法类似,绘制直方图的方法bar和绘制柱状统计图的方法hist将创建一个Patch对象的列表,每个元素实际上都是Patch的子类Rectangle,并且将所创建的Patch对象都添加进Axes.patches属性中:

一般我们不会直接对Axes.lines或者Axes.patches属性进行操作,而是调用add_line或者add_patch等方法,这些方法帮助我们完成许多属性设置工作:

import matplotlib.patchesfig = plt.figure()
ax = fig.add_subplot(111)
rect = matplotlib.patches.Rectangle((1,1), width=5, height=12)
ax.add_patch(rect)  # 将rect添加进ax
ax.autoscale_view() # 自动调整坐标轴范围
fig.show()

下面详细列出Axes包含各种Artist对象的属性:

artists : Artist对象列表
patch : 作为Axes背景的Patch对象,可以是Rectangle或者Circle
collections : Collection对象列表
images : AxesImage对象列表
legends : Legend对象列表
lines : Line2D对象列表
patches : Patch对象列表
texts : Text对象列表
xaxis : XAxis对象
yaxis : YAxis对象
下面列出Axes的创建Artist对象的方法:

下面以绘制散列图(scatter)为例,验证一下

fig = plt.figure()
ax = fig.add_subplot(111)
t = ax.scatter(np.random.rand(20), np.random.rand(20))
fig.show()
print t.get_sizes() # 获得Collection的点数
print t  # 返回值为CircleCollection对象
print ax.collections  # 返回的对象已经添加进了collections列表中

2.4 Axis容器

Axis容器包括坐标轴上的刻度线、刻度文本、坐标网格以及坐标轴标题等内容。刻度包括主刻度和副刻度,分别通过Axis.get_major_ticks和Axis.get_minor_ticks方法获得。每个刻度线都是一个XTick或者YTick对象,它包括实际的刻度线和刻度文本。为了方便访问刻度线和文本,Axis对象提供了get_ticklabels和get_ticklines方法分别直接获得刻度线和刻度文本:

from matplotlib.ticker import MultipleLocator, FuncFormatterx = np.arange(0, 4*np.pi, 0.01)
y = np.sin(x)
plt.figure(figsize=(8,4))
plt.plot(x, y)
ax = plt.gca()
def pi_formatter(x, pos):"""比较罗嗦地将数值转换为以pi/4为单位的刻度文本"""m = np.round(x / (np.pi/4))n = 4if m%2==0: m, n = m/2, n/2if m%2==0: m, n = m/2, n/2if m == 0:return "0"if m == 1 and n == 1:return "$\pi$"if n == 1:return r"$%d \pi$" % mif m == 1:return r"$\frac{\pi}{%d}$" % nreturn r"$\frac{%d \pi}{%d}$" % (m,n)# 设置两个坐标轴的范围
plt.ylim(-1.5,1.5)
plt.xlim(0, np.max(x))# 设置图的底边距
plt.subplots_adjust(bottom = 0.15)plt.grid() #开启网格# 主刻度为pi/4
ax.xaxis.set_major_locator( MultipleLocator(np.pi/4) )# 主刻度文本用pi_formatter函数计算
ax.xaxis.set_major_formatter( FuncFormatter( pi_formatter ) )# 副刻度为pi/20
ax.xaxis.set_minor_locator( MultipleLocator(np.pi/20) )# 设置刻度文本的大小
for tick in ax.xaxis.get_major_ticks():tick.label1.set_fontsize(16)
plt.show()

关于刻度的定位和文本格式的东西都在matplotlib.ticker中定义,程序中使用到如下两个类:

MultipleLocator : 以指定值的整数倍为刻度放置刻度线
FuncFormatter : 使用指定的函数计算刻度文本,他会传递给所指定的函数两个参数:刻度值和刻度序号,程序中通过比较笨的办法计算出刻度值所对应的刻度文本

参考:

http://old.sebug.net/paper/books/scipydoc/matplotlib_intro.html

Python的matplotlib—绘图(3)相关推荐

  1. Python使用matplotlib绘图并去除颜色样条colorbar实战:remove colorbar from figure in matplotlib

    Python使用matplotlib绘图并去除颜色样条colorbar实战:remove colorbar from figure in matplotlib 目录 Python使用matplotli ...

  2. Python:matplotlib绘图

    1.Python:matplotlib绘图时指定图像大小,放大图像 matplotlib绘图时是默认的大小,有时候默认的大小会感觉图片里的内容都被压缩了,解决方法如下. 先是原始代码: 1 2 3 4 ...

  3. Python利用Matplotlib绘图无法显示中文字体的解决方案

    这里写目录标题 问题描述 报错信息 解决方法 其他解决方案 使用模板(内置样式)后无法显示中文的解决方案 问题描述 在Python利用Matplotlib绘图的时候,无法显示坐标轴上面的中文和标题里面 ...

  4. python的matplotlib绘图(双坐标轴)

    python的matplotlib绘图(双坐标轴) 绘制图形如下: 代码如下: import pandas as pd import matplotlib.pyplot as plt from pyl ...

  5. python中matplotlib绘图中文显示问题

    由于毕业设计中用到了python的matplotlib绘图,期间老师一直要让图中的title和label中文显示,matplotlib默认不支持中文, 经过了一上午的折腾,终于成功解决这个问题,这里分 ...

  6. AI: Python 的Matplotlib 绘图算法库 介绍。

    Python 的Matplotlib 绘图算法库 介绍. Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形  . 通过 Matp ...

  7. python,matplotlib绘图基本操作美化教程

    这次来整理一波python用matplotlib绘图的常用函数,以及如何修改默认死亡配色. 前期准备 导入包 import numpy as np import pandas as pd import ...

  8. Python:matplotlib绘图时指定图像大小,放大图像

    matplotlib绘图时是默认的大小,有时候默认的大小会感觉图片里的内容都被压缩了,解决方法如下. 先是原始代码: from matplotlib import pyplot as pltplt.f ...

  9. python坐标轴刻度设置_学习python中matplotlib绘图设置坐标轴刻度、文本

    总结matplotlib绘图如何设置坐标轴刻度大小和刻度. 上代码: from pylab import * from matplotlib.ticker import MultipleLocator ...

  10. 解决Python使用matplotlib绘图时出现的中文标签报错问题

    Python中使用matplotlib绘图时发现控制台报如下问题,可知是中文字体问题 解决方案 只需设置下参数即可,设置代码如下 import matplotlib.pyplot as pltplt. ...

最新文章

  1. [WCF编程]10.操作:回调操作
  2. Qt下使用OpenCV3打开摄像头并把图像显示到QLabel上
  3. 2021年 面经面试题
  4. (DFS)棋盘问题(poj1321)
  5. JavaScript 面向对象编程(一) —— 面向对象基础
  6. java中的的一些生命周期,Java中对象的生命周期
  7. 港铁将更换信号系统 或影响日间列车服务冀乘客谅解
  8. java 错误页_《javaweb学习笔记2-jsp错误页设置》
  9. 矩阵键盘mega16 c语言程序,矩阵键盘实现16个按键操作原理及应该方案
  10. matlab中的sparse和full以及ground truth matrix
  11. 思科ccnp认证工程师必看
  12. 服务器日志修改保存时间,日志服务保留时间
  13. 国科大在线android版app,国科大心理app
  14. MIPI DSI之DBI DPI含义和区别(3-1)
  15. 福特汉姆大学计算机科学专业,福特汉姆大学计算机研究生
  16. DOM对象之事件对象(Object《Event》)
  17. Unity性能优化之动态图形渲染
  18. 教您用数学课件制作工具演示线变二面角
  19. 【散文】一帘幽梦雨,冰冷三秋天
  20. Groovy on Grails(Java笨狗)系列---开篇(一)

热门文章

  1. OpenCV使用Shi-Tomasi方法检测拐角的实例(附完整代码)
  2. OpenCV cv :: UMat与DirectX9曲面的互操作性的实例(附完整代码)
  3. Qt Creator使用Git
  4. OpenGL Assimp模型加载库
  5. C++赋值运算符和拷贝构造函数区别
  6. 经典C语言程序100例之四六
  7. 经典C语言程序100例之四二
  8. C语言的关键字 extern
  9. mysql支持arm64架构吗_arm64(aarch64)下使用mysql
  10. 14_Android中Service的使用,关于广播接收者的说明