安装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做为画布,保存所有的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 对象只能位于一个Figure。轴包含两个(或3D情况下为三个) Axis对象(注意轴和Axis之间的区别),这些对象负责数据限制(数据限制也可以通过axes.Axes.set_xlim()和 axes.Axes.set_ylim()方法控制)。每个Axes都有一个标题(通过设置set_title()),一个x标签(通过设置set_xlabel())和一个y 标签(通过 设置 set_ylabel())。
axis为坐标轴,设置坐标刻度。刻度的位置由Locator决定,刻度显示格式由Formatter决定。
这些是类似数字线的对象。他们负责设置图形限制并生成刻度(轴上的标记)和刻度标签(标记刻度的刻度)。刻度的位置由Locator决定,刻度标签的刻度由格式Formatter决定。正确Locator和正确的Formatter很好地控制刻度线的位置和标签。
本质上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)
如上所述,使用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()
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渲染器做个总结(没有等级先后次序,都是非交互式的后端,拥有写入到文件中的能力)
渲染器 | 文件类型 | 描述 |
---|---|---|
AGG | png | raster graphics – high quality images using the Anti-Grain Geometry engine |
vector graphics – Portable Document Format | ||
PS | ps, eps | vector graphics – Postscript output |
SVG | svg | vector graphics – Scalable Vector Graphics |
PGF | pgf, pdf | vector graphics – using the pgf package |
Cairo | png, ps, pdf, svg | raster or vector graphics – using the Cairo library |
还有一些支持用户接口和渲染器紧密结合的后端,他们是交互式的后端,拥有在屏幕上展示的能力,使用上表中适当的渲染器来写入到文件中。
后端 | 描述 |
---|---|
GTKAgg | Agg渲染器输出到GTK绘图面板(需要PyGTK) |
GTK | GDK渲染器输出到GTK绘图面板(不推荐,需要PyGTK) |
GTKCairo | Cairo渲染器输出到GTK绘图面板(需要PyGTK) |
WXAgg | Agg渲染器输出到wxWidgets绘图面板(需要wxPython) |
WX | 原生wxWidgets绘图输出到wxWidgets绘图面板(不推荐,需要wxPython) |
TkAgg | Agg渲染器输出到Tk绘图面板(需要Tkinter) |
QtAgg | Agg渲染器输出到Qt绘图面板(不推荐,请使用Qt4Agg,需要PyQt) |
Qt4Agg | Agg渲染器输出到Qt4绘图面板(需要PyQt4) |
FLTKAgg | Agg渲染器输出到FLTK绘图面板(需要pyFLTK, 使用不是很广,考虑使用TKAgg,GTKAgg,WXAgg,或者QT4Agg替代) |
macosx | Cocoa渲染器在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/