数据可视化笔记 Task3 - Matplotlib布局

前两次任务对matplotlib绘图有了一定的了解,这次对matplotlib绘图中一个非常常用的概念进行学习,这个概念就是子图(subplot)。

绘制均匀状态下的子图

plt.subplots是常用的子图绘制工具,其可以为Figure创建新的绘图区域。主要参数如下:

plt.subplot(*args, **kwargs)
#   *args: 子图的位置,可以是三个整型(nrows, ncols, index)
#          也可以是三位数,subplot(123)相当于subplot(1,2,3)
#   projection: {None, 'aitoff', 'hammer', 'lambert', 'mollweide', 'polar', 'rectilinear', str}, optional
#               该参数控制坐标系类型,默认为'rectilinear'(直角坐标系)
#   polar: bool类型,默认False,当为True时相当于projection='polar',即设置为极坐标
#   figsize: 指定整个画布的尺寸
#   sharex, sharey: 共享x轴,y轴(包括刻度、限定区间等)
#   label: 返回轴的标签
# 该函数返回axes.SubplotBase或者Axes的其他子类

绘制多个坐标图样例如下:

import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['savefig.facecolor'] = "0.8"
plt.rcParams['figure.figsize'] = 4.5, 4.
plt.rcParams['figure.max_open_warning'] = 50
plt.rcParams['font.sans-serif'] = ['SimHei']   #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False   #用来正常显示负号

fig, axs = plt.subplots(2, 5, figsize=(10, 4), sharex=True, sharey=True)
fig.suptitle('多图样例', size=20)
x = np.linspace(-5,5)
for i in range(2):
    for j in range(5):
        axs[i][j].set_title('图%d-%d'%(i+1,j+1))
        axs[i][j].set_ylim(-1.5,1.5)
        if i==1: axs[i][j].set_xlabel('Axis X')
        if j==0: axs[i][j].set_ylabel('Axis Y')
        y = np.sin(np.random.randint(-3,3)*np.pi*x)  # 随机生成不同的正弦三角函数
        axs[i][j].plot(x, y)
fig.tight_layout()  # 调整子图的相对大小使字符不会重叠

效果如下:

 利用projection参数可以作如下极坐标系下的图形:

N = 150
r = 2 * np.random.rand(N)
theta = 2 * np.pi * np.random.rand(N)
area = 200 * r**2
colors = theta

plt.subplot(projection='polar')
plt.scatter(theta, r, c=colors, s=area, cmap='hsv', alpha=0.75);

利用极坐标绘制“玫瑰图”如下(代码参考:Bar chart on polar axis):

import numpy as np
import matplotlib.pyplot as plt

# Fixing random state for reproducibility
np.random.seed(19680801)

# Compute pie slices
N = 20
theta = np.linspace(0.0, 2 * np.pi, N, endpoint=False)
radii = np.linspace(0.0, 10.0, N, endpoint=False)
width = np.pi / 10
colors = plt.cm.viridis(radii / 10.)

ax = plt.subplot(projection='polar')
ax.bar(theta, radii, width=width, bottom=0.0, color=colors, alpha=0.5)

plt.show()

 

 

绘制非均匀子图

上面一张图中有多个大小相同的子图,因此称其为均匀子图,顾名思义,非均匀子图就是图中的子图大小并不一致,这里使用GridSpec进行绘制。

利用add_gridspec可以指定相对宽度比例width_ratios和相对高度比例参数height_ratios。

fig = plt.figure(figsize=(10, 4))
spec = fig.add_gridspec(nrows=2, ncols=6, width_ratios=[2,2.5,3,1,1.5,2], height_ratios=[1,2])
fig.suptitle('样例3', size=20)
def f(t):
    return np.sin(np.random.randint(-10, 10)*t*np.pi)
x = np.arange(np.random.randint(-10, 0), np.random.randint(0, 10))
# sub1
ax = fig.add_subplot(spec[0, :3])
ax.plot(x, f(x))
# sub2
ax = fig.add_subplot(spec[0, 3:5])
ax.plot(x, f(x))
# sub3
ax = fig.add_subplot(spec[:, 5])
ax.plot(x, f(x))
# sub4
ax = fig.add_subplot(spec[1, 0])
ax.plot(x, f(x))
# sub5
ax = fig.add_subplot(spec[1, 1:5])
ax.plot(x, f(x))
fig.tight_layout()

 子图上的方法

在子图上绘制各种曲线需要使用各种方法,常用直线的画法有axhline、axvline、axline(水平、垂直、任意方向),使用grid可以增加网格,可以使用set_xscale(前面多次使用)设置坐标轴的规度(指对数坐标等)。

fig, ax = plt.subplots(figsize=(4,3))
ax.axhline(0.5,0.2,0.8,color='r')
ax.axvline(0.5,0.2,0.8,color='g')
ax.axline([0.3,0.3],[0.7,0.7],color='y');
ax.grid(True)

参考资料

[1] Datawhale数据可视化开源小组. Fantastic-Matplotlib, 第三回:布局格式定方圆.

[2] Matplotlib API - matplotlib.pyplot.subplot.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值