Python可视化(一)——Matplotlib

Matplotlib是一个可视化库,能够用来创建各种各样的图表,可以用于数据科学、量化交易等领域。官网对该工具的介绍为:

Matplotlib is a comprehensive library for creating static, animated, and interactive visualizations in Python. Matplotlib makes easy things easy and hard things possible.

- Create publication quality plots.
- Make interactive figures that can zoom, pan, update.
- Customize visual style and layout.
- Export to many file formats.
- Embed in JupyterLab and Graphical User Interfaces.
- Use a rich array of third-party packages built on Matplotlib.
官网地址为:https://matplotlib.org/

本文主要是利用Jupyter notebook来学习Python的Matplotlib库,首先需要用到以下命令:

%matplotlib notebook
%matplotlib inline

上面的命令能够将matplotlib显示出来的图形内嵌到notebook中。

和numpy一般被命令为np一样,matplotlib一般被命令为plt. 通常采用如下的导入方式:

import matplotlib.pyplot as plt

示例

这里先看一个示例:

data = [9, 4, 2, 5, 7, 1, 2, 3, 4, 5, 6, 7, 8]

plt.plot(data)

plt.show()


一般说来,图表需要指定横纵坐标的数值才可以完成作图。但从上述内容来看,参数只有一个列表,此时参数表示纵坐标的值,而默认的横坐标则为0起始的整数。正常情况下的输入应该是这样的:

plt.plot(data[-1::-1], data)

plt.show()

颜色、标记和线型

既然是可视化,那么不是简单地画图就可以的,还要注意美观和布局。

matplotlib中关于颜色、线型和标记的参数为:

  • 颜色:color
  • 线型:linestyle
  • 标记:marker

比如还是上面的代码,加上颜色,线性和标记后为:

data = [9, 4, 2, 5, 7, 1, 2, 3, 4, 5, 6, 7, 8]

plt.plot(data, color='red', linestyle='dashed', linewidth = 3,marker='o', markerfacecolor='blue', markeredgecolor = "black", markeredgewidth = 3, markersize=12)

plt.show()

上边的代码分别设置了线条的颜色、线条的样式、线条的宽度、线条上的点的样式、点的颜色、点的边缘颜色、点的边缘宽度、点的大小。也可以写为以下形式:

data = [9, 4, 2, 5, 7, 1, 2, 3, 4, 5, 6, 7, 8]

plt.plot(data, "r--", linewidth = 3,marker='o', markerfacecolor='blue', markeredgecolor = "black", markeredgewidth = 3, markersize=12)

plt.show()

其中"r--"是线条的颜色为红色、线条的样式为虚线的缩写。一般常见的颜色和线条样式会采用这种形式书写。

这里看下plot方法常用参数都有哪些:

  • x: x 轴上的数据点,可以是一个数组、列表或其他可迭代对象。
  • y: y 轴上的数据点,可以是一个数组、列表或其他可迭代对象。
  • fmt: 绘图的格式字符串,用于指定绘图的颜色、线型和标记样式。例如,"b-" 表示蓝色实线,"ro" 表示红色圆圈标记。默认值为 "b-"。
  • linestyle: 线型,可以是一个字符串,如 "-"(solid,实线)、"--"(dashed,虚线)、":"(dotted,点线)、"-."(dashdot,点划线)等。
  • linewidth: 线宽,用于指定绘图的线条宽度。
  • color: 线条的颜色,可以是一个字符串,如 "blue"、"red"、"green" 等,也可以是一个表示颜色的十六进制值,如#CECECE。
  • drawstyle:用于指定曲线的连接方式,'default': 默认值,曲线的连接方式是直线段、'steps-pre': 用阶梯形式连接数据点,从当前点的纵坐标值开始绘制,直到下一个点的横坐标值、'steps-mid': 用阶梯形式连接数据点,从当前点的纵坐标值开始绘制,直到下一个点的横坐标值的中间位置、'steps-post': 用阶梯形式连接数据点,从当前点的纵坐标值开始绘制,直到下一个点的纵坐标值。
  • marker: 数据点的标记样式,可以是一个字符串,如 "."(点)、"o"(圆圈)、"s"(方块)、"^"(上三角)、"v"(下三角)、"+"(加号)、"x"(叉号)等。
  • markersize: 数据点标记的大小。
  • markerfacecolor: 数据点标记的填充颜色。
  • markeredgecolor: 数据点标记的边框颜色。
  • markeredgewidth: 数据点标记的边框宽度。
  • label: 曲线的标签,用于生成图例。
  • alpha: 曲线的透明度,取值范围为 0(完全透明)到 1(不透明)之间。

Figure和Subplot

matplotlib的图像都位于Figure对象中,该对象可以通过plt.figure来创建:

fig = plt.figure()

上面只是创建了一个新的figure对象,但是上面并没有内容要显示。这就好比在墙壁上挂了一张画布,但是画布上并没有图案。此时需要通过add_subplot创建subplot才可以进行创作:

data = [9, 4, 2, 5, 7, 1, 2, 3, 4, 5, 6, 7, 8]

fig = plt.figure()

ax1 = fig.add_subplot(2, 2, 1)
ax1.plot(data)

ax2 = fig.add_subplot(2, 2, 2)
ax2.plot(data[-1::-1], data)

ax3 = fig.add_subplot(2, 2, 3)
ax3.plot(sorted(data), data)

ax4 = fig.add_subplot(2, 2, 4)
ax4.plot(sorted(data, reverse=True), data)

上面代码的含义是对画布的整个操作区域进行分隔,分为了2*2共4块子画布,然后就可以按照每块子画布的索引进行显示。这里是通过jupyter进行显示的,在交互式窗口执行的代码顺序可能并不一致,并还需要调用以下命令才能完成显示:

fig.show()

而如果使用下面的代码执行,则会默认使用最后创建的子画布句柄进行绘图:

data = [9, 4, 2, 5, 7, 1, 2, 3, 4, 5, 6, 7, 8]

fig = plt.figure()

ax1 = fig.add_subplot(2, 2, 1)
ax2 = fig.add_subplot(2, 2, 2)
ax3 = fig.add_subplot(2, 2, 3)
ax4 = fig.add_subplot(2, 2, 4)

plt.plot(sorted(data, reverse=True), data)

上面那些由fig.add_subplot所返回的对象是AxesSubplot对象,直接调用它们的实例方法就可以在子画布中进行绘图。同时还可以在每个字画布中进行不同类型的图表类型绘制:

data = [9, 4, 2, 5, 7, 1, 2, 3, 4, 5, 6, 7, 8]

fig = plt.figure()

ax1 = fig.add_subplot(2, 2, 1)
ax1.plot(data)

ax2 = fig.add_subplot(2, 2, 2)
ax2.scatter(range(len(data)), data)

ax3 = fig.add_subplot(2, 2, 3)
ax3.hist(data)

ax4 = fig.add_subplot(2, 2, 4)
ax4.bar(range(len(data)), data)

上述图表类型分别对应折线图、散点图、直方图、条形图,除此之外还存在很多图表类型。

另外子画布的创建还可以采用其他的形式,下面三种写法是一样的。

fig = plt.figure()

ax1 = fig.add_subplot(2, 2, 1)
ax2 = fig.add_subplot(2, 2, 2)
ax3 = fig.add_subplot(2, 2, 3)
ax4 = fig.add_subplot(2, 2, 4)

fig = plt.figure()

ax1 = fig.add_subplot(221)
ax2 = fig.add_subplot(222)
ax3 = fig.add_subplot(223)
ax4 = fig.add_subplot(224)

fig, axs = plt.subplots(2, 2)
ax1, ax2, ax3, ax4 = axs[0, 0], axs[0, 1], axs[1, 0], axs[1, 1]

调整subplot周围的间距

默认情况下,各个子画布之间是存在间距的。间距跟图像的高度和宽度有关,因此,如果调整了图像大小(不管是编程还是手工),间距也会自动调整。

利用Figure的subplots_adjust方法可以轻而易举地修改间距:

plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)

wspace和hspace用于控制宽度和高度的百分比,可以用作subplot之间的间距。

data = [9, 4, 2, 5, 7, 1, 2, 3, 4, 5, 6, 7, 8]

fig = plt.figure()

ax1 = fig.add_subplot(2, 2, 1)
ax1.plot(data)

ax2 = fig.add_subplot(2, 2, 2)
ax2.scatter(range(len(data)), data)

ax3 = fig.add_subplot(2, 2, 3)
ax3.pie(data)

ax4 = fig.add_subplot(2, 2, 4)
ax4.bar(range(len(data)), data)

plt.subplots_adjust(wspace=0, hspace=0)

刻度、标签和图例

这部分内容不是对数据本身的可视化部分进行修改,而是要对图表的属性进行修改。可以通过两种方式实现:

  • - 使用过程型的pyplot接口,如matplotlib.pyplot
  • - 面向对象的原生matplotlib API

pyplot接口的设计目的就是交互式使用,含有诸如xlim、xticks和xticklabels之类的方法。它们分别控制图表的范围、刻度位置、刻度标签等。其使用方式有以下两种:

  • - 调用时不带参数,则返回当前的参数值(例如,plt.xlim()返回当前的X轴绘图范围)。
  • - 调用时带参数,则设置参数值(例如,plt.xlim([0,10])会将X轴的范围设置为0到10)。

所有这些方法都是对当前或最近创建的AxesSubplot起作用的。它们各自对应subplot对象上的两个方法,以xlim为例,就是ax.get_xlim和ax.set_xlim。

设置标题、轴标签、刻度以及刻度标签

首先随机创建一组数据,并给出原始图表:

import random

data = [random.randint(0,100) for i in range(100)]

plt.plot(data)

plt.show()

先看使用plt怎么改变坐标轴范围、坐标轴刻度、标签和标题:

plt.plot(data)
plt.xlim(0, 120)
plt.ylim(0, 120)
plt.xticks(ticks = range(0, 120, 30), labels = ["one", "two", "three", "four"], rotation=45, fontsize="large")
plt.yticks(ticks = range(0, 120, 30), labels = ["one", "two", "three", "four"], rotation=45, fontsize="large")

plt.xlabel("X Axis")
plt.ylabel("Y Axis")
plt.title("Title")

plt.show()

对应的使用面向对象的接口进行相同操作:

fig = plt.figure()

ax = fig.add_subplot(111)
ax.plot(data)
ax.set_xlim(0, 120)
ax.set_ylim(0, 120)
ax.set_xticks(ticks = range(0, 120, 30))
ax.set_xticklabels(labels = ["one", "two", "three", "four"], rotation=45, fontsize="large")
ax.set_yticks(ticks = range(0, 120, 30))
ax.set_yticklabels(labels = ["one", "two", "three", "four"], rotation=45, fontsize="large")

ax.set_xlabel("X Axis")
ax.set_ylabel("Y Axis") 
ax.set_title("Title")

可见通过ax进行设置主要是通过set_XXX()的方式进行设置,结果和使用plt进行设置是一样的。上面的代码也可以改写为:

fig = plt.figure()

ax = fig.add_subplot(111)
ax.plot(data)

props = {
    "title": "Title",
    "xlabel": "X Axis",
    "ylabel": "Y Axis",
    "xlim": (0, 120),
    "ylim": (0, 120),
    "xticks": range(0, 120, 30),
    "xticklabels": ["one", "two", "three", "four"],
    "yticks": range(0, 120, 30),
    "yticklabels": ["one", "two", "three", "four"],
}

ax.set(**props)

添加图例

图例可以用来标识图表元素,通常要观察的数据不止一组时用于区分。可以在创建时利用label参数进行区分,然后调用legend方法进行显示:

plt.plot(data, label="data")
plt.plot(data[::-1], label="data[::-1]")plt.legend()
plt.show()

图例的位置是可以调整的,这里换用子画布举例:

fig = plt.figure()

ax = fig.add_subplot(111)

ax.plot(data, label="data")
ax.plot(data[::-1], label="data[::-1]")

ax.legend(loc = "best", ncol = 2, fontsize = "large")

当然legend还有几个其他的位置参数和其他参数,如位置参数都有:

  • best,代码为0
  • upper right,代码为1
  • upper left,代码为2
  • lower left,代码为3
  • lower right,代码为4
  • right,代码为5
  • center left,代码为6
  • center right,代码为7
  • lower center,代码为8
  • upper center,代码为9
  • center,代码为10

注解以及在Subplot上绘图

通常情况下,图表上一些重要的部分,比如异常点、突变点等需要进行标识或进行文字注解,这部分内容可以通过text、arrow和annotate函数进行添加。

首先text可以将文字添加到对应的坐标(x,y),还可以加上一些自定义格式:

plt.plot(data)

plt.text(20,20,"text", fontsize = "large", color = "red", family = "monospace", style = "italic", weight = "bold", bbox = {"facecolor": "yellow", "alpha": 0.5, "pad": 10})

plt.xlabel("X Axis")
plt.ylabel("Y Axis")
plt.title("Title")

plt.show()

上面代码中text设置为:

  • 坐标为(20,20),向右上方扩展
  • 字体大小为large
  • 颜色为红色
  • 字体为monospace
  • 字体样式为斜体
  • 字体粗细为粗体
  • 文本框的背景色为黄色
  • 文本框的透明度为0.5
  • 文本框的内边距为10

再看下annotate的用法:

plt.plot(data)

plt.annotate("Text", xy = (20, 20), xytext = (30, 30), fontsize = "large", color = "red", family = "monospace", style = "italic", weight = "bold", bbox = {"facecolor": "yellow", "alpha": 0.5, "pad": 10}, arrowprops = {"facecolor": "red", "alpha": 0.5, "width": 3, "headwidth": 10, "headlength": 10})

plt.xlabel("X Axis")
plt.ylabel("Y Axis")
plt.title("Title")

plt.show()

上面代码中annotate的设置为:

  • 文本为Text
  • 箭头的起点为(20,20)
  • 箭头的终点为(30,30)
  • 字体设置同上
  • 箭头的颜色为红色
  • 箭头的透明度为0.5
  • 箭头的宽度为3
  • 箭头的头部宽度为10
  • 箭头的头部长度为10

而如果要在图表中添加图形,则可以先创建块对象,然后通过add_patch方法添加到图表中:

plt.plot(data)

rect = plt.Rectangle((20, 20), 10, 10, color = "red", alpha = 0.5)
circ = plt.Circle((30, 80), 5, color = "blue", alpha = 0.5)
pgon = plt.Polygon([[40, 40], [50, 50], [45, 60]], color = "green", alpha = 0.5)

plt.gca().add_patch(rect)
plt.gca().add_patch(circ)
plt.gca().add_patch(pgon)

plt.xlabel("X Axis")
plt.ylabel("Y Axis")
plt.title("Title")

plt.show()

"gca"代表"get current axes",plt.gca()用于获取当前的坐标轴对象(Axes)。

上面代码中的gca可能会有些疑问,不过如果使用子画布的形式就容易理解了:

fig = plt.figure()

ax = fig.add_subplot(111)

rect = plt.Rectangle((20, 20), 10, 10, color = "red", alpha = 0.5)
circ = plt.Circle((30, 80), 5, color = "blue", alpha = 0.5)
pgon = plt.Polygon([[40, 40], [50, 50], [45, 60]], color = "green", alpha = 0.5)

ax.plot(data)
ax.add_patch(rect)
ax.add_patch(circ)
ax.add_patch(pgon)

ax.set_xlabel("X Axis")
ax.set_ylabel("Y Axis")
ax.set_title("Title")

将图表保存到文件

利用plt.savefig可以将当前图表保存到文件,该方法其实是相当于调用Figure对象的savefig方法:

fig.savefig('test.png', dpi=400, bbox_inches='tight')

其中两个重要的选项是dpi(控制“每英寸点数”分辨率)和bbox_inches(可以剪除当前图表周围的空白部分),上面的例子中,分辨率为400,并裁剪了图表周围的空白部分。

另外还有其它的选项,比如format(可以指定输出的文件格式),facecolor(可以指定图片的背景色),edgecolor(可以指定图片的边框色)等等。

matplotlib配置

matplotlib自带一些配色方案,以及为生成出版质量的图片而设定的默认配置信息。

并且几乎所有默认行为都能通过一组全局参数进行自定义,从而管理图像大小、subplot边距、配色方案、字体大小、网格类型等。
使用rc方法可以用于进行默认配置设置:

plt.rc('figure', figsize=(10, 10))

上面的代码中,使用rc方法来设置全局的图片大小。

rc的第一个参数是希望自定义的对象,如'figure'、'axes'、'xtick'、'ytick'、'grid'、'legend'等。其后可以跟上一系列的关键字参数。也可以直接写成字典的形式,如:

font_options = {'family' : 'monospace',
                'weight' : 'bold',
                'size'   : '12'}
plt.rc('font', **font_options)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值