Introduction
科研可视化是将数据和信息转化为可视化形式的过程,旨在通过图形化展示数据和信息,使得科研工作者能够更好地理解和分析数据,并从中发现新的知识和洞见。科研可视化可以应用于各种领域,如生物学、物理学、计算机科学等,帮助科研工作者更好地理解和解释数据。
科研可视化的目的是通过图形化展示数据和信息,使得科研工作者能够更好地理解和分析数据。科研可视化可以帮助科研工作者:
-
更好地理解数据:科研可视化可以帮助科研工作者更好地理解数据的结构、特征和关系,以及数据中存在的模式和趋势。
-
发现新的知识和洞见:科研可视化可以帮助科研工作者发现数据中存在的新的知识和洞见,以及数据中隐藏的关联性和规律。
-
交流和展示研究成果:科研可视化可以帮助科研工作者更好地向同行和公众展示和交流研究成果,以及向决策者提供决策支持。
博主之前分享的案例
博主之前已经分享了很多可视化的案例,见下:
数据可视化之美 – 以Matlab、Python为工具
python matplotlib 画图(柱状图)总结
数据可视化之美-动态图绘制(以Python为工具)
数据可视化之美+点、线、面组合(以Python为工具)
等等
Axes Grid toolkit 介绍
这次主要分享的是基于Python的,Matplotlib下面的一个工具包,叫Axes Grid toolkit。
先简单介绍下:
Axes Grid toolkit 是 Matplotlib 的一个工具包,用于创建复杂的图形布局,包括具有不同形状和大小的轴、共享坐标轴、使用 colorbar 的图形和具有三个或更多维度的数据的可视化。
下图为可视化的一个结果,咱们具体展开说明怎么绘制这个图
Axes Grid toolkit的使用
创建网格
Grid 类是 Axes Grid toolkit 的基础类,它用于创建基本的网格。要创建一个 Grid 对象,我们需要传入一个包含子图位置和大小的矩形以及网格的行数和列数。下面的示例演示了如何创建一个 2x2 的网格:
from mpl_toolkits.axes_grid1 import Grid
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(4, 4))
# 创建一个 2x2 的网格
grid = Grid(fig, rect=111, nrows_ncols=(2, 2), axes_pad=0.25)
# 在网格中创建一个子图
ax = grid[0]
# 在子图中绘制一些数据
ax.plot([1, 2, 3], [4, 5, 6])
# 显示图像
plt.show()
在上面的示例中,我们创建了一个 2x2 的网格,并在其中的第一个子图中绘制了一些数据。我们还可以使用 Grid 对象的子图列表来访问网格中的子图。
创建图像网格
ImageGrid 类用于创建图像网格,其中每个网格都包含一个图像。要创建 ImageGrid 对象,我们需要传入一个包含子图位置和大小的矩形、网格的行数和列数以及每个网格的位置。下面的示例演示了如何创建一个 3x3 的图像网格并在其中显示一些图像:
from mpl_toolkits.axes_grid1 import ImageGrid
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure(figsize=(4, 4))
# 创建一个 3x3 的图像网格
grid = ImageGrid(fig, 111, nrows_ncols=(3, 3), axes_pad=0.1)
# 在图像网格中显示一些图像
for i in range(9):
grid[i].imshow(np.random.random((10, 10)))
# 显示图像
plt.show()
在上面的示例中,我们创建了一个 3x3 的图像网格,并在其中显示了一些随机图像。我们使用 ImageGrid 对象的子图列表来访问图像网格中的子图。
创建坐标轴网格
AxesGrid 类用于创建坐标轴网格,其中每个网格都包含一个坐标轴。要创建 AxesGrid 对象,我们需要传入一个包含子图位置和大小的矩形、网格的行数和列数以及每个网格的位置。我们还可以指定每个网格的标签模式,以便在每个坐标轴中显示标签。下面的示例演示了如何创建一个 2x2 的坐标轴网格并在其中绘制一些数据:
from mpl_toolkits.axes_grid1 import AxesGrid
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(4, 4))
# 创建一个 2x2 的坐标轴网格
grid = AxesGrid(fig, 111, nrows_ncols=(2, 2), axes_pad=0.1, label_mode="all")
# 在坐标轴网格中绘制一些数据
for ax in grid:
ax.plot([1, 2, 3], [4, 5, 6])
# 显示图像
plt.show()
绘制RGBAxes显示示例图像的三个通道和三个通道合并的颜色
import numpy as np
from matplotlib import cbook
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1.axes_rgb import make_rgb_axes, RGBAxes
def get_rgb():
# 获取一个包含三个通道的示例图像
Z = cbook.get_sample_data("axes_grid/bivariate_normal.npy", np_load=True)
Z[Z < 0] = 0.
Z = Z / Z.max()
R = Z[:13, :13]
G = Z[2:, 2:]
B = Z[:13, 2:]
return R, G, B
def make_cube(r, g, b):
# 将三个通道的图像转换成一个立方体
ny, nx = r.shape
R = np.zeros((ny, nx, 3))
R[:, :, 0] = r
G = np.zeros_like(R)
G[:, :, 1] = g
B = np.zeros_like(R)
B[:, :, 2] = b
RGB = R + G + B
return R, G, B, RGB
def demo_rgb1():
# 创建一个RGBAxes对象,并在其中显示示例图像的三个通道
fig = plt.figure()
ax = RGBAxes(fig, [0.1, 0.1, 0.8, 0.8], pad=0.0)
r, g, b = get_rgb()
ax.imshow_rgb(r, g, b)
def demo_rgb2():
# 创建一个包含三个子图的图像,并在其中显示示例图像的立方体
fig, ax = plt.subplots()
ax_r, ax_g, ax_b = make_rgb_axes(ax, pad=0.02)
r, g, b = get_rgb()
im_r, im_g, im_b, im_rgb = make_cube(r, g, b)
ax.imshow(im_rgb)
ax_r.imshow(im_r)
ax_g.imshow(im_g)
ax_b.imshow(im_b)
for ax in fig.axes:
ax.tick_params(direction='in', color='w')
ax.spines[:].set_color("w")
# 调用两个函数,显示两种不同的RGBAxes用法
demo_rgb1()
demo_rgb2()
plt.show()
这个例子中,我们首先定义了两个函数get_rgb和make_cube,分别用于获取示例图像的三个通道,并将它们转换成一个立方体。然后,我们定义了两个示例函数demo_rgb1和demo_rgb2,分别演示了如何使用RGBAxes显示示例图像的三个通道和立方体。
在demo_rgb1中,我们创建了一个RGBAxes对象,并使用imshow_rgb函数在其中显示了示例图像的三个通道。
在demo_rgb2中,我们首先使用make_rgb_axes函数创建了一个包含三个子图的图像,然后使用make_cube函数将示例图像的三个通道转换成一个立方体。最后,我们使用imshow函数在主子图中显示了立方体的RGB合成图像,并在每个子图中显示了立方体的红色、绿色和蓝色通道。我们还使用循环遍历所有子图,并将它们的刻度线方向设置为内部,并将其边框颜色设置为白色。最后,我们使用plt.show()函数显示了图像。
demo2这个图要高级很多。
Reference
Matplotlib 3.7.1 documentation