前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python 绘图包 Matplotlib Pyplot 教程

Python 绘图包 Matplotlib Pyplot 教程

作者头像
用户7886150
修改2020-12-25 10:12:14
1.1K0
修改2020-12-25 10:12:14
举报
文章被收录于专栏:bit哲学院

参考链接: Python | Matplotlib.pyplot

Pyplot 接口简介 

Pyplot 入门 

matplotlib.pyplot 是命令风格函数的集合,使 Matplotlib 像 MATLAB 一样工作。每个 Pyplot 函数对图形做一些修改,例如:创建一个图形,在图形中创建一个绘图区域,在绘图区域中回值一些线条,用标签装饰图形等等。 

在 matplotlib.pyplot中,在函数调用之间保留了各种状态,以便跟踪当前图形和绘图区域等内容,绘图函数指向当前 轴(Axes 对象)。 

 注意 Pyplot API 通常不如面向对象的 API 灵活。在这里看到的大多数函数调用也可以作为 Axes 对象的方法调用。建议浏览教程和实力来了解这是如何工作的。 

用 Pyplot 生成可视化效果非常快速: 

import matplotlib.pyplot as plt

plt.plot([1, 2, 3, 4])

plt.ylabel('some numbers')

plt.show() 

可能知道为什么 X轴的范围是 0-3,Y 轴的范围是 1-4。如果向 plot() 命令提供单个列表或数组,Matplotlib 将假定是一个 Y 值序列,并自动生成 X 值。因为 Python 范围以 0 开头,所以默认的 X 向量与 Y 的长度相同,但是以 0 开头。因此 X 数据是[0, 1, 2, 3]。 

plt.plot([1, 2, 3, 4], [1, 4, 9, 16]) 

设置图的样式 

对于每一对 X,Y 参数,第三个参数都是可选的,它是指示绘图的颜色和线条类型的格式字符串。格式字符串的字母和符号来自 MATLAB,可以将一个颜色字符串与一个行样式字符串连接起来。默认的格式字符串是“b-”,这是一个纯蓝色的线。例如:要用红色源泉回值上面的图,代码如下: 

plt.plot([1, 2, 3, 4], [1, 4, 9, 16], 'ro')

plt.axis([0, 6, 0, 20])

plt.show() 

有关行样式和格式化字符串的完整列表,参见 plot() 文档。上面示例中的 axis() 命令接受一个 [ xmin,xmax,ymin,ymax ] 列表,并指定轴的视口。 

所有序列都在内部转换成 numpy 数组。下面是示例: 

import numpy as np

# evenly sampled time at 200ms intervals

t = np.arange(0., 5., 0.2)

# red dashes, blue squares and green triangles

plt.plot(t, t, 'r--', t, t**2, 'bs', t, t**3, 'g^')

plt.show() 

使用关键词字符串绘图 

在某些情况下,数据的格式允许使用字符串访问特定的变量。例如:使用 numpy.recarray 或 

pandas.DataFrame。 

Matplotlib 允许使用 data 关键字参数提供这样的对象。如果提供了,那么可以生成包含与这些变量对应字符串的绘图。 

data = {'a': np.arange(50),

        'c': np.random.randint(0, 50, 50),

        'd': np.random.randn(50)}

data['b'] = data['a'] + 10 * np.random.randn(50)

data['d'] = np.abs(data['d']) * 100

plt.scatter('a', 'b', c='c', s='d', data=data)

plt.xlabel('entry a')

plt.ylabel('entry b')

plt.show() 

用分类变量绘图 

还可以使用分类变量创建绘图。Matplotlib 允许直接将分类变量传递给许多绘图函数。例如: 

names = ['group_a', 'group_b', 'group_c']

values = [1, 10, 100]

plt.figure(1, figsize=(9, 3))

plt.subplot(131)

plt.bar(names, values)

plt.subplot(132)

plt.scatter(names, values)

plt.subplot(133)

plt.plot(names, values)

plt.suptitle('Categorical Plotting')

plt.show() 

控制线属性 

线有许多可以设置的属性: linewidth、 dash style、 antialiased 等; 请参见matplotlib.lines.Line2D。有几种方法可以设置 line 属性: 

使用关键字方向图:

plt.plot(x, y, linewidth=2.0) 

使用 Line2D 实力的 setter 方法。Plot 返回一个 Line2D 对象列表,例如:line1, line2 = plot(x1, y1, x2, y2)。在下面的代码中,假设只有一行,所以返回的列表长度为 1。使用元组拆分行,以获得该列表的第一个元素:

line, = plt.plot(x, y, '-')

line.set_antialiased(False) # turn off antialising 

使用 setp() 命令。下面的示例使用 MATLAB-style 的命令来设置行列表的多个属性。显而易见 setp 可以处理对象表单或单个对象。可以使用 Python 关键字参数或 MATLAB-style 的字符串或键值对。

lines = plt.plot(x1, y1, x2, y2)

# use keyword args

plt.setp(lines, color='r', linewidth=2.0)

# or MATLAB style string value pairs

plt.setp(lines, 'color', 'r', 'linewidth', 2.0) 

详细的 Line2D 属性。 

若要获取可设置行属性的列表,请使用一行或多行作为参数调用 setp() 函数: 

In [69]: lines = plt.plot([1, 2, 3])

In [70]: plt.setp(lines)

  alpha: float

  animated: [True | False]

  antialiased or aa: [True | False]

  ...snip 

生成多个图和轴 

MATLAB 和 pyplot,具有当前图形和当前 Axes(轴对象)。所有绘图命令都应用于当前 Axes。函数 gca() 返回当前 Axes( matplotlib.axes.Axes 实例),gca() 返回当前图形(matplotlib.figure.Figure 实例)。下面是创建两个图的代码: 

def f(t):

    return np.exp(-t) * np.cos(2*np.pi*t)

t1 = np.arange(0.0, 5.0, 0.1)

t2 = np.arange(0.0, 5.0, 0.02)

plt.figure(1)

plt.subplot(211)

plt.plot(t1, f(t1), 'bo', t2, f(t2), 'k')

plt.subplot(212)

plt.plot(t2, np.cos(2*np.pi*t2), 'r--')

plt.show() 

 figure() 命令是可选的,因为图1是默认创建的,就像如果不手动指定任何坐标轴,默认情况下会创建一个子图2 一样。subplot() 命令 numrows,numcols,plot_number,其中plot_number 范围从1到numrows * numcols。如果numrows * numcols < 10,那么 subplot 命令逗号是可选的。所以subplot(211)和subplot(2, 1, 1)是一样的。 

可以创建任何数量的子图和轴。如果想动手设置一个坐标轴,可以使用 axes() 命令,该命令允许将位置指定为 axes([左,底,宽,高]),其中所有值都是小数(0-1)坐标。有关手动设置轴的示例,请参见 Axes Demo;有关许多子图示例,请参见 Basic Subplot Demo。 

import matplotlib.pyplot as plt

plt.figure(1)                # the first figure

plt.subplot(211)             # the first subplot in the first figure

plt.plot([1, 2, 3])

plt.subplot(212)             # the second subplot in the first figure

plt.plot([4, 5, 6])

plt.figure(2)                # a second figure

plt.plot([4, 5, 6])          # creates a subplot(111) by default

plt.figure(1)                # figure 1 current; subplot(212) still current

plt.subplot(211)             # make subplot(211) in figure1 current

plt.title('Easy as 1, 2, 3') # subplot 211 title 

可以使用 clf() 清楚当前轴。这是一个面向对象 API 的有状态包装器,可以参见 Artist 教程。 

如果制作大量图形,那么需要需要注意的:一个图形所需的内存在使用 close() 显示关闭之前是不被完全释放的。删除对图形的所有引用,[并 、或] 关闭窗口是不够的。因为 pyplot 内部引用指到 close() 结束 。 

操作文本 

 text() 命令可用于在任何位置添加文本,而 xlabel()、ylabel() 和 title() 则用于指定位置添加文本,可参见 Text in Matplotlib Plots。 

mu, sigma = 100, 15

x = mu + sigma * np.random.randn(10000)

# the histogram of the data

n, bins, patches = plt.hist(x, 50, density=1, facecolor='g', alpha=0.75)

plt.xlabel('Smarts')

plt.ylabel('Probability')

plt.title('Histogram of IQ')

plt.text(60, .025, r'$\mu=100,\ \sigma=15$')

plt.axis([40, 160, 0, 0.03])

plt.grid(True)

plt.show() 

所有 text() 命令都返回一个 matplotlib.text.Text 实例。也可以通过setp() 来自定义属性: 

t = plt.xlabel('my data', fontsize=14, color='red') 

更多 Text 属性和布局详细。 

Matplotlib 接受任何文本表达式中的 TeX 方程式。例如:要在标题中写入表达式 σi=15,可以写 TeX 表达式,周围用 $ 包围: 

plt.title(r'$\sigma_i=15$') 

标题字符串前面的 r 非常重要——它表示该字符串是一个原始字符串,并且不将反斜杠视为 python 转义。 Matplotlib 有一个内置的 TeX 表达式解析器和布局引擎,并有自己的数学字体,详情参看。因此,您可以跨平台使用数学文本,而无需安装 TeX。 对于安装了 LaTeX 和 dvipng 的用户,还可以使用 LaTeX 格式化文本,并将输出直接合并到显示图形或保存的 postscript 中。请参见使用 LaTeX 的文本。 

注解文本 

text() 命令的使用将文本房子在轴线上的任意位置。文本的一个常见用途是对 plot 的某些特性进行注释,而annotate() 方法提供了帮助器功能,使注释变得简单。在注释中,有两点需要考虑:用 XY 参数表示的注释位置位置额和文本 xytext 的位置。这两个参数都是 ( x, y ) 元组。 

在这个基本示例中,xy (箭头顶端)和 xytext 位置(文本位置)都在数据坐标中。还有许多其它的坐标系可供选择,详情参见文档和高级注释。更多例子可参见。 

对数 和 其它非线性轴 

matplotlib.pyplot 不仅支持线性轴刻度,还支持对数和对数尺度。如果数据跨越多个数量级,这是常用的。改变一个轴的尺寸很容易: 

plt.xscale('log') 

下面显示了 y 轴具有相同数据和不同尺度的四个绘图示例: 

from matplotlib.ticker import NullFormatter  # useful for `logit` scale

# Fixing random state for reproducibility

np.random.seed(19680801)

# make up some data in the interval ]0, 1[

y = np.random.normal(loc=0.5, scale=0.4, size=1000)

y = y[(y > 0) & (y < 1)]

y.sort()

x = np.arange(len(y))

# plot with various axes scales

plt.figure(1)

# linear

plt.subplot(221)

plt.plot(x, y)

plt.yscale('linear')

plt.title('linear')

plt.grid(True)

# log

plt.subplot(222)

plt.plot(x, y)

plt.yscale('log')

plt.title('log')

plt.grid(True)

# symmetric log

plt.subplot(223)

plt.plot(x, y - y.mean())

plt.yscale('symlog', linthreshy=0.01)

plt.title('symlog')

plt.grid(True)

# logit

plt.subplot(224)

plt.plot(x, y)

plt.yscale('logit')

plt.title('logit')

plt.grid(True)

# Format the minor tick labels of the y-axis into empty strings with

# `NullFormatter`, to avoid cumbering the axis with too many labels.

plt.gca().yaxis.set_minor_formatter(NullFormatter())

# Adjust the subplot layout, because the logit one may take more space

# than usual, due to y-tick labels like "1 - 10^{-3}"

plt.subplots_adjust(top=0.92, bottom=0.08, left=0.10, right=0.95, hspace=0.25,wspace=0.35)

plt.show() 

也可以添加自己的缩放,详细信息请参阅开发人员创建缩放和转换的指南。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档