Python数据可视化利器Matplotlib从入门到高级3

Matplotlib的本质是基于对象的,我们从下面这幅图开始介绍Matplotlib的各种重要的对象。

Python数据可视化利器Matplotlib从入门到高级3

Matplotlib 绘图的主要构成部分

这张图当然可以使用Matplotlib代码绘制出来,我将在文章的结尾处放出绘图的源代码,以便大家对照源代码理解绘图中的各种对象。大家也可以自己去官方文档中搜索关键词“Anatomy”下载。当然,这张图的具体绘制方法不是这里的重点。我们关注的是这张绘图中的各个对象——图中用蓝色字体和黑色圆圈标出来的部分。下面为大家一一介绍:

Figure

Figure即图形,指的是整个绘图,大家能看到的所有部分都属于Figure。创建新图形最简单的方法是使用pyplot:

fig = plt.figure()  # 创建一个空图
fig, ax = plt.subplots()  # 创建带有一个 Axes 的图形
fig, axs = plt.subplots(2, 2)  # 创建一个带有 2x2网格 Axes的图形 

如果增加一句 plt.show() (大家别忘了导入模块)就可以显示出这三张图形来。其中第一句代码生成的图片就是一张白板,什么内容都没有;第二句代码生成的是一个带有坐标系的空图;第三句代码则会生成一个呈网格状分布的由四个坐标系组成的空图。下面附上的是第三张图。

Python数据可视化利器Matplotlib从入门到高级3

2 2网格的Axes组成的空绘图

一般情况下,我们使用第二句或第三句在实例化一个Figure对象的同时创建一个Axes。但也可以使用第一句创建一个空的Figure,然后使用类似于下面的代码手动生成Axes(Axes到底是什么?相信你一定会问):

ax = fig.subplots()

Axes

我们在上一段已经提到了Axes,但没有深入解释它。需要特别注意的是这里的Axes并不是Axis的复数形式(吐槽一下使用Axes名称的Matplotlib设计师),而是Figure上一个由两个(x轴、y轴)坐标轴(包括坐标轴在内)围成的可供绘制数据的区域,我们可以将它称为“轴域”。一张图就是一个Figure,但一个Figure可以有一个或多个轴域,就像上面附的图上就有四个轴域。每个Axes都有一个标题(通过 set_title()设置,默认为None)、一个x轴标签(通过set_xlabel()设置)以及一个y轴标签(通过set_xlabel()设置)。

Axes类及其成员函数是使用面向对象接口的主要入口点,Matplotlib在其上定义了大多数绘图方法(例如我们前一篇介绍Matplotlib面向对象的代码风格时用到的 ax.plot()方法)。

注意:如果是3D图的话,那么每个轴域则是由三个坐标系围成的绘图区域构成。

Axis

Axis就是坐标轴。在Matplotlib的2D绘图中,每个Axes都有两个平行的同类型轴(比如上下两个水平的x轴,左右两个垂直的y轴,极坐标等非常规图除外),它们刚好围成一个矩形区域。默认情况下,左边的y轴和下边的x轴都带有数字(其实是个字符串)刻度标签(tick label)和刻度(tick);而上边的x轴和右边的y轴则只有一根光凸凸的线。这根光凸凸的线就是所谓的“Spines”,轴脊线。刻度标签和刻度都有主标签/刻度(Major)和次标签/刻度(Minor)之分,通常主标签/刻度要突出一些。组成Axis的这些刻度(实际上是Line2D对象)和标签(实际上是Text对象)本身也是对象,也可以进行单独的设置。

Artist

直译的话,可以叫作艺术家。Matplotlib把画布(canvas,这是一个底层概念,涉及到它的地方不多)想像成一个舞台,所有在这个舞台上展示自我的都被形象的称作艺术家Artist,比如文本对象Text、2D曲线对象Line2D(图上用蓝色“Line”文字示出的就是两个2D曲线对象)等。Artist的范围非常广泛,甚至包括我们前面提到的三种对象(Figure、Axes、Axis)。后面专门讲一讲它。

现在组成图中还有三个对象没介绍,它们分别是:Legend图例、Grid网格线和Markers点标记。网格线比较简单,不单独说了;点标记的边线和中间区域可以使用不同的颜色;Legend的设置比较丰富,后面争取专门介绍。

小结

Artist对象包括了所有在我们的绘图舞台上展示各种造型的所有对象。Figure就是整个图形,它包括一个或多个Axes对象。Axes对象则包括多个Axis对象,而我们在绘图过程中打交道最多的可能就是Axes对象。在后面的介绍中我们将会了解到Figure、Axes和Axis实际上都是一类容器对象。

Matplotlib绘图中的最主要对象就是这些。那么今天的内容就到这里为止,最后附上文章开头的那个组成图的绘图代码:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import AutoMinorLocator, MultipleLocator, FuncFormatter

np.random.seed(19680801)

X = np.linspace(0.5, 3.5, 100)
Y1 = 3+np.cos(X)
Y2 = 1+np.cos(1+X/0.75)/2
Y3 = np.random.uniform(Y1, Y2, len(X))

fig = plt.figure(figsize=(8, 8))
ax = fig.add_subplot(1, 1, 1, aspect=1)


def minor_tick(x, pos):
    if not x % 1.0:
        return ""
    return "%.2f" % x

ax.xaxis.set_major_locator(MultipleLocator(1.000))
ax.xaxis.set_minor_locator(AutoMinorLocator(4))
ax.yaxis.set_major_locator(MultipleLocator(1.000))
ax.yaxis.set_minor_locator(AutoMinorLocator(4))
ax.xaxis.set_minor_formatter(FuncFormatter(minor_tick))

ax.set_xlim(0, 4)
ax.set_ylim(0, 4)

ax.tick_params(which='major', width=1.0)
ax.tick_params(which='major', length=10)
ax.tick_params(which='minor', width=1.0, labelsize=10)
ax.tick_params(which='minor', length=5, labelsize=10, labelcolor='0.25')

ax.grid(linestyle="--", linewidth=0.5, color='.25', zorder=-10)

ax.plot(X, Y1, c=(0.25, 0.25, 1.00), lw=2, label="Blue signal", zorder=10)
ax.plot(X, Y2, c=(1.00, 0.25, 0.25), lw=2, label="Red signal")
ax.plot(X, Y3, linewidth=0,
        marker='o', markerfacecolor='w', markeredgecolor='k')

ax.set_title("Anatomy of a figure", fontsize=20, verticalalignment='bottom')
ax.set_xlabel("X axis label")
ax.set_ylabel("Y axis label")

ax.legend(loc=1)


def circle(x, y, radius=0.15):
    from matplotlib.patches import Circle
    from matplotlib.patheffects import withStroke
    circle = Circle((x, y), radius, clip_on=False, zorder=10, linewidth=1,
                    edgecolor='black', facecolor=(0, 0, 0, .0125),
                    path_effects=[withStroke(linewidth=5, foreground='w')])
    ax.add_artist(circle)


def text(x, y, text):
    ax.text(x, y, text, backgroundcolor="white",
            ha='center', va='top', weight='bold', color='blue')


# Minor tick
circle(0.50, -0.10)
text(0.50, -0.32, "Minor tick label")

# Major tick
circle(-0.03, 4.00)
text(0.03, 3.80, "Major tick")

# Minor tick
circle(0.00, 3.50)
text(0.00, 3.30, "Minor tick")

# Major tick label
circle(-0.15, 3.00)
text(-0.15, 2.80, "Major tick label")

# X Label
circle(1.80, -0.27)
text(1.80, -0.45, "X axis label")

# Y Label
circle(-0.27, 1.80)
text(-0.27, 1.6, "Y axis label")

# Title
circle(1.60, 4.13)
text(1.60, 3.93, "Title")

# Blue plot
circle(1.75, 2.80)
text(1.75, 2.60, "Line
(line plot)")

# Red plot
circle(1.20, 0.60)
text(1.20, 0.40, "Line
(line plot)")

# Scatter plot
circle(3.20, 1.75)
text(3.20, 1.55, "Markers
(scatter plot)")

# Grid
circle(3.00, 3.00)
text(3.00, 2.80, "Grid")

# Legend
circle(3.70, 3.80)
text(3.70, 3.60, "Legend")

# Axes
circle(0.5, 0.5)
text(0.5, 0.3, "Axes")

# Figure
circle(-0.3, 0.65)
text(-0.3, 0.45, "Figure")

color = 'blue'
ax.annotate('Spines', xy=(4.0, 0.35), xycoords='data',
            xytext=(3.3, 0.5), textcoords='data',
            weight='bold', color=color,
            arrowprops=dict(arrowstyle='->',
                            connectionstyle="arc3",
                            color=color))

ax.annotate('', xy=(3.15, 0.0), xycoords='data',
            xytext=(3.45, 0.45), textcoords='data',
            weight='bold', color=color,
            arrowprops=dict(arrowstyle='->',
                            connectionstyle="arc3",
                            color=color))

ax.text(4.0, -0.4, "Made with http://matplotlib.org",
        fontsize=10, ha="right", color='.5')
plt.show()
展开阅读全文

页面更新:2024-05-04

标签:坐标轴   坐标系   刻度   网格   利器   入门   图形   对象   区域   两个   高级   代码   标签   数据

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top