python可视化--Matplotlib库入门(一):使用指南

2 篇文章 0 订阅
2 篇文章 0 订阅

Matplotlib库入门(一):使用指南

准备工作

安装matplotlib库:python -m pip install matplotlib 或者 pip install matplotlib
查看是否安装成功:import matplotlib.pyplot as plt

一个简单的例子

Matplotlib在Figures(即,窗口,Jupyter小部件等)上绘制数据图,每个数据可以包含一个或多个Axes(即,可以用xy坐标(或极坐标图中的ther-r)指定点的区域) ,或3D图中的xyz等)。创建具有轴的图形最简单方法是使用,pyplot.subplots然后我们可以 Axes.plot在轴上绘制一些数据:

import matplotlib.pyplot as plt 
# matplotlib 常用的图表库,用来数据可视化,并给它指定了别名plt,以免反复输入pyplot
fig, ax = plt.subplots()  # Create a figure containing a single axes. 
ax.plot([1, 2, 3, 4], [1, 4, 2, 3])  # Plot some data on the axes.  
plt.show() # matplotlib.pyplot 模块通过 show() 函数打开 matplotlib 查看器,并显示绘制的图形

这是创建一个包含单个轴的图形,在坐标轴上绘制一些数据,结果如下:
在这里插入图片描述
许多其他绘图库或语言不需要你显式创建轴。例如,在MATLAB中,

plot([1, 2, 3, 4], [1, 4, 2, 3])  % MATLAB plot.

并获得所需的图形。
实际上,你可以在Matplotlib中执行相同的操作:对于每种Axes绘图方法,matplotlib.pyplot 模块中都有一个相应的功能,可以在“当前”轴上执行该绘图,并在不存在时创建该轴(及其父图形)。所以前面的例子可以写成

import matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4], [1, 4, 2, 3])  # Matplotlib plot.
plt.show()

出现的结果是一样的:
在这里插入图片描述
看起来很单一是不是,现在,让我们更深入地了解Matplotlib图表的组件。
在这里插入图片描述

Figure

图形实例,Figure做为画布,保存所有的axes、artists和canvas等。一个figure可以拥有一个或多个axes。
创建新图形的最简单方法是使用pyplot:

# 设置点或者线等,所要处理的位置,既绘图窗口的尺寸
fig = plt.figure()  # an empty figure with no Axes
fig, ax = plt.subplots()  # a figure with a single Axes
fig, axs = plt.subplots(2, 2)  # a figure with a 2x2 grid of Axes
plt.figure(figsize=(10,6)) # 设置绘图窗口的尺寸 或者 plt.figure(dpi=80,figsize=(10,6))

分别为:没有轴的空图形、 只有一个轴的图形和具有2x2坐标的图形,三个图形画布
将轴与图形一起创建很方便,但是以后也可以添加轴,以实现更复杂的轴布局。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Axes

Axes为画轴,它是具有数据空间的图像区域。一个给定的图形可以包含许多Axes,但是一个给定的Axes 对象只能位于一个Figure。轴包含两个(或3D情况下为三个) Axis对象(注意轴和Axis之间的区别),这些对象负责数据限制(数据限制也可以通过axes.Axes.set_xlim()和 axes.Axes.set_ylim()方法控制)。每个Axes都有一个标题(通过设置set_title()),一个x标签(通过设置set_xlabel())和一个y 标签(通过 设置 set_ylabel())。

Axis

axis为坐标轴,设置坐标刻度。刻度的位置由Locator决定,刻度显示格式由Formatter决定。
这些是类似数字线的对象。他们负责设置图形限制并生成刻度(轴上的标记)和刻度标签(标记刻度的刻度)。刻度的位置由Locator决定,刻度标签的刻度由格式Formatter决定。正确Locator和正确的Formatter很好地控制刻度线的位置和标签。

Artist

本质上figure上所有能看到的,包括axes、axis、线条、文本都是artist。所有的artist都画在画布上。绝大多数的artist归属于某一axes。

以上的Figure、axis和axes的介绍,可以查看官方文档如下:
https://matplotlib.org/api/_as_gen/matplotlib.figure.Figure.html
https://matplotlib.org/api/axis_api.html
https://matplotlib.org/api/axes_api.html
https://matplotlib.org/api/artist_api.html

作为绘图函数数据的输入方式

可以使用绘图函数numpy.array或numpy.ma.masked_array 作为输入。也可以用类似array的输入,例如pandas和numpy.matrix,但是可能无法正常工作,所以最好转换成numpy.array
例如,将 pandas.DataFrame

a = pandas.DataFrame(np.random.rand(4, 5), columns = list('abcde'))
a_asarray = a.values

并转换一个 numpy.matrix

import numpy as np
b = np.matrix([[1, 2], [3, 4]])
b_asarray = np.asarray(b)
面向对象的接口和pyplot接口

如上所述,使用Matplotlib基本上有两种方法:
1.明确创建图形和轴,并在其上通过面向对象的接口在该Axes上添加图形。极端情况下用户可以完全抛弃pyplot而完全使用面向对象的接口。
2.依靠pyplot自动创建和管理图形和轴,并使用pyplot函数进行绘图。
所以可以做到(面向对象程式设计风格)

x = np.linspace(0, 2, 100)

# Note that even in the Object Oriented-style, we use `.pyplot.figure` to create the figure.
fig, ax = plt.subplots()  # Create a figure and an axes. 创建一个图形和一个轴
ax.plot(x, x, label='linear')  # Plot some data on the axes. 表示的线,label命名
ax.plot(x, x**2, label='quadratic')  # Plot more data on the axes... 表示的线,label命名
ax.plot(x, x**3, label='cubic')  # ... and some more. 表示的线,label命名
ax.set_xlabel('x label')  # Add an x-label to the axes. 标题
ax.set_ylabel('y label')  # Add a y-label to the axes. 标题
ax.set_title("Simple Plot")  # Add a title to the axes. 标题
ax.legend()  # Add a legend.

在这里插入图片描述
或(图样样式)

import matplotlib.pyplot as plt 
import numpy as np
x = np.linspace(0, 2, 100)

plt.plot(x, x, label='linear')  # Plot some data on the (implicit) axes.
plt.plot(x, x**2, label='quadratic')  # etc.
plt.plot(x, x**3, label='cubic')
plt.xlabel('x label')
plt.ylabel('y label')
plt.title("Simple Plot")
plt.legend()
plt.show() 

在这里插入图片描述
通常,人们会发现自己一遍又一遍地绘制相同的图,但是使用不同的数据集,这导致需要编写专门的函数来进行绘制。例如:

import matplotlib.pyplot as plt
import numpy as np
def my_plotter(ax, data1, data2, param_dict):
    """
    A helper function to make a graph

    Parameters
    ----------
    ax : Axes
        The axes to draw to

    data1 : array
       The x data

    data2 : array
       The y data

    param_dict : dict
       Dictionary of kwargs to pass to ax.plot

    Returns
    -------
    out : list
        list of artists added
    """
    out = ax.plot(data1, data2, **param_dict)
    return out

data1, data2, data3, data4 = np.random.randn(4, 100)
fig, ax = plt.subplots(1, 1)
my_plotter(ax, data1, data2, {'marker': 'x'})
plt.show()

在这里插入图片描述
或者如果您想拥有2个子图:

import matplotlib.pyplot as plt
import numpy as np
def my_plotter(ax, data1, data2, param_dict):
    """
    A helper function to make a graph

    Parameters
    ----------
    ax : Axes
        The axes to draw to

    data1 : array
       The x data

    data2 : array
       The y data

    param_dict : dict
       Dictionary of kwargs to pass to ax.plot

    Returns
    -------
    out : list
        list of artists added
    """
    out = ax.plot(data1, data2, **param_dict)
    return out

data1, data2, data3, data4 = np.random.randn(4, 100)
fig, (ax1, ax2) = plt.subplots(1, 2)
my_plotter(ax1, data1, data2, {'marker': 'x'})
my_plotter(ax2, data3, data4, {'marker': 'o'})
plt.show()

在这里插入图片描述

后端

matplotlib针对许多不同的使用情形和输出格式作为目标。一些人用matplotlib在python shell上交互,当他们输入命令能够弹出绘图窗口。一些人把matplotlib嵌入到其他的用户图形接口如:wxpython或者pygtk中来编写丰富的应用程序。有些人用matplotlib使用到批处理脚本中,从数字模拟中生成Postscript图片,还有些人用在web应用服务器中来动态生成图。
为了支持所有这些用例,matplotlib可以针对不同的输出,这些功能中的每一个都称为后端。而前端就是用户需要处理的代码,如绘图代码,然后后端做的就是所有看不到的辛苦工作来生成视图窗口。这里有两种不同类型的后端:
1.用户接口后端(又叫做"交互式后端",如pygtk, wxpython, thinter,qt, macosx或者fltk)。
2.硬拷贝后端,也叫做非交互式后端,用来生成图像文件(PNG,SVG,PDF, PS)
主要有三种方式配置你的后端。
1.backend : WXAgg # 使用wxpython和antigrain(agg)渲染
2.在matplotlibrc文件中设置后端参数,请查看 自定义matplotlib
3.另外一种方式是使用matplotlib的use()命令。

import matplotlib
matplotlib.use('PS') # 默认生成postscript输出。

如果你使用use命令,必须在import matplotlib.pyplot或者matplotlib.pylab之前设置。

注意: 后端的名字是不区分大小写的,如: “GTKAgg”和“gtkagg”是一样的。

使用常规方式安装matplotlib如二进制安装包或者linux发行包,那么一个好的默认后端已经设置好了,即允许你交互式工作也可以从脚本文件中绘制,可以输出到屏幕也可以输出到文件。所以你也不必去使用上面给出的方法去初始化了。

然而,如果你想要写用户图形接口或者web应用服务器(在web应用服务器中使用Matplotlib),或者需要更好理解它是怎么进行的,请阅读下去。对于图形化用户接口,为了使事情更加可定制化,matplotlib区分了渲染器(绘图)和绘图面板(显示绘图的地方)的概念。对于用户接口,典型的渲染器是Agg,它是使用Anti-Grain Geometry C++库来产生光栅(像素)图。所有的用户接口除了macosx外,都可以和agg一样来渲染,如WXAgg,GTKAgg,QT4Agg,TKAgg。另外,一些用户接口支持其他的渲染引擎。例如:使用GTK,你可以选择GDK渲染(后端为GTK), 也可以使用Cairo渲染(后端为GTKCairo)

对于渲染引擎,可以用向量或者光栅渲染器来区别。向量图语言画图命令有点像"从这个点到那个点画条线",所以是可以任意比例缩放。光栅后端通过每英寸每点的像素来产生线条。

这里对matplotlib渲染器做个总结(没有等级先后次序,都是非交互式的后端,拥有写入到文件中的能力)

渲染器文件类型描述
AGGpngraster graphics – high quality images using the Anti-Grain Geometry engine
PDFpdfvector graphics – Portable Document Format
PSps, epsvector graphics – Postscript output
SVGsvgvector graphics – Scalable Vector Graphics
PGFpgf, pdfvector graphics – using the pgf package
Cairopng, ps, pdf, svgraster or vector graphics – using the Cairo library

还有一些支持用户接口和渲染器紧密结合的后端,他们是交互式的后端,拥有在屏幕上展示的能力,使用上表中适当的渲染器来写入到文件中。

后端描述
GTKAggAgg渲染器输出到GTK绘图面板(需要PyGTK)
GTKGDK渲染器输出到GTK绘图面板(不推荐,需要PyGTK)
GTKCairoCairo渲染器输出到GTK绘图面板(需要PyGTK)
WXAggAgg渲染器输出到wxWidgets绘图面板(需要wxPython)
WX原生wxWidgets绘图输出到wxWidgets绘图面板(不推荐,需要wxPython)
TkAggAgg渲染器输出到Tk绘图面板(需要Tkinter)
QtAggAgg渲染器输出到Qt绘图面板(不推荐,请使用Qt4Agg,需要PyQt)
Qt4AggAgg渲染器输出到Qt4绘图面板(需要PyQt4)
FLTKAggAgg渲染器输出到FLTK绘图面板(需要pyFLTK, 使用不是很广,考虑使用TKAgg,GTKAgg,WXAgg,或者QT4Agg替代)
macosxCocoa渲染器在osx上。(目前在非交互式模式缺少阻塞show()行为)

注意:
内置后端的名称不区分大小写;例如,“ Qt5Agg”和“ qt5agg”是等效的。

性能

无论是以交互方式浏览数据还是以编程方式保存大量绘图,渲染性能都可能成为管道中的一个痛苦瓶颈。
Matplotlib提供了几种方法,以稍微改变绘制外观(达到可设置的公差)为代价,大大减少了渲染时间。
可用于减少渲染时间的方法取决于所创建图的类型。

线段简化
对于具有线段的图(例如,典型的线图,多边形的轮廓等),可以通过rcParams[“path.simplify”](default :True)和rcParams[“path.simplify_threshold”](default :0.111111111111)来控制渲染性能
例如,可以在matplotlibrc文件中对其进行定义(请参见 使用样式自定义Matplotlib表格和rcParams,以获取有关该matplotlibrc文件的更多信息)。
rcParams[“path.simplify”](default:True)是一个布尔值,指示是否完全简化了线段。
rcParams[“path.simplify_threshold”](default:0.111111111111)控制要简化的线段数量;阈值越高,渲染越快。

以下脚本将首先显示数据而不进行任何简化,然后以简化方式显示相同的数据。尝试与他们两个进行交互:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl

# Setup, and create the data to plot
y = np.random.rand(100000)
y[50000:] *= 2
y[np.geomspace(10, 50000, 400).astype(int)] = -1
mpl.rcParams['path.simplify'] = True

mpl.rcParams['path.simplify_threshold'] = 0.0
plt.plot(y)
plt.show()

mpl.rcParams['path.simplify_threshold'] = 1.0
plt.plot(y)
plt.show()

Matplotlib当前默认为的简化阈值1/9。
如果要更改默认设置以使用其他值,则可以更改matplotlibrc 文件。
或者,您可以创建一种用于交互式绘图的新样式(具有最大程度的简化),并可以为出版物质量绘图创建另一种样式(具有最小化的简化),并在必要时激活它们。
有关如何执行这些操作的说明,请参见 使用样式表和rcParams自定义Matplotlib。

通过将线段迭代合并为单个矢量,直到下一个线段到矢量的垂直距离(在显示坐标空间中测量)大于该path.simplify_threshold参数,简化了工作。

以上学习内容来源于 python 的 http://matplotlib.org/

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值