今天花了一天的时间帮同学做图,又体验了一遍matplotlib的复杂!之所以用AxesGrid,是因为yt的锅,同学(妹子)对yt的评价是,“他们的帮助文档太难读,完全不友好!!” 其实yt在处理Gadget仿真的数据时非常给力,而且作出来的图很好看,可以直接用到论文中。所以这篇博客简单记录一下我的心得,有空会继续增加对matplotlib的理解。

主要分三个部分来说

  1. AxesGrid的参数及使用方法
  2. Axes类的参数调整,作出更好看的图
  3. 遇到segmentation fault时的解决思路

AxesGrid的参数及使用方法

AxesGrid是matplotlibmapping toolkits的一个类,用于生成网格化的figure,类似于subplot, 但相对于后者处理起来更容易。

AxesGrid的参数主要有rect,nrows_ncols,axes_pad,以及colorbar相关的cbar*参数,具体的参数定义可以参见它的官方文档,这里我想介绍一下rectaxes_padcbar*参数。

  • rect: 定义了AxesGrid在fig中的位置,是一个四维的列表,对应[left,bottom,width,height]
  • axes_pad: 控制相邻两个axes的间隔,单位是inch
  • cbar_location: colorbar 的位置,可以放置在上、下、左和右这四个位置
  • cbar_size: 提供的参数为百分制的字符串,用于设定colorbar的宽度
  • cbar_mode: colorbar的模式,可以为“each”,“single”或”edge”,通常会选择“single”

AxesGrid的实例化和使用

1
2
3
4
5
6
7
8
9
10
11
12
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import AxesGrid
fig = plt.figure()
grid = AxesGrid(fig=fig, rect=(0.075,0.075,0.85,0.85),
nrows_ncols = (2, 2),
axes_pad = 0.05,
label_mode = "L",
share_all = True,
cbar_location="right",
cbar_mode="single",
cbar_size="3%",
cbar_pad="0%")

做图时采用grid[idx].axes的方式获得axes对象,并进行相应的参数设置。以2x2的网格为例,下图给出了效果图 (图片来自yt的官方文档)
yt Time Series Multiplanel

Axes类的参数调整,作出更好看的图

这里的参数调整主要涉及grid[idx].axes对象的参数调整,包括调整字体、大小以及坐标轴等。下面给出一个简要的调整样例及注释,后面我会针对yt的样例代码中的p._setup_plots()方法以及它隐藏的坑进行说明。

  • 参数设定样例
    1
    2
    3
    4
    grid[i].axes.text(x,y,s,fontdict) # 在图中添加文字
    grid[i].scatter(x,y,s=100, c='b', marker='x') # 在图中添加标记
    # 手动设定坐标轴的范围
    grid[i].set_xticks([-0.3,-0.2,-0.1,0.0,0.1,0.2,0.3])

通过set_xticks方法可以避免相邻网格图的坐标轴标记重叠,影响视觉效果,后面我会添加图例。

  • p._setup_plots()方法
    这个方法在yt.visualization.plot_window类定义,主要作用是在指定的axes上做图。每次执行这个方法,就会重新做图。但该方法会导致一个问题,如果我们在做图过程中要添加文字(annotate_text)和标记,那么重新执行p._setup_plot后,这些additional staff会消失。所以后来我采用了直接在AxesGrid的axes对象中利用axes.text进行添加。具体的原因我还没有完全理解,后面争取补上。

遇到segmentation fault问题的解决思路

网上对”python segmentation fault”错误的解答众说纷纭,有的说法是“因为python里的C扩展导致(访问了非法内存区域)”,解决方法是sys.setrecursionlimit(100000),避免内存的越界访问。

但是在代码里加了这行语句以后并没有解决问题,后来发现报错出现在执行fig=plot.figure()语句,师兄采用了最简单粗暴的方法,更新matploblib,解决了问题。所以这里记录一下这个解决思路,还是值得借鉴的,虽然没什么科学含量。。。

References

Github repo. gastrack

这个项目的github repo. gastrack. 断断续续写了很久,每次有需求了会修改,但版本控制还是没有做得很好。