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)
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!