matplotlib AxesGrid
今天花了一天的时间帮同学做图,又体验了一遍
matplotlib
的复杂!之所以用AxesGrid,是因为yt的锅,同学(妹子)对yt的评价是,“他们的帮助文档太难读,完全不友好!!” 其实yt在处理Gadget仿真的数据时非常给力,而且作出来的图很好看,可以直接用到论文中。所以这篇博客简单记录一下我的心得,有空会继续增加对matplotlib的理解。
主要分三个部分来说
- AxesGrid的参数及使用方法
- Axes类的参数调整,作出更好看的图
- 遇到segmentation fault时的解决思路
AxesGrid的参数及使用方法
AxesGrid是matplotlib的mapping toolkits的一个类,用于生成网格化的figure,类似于subplot, 但相对于后者处理起来更容易。
AxesGrid的参数主要有rect
,nrows_ncols
,axes_pad
,以及colorbar相关的cbar*
参数,具体的参数定义可以参见它的官方文档,这里我想介绍一下rect
,axes_pad
和cbar*
参数。
- 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的实例化和使用
做图时采用grid[idx].axes
的方式获得axes对象,并进行相应的参数设置。以2x2的网格为例,下图给出了效果图 (图片来自yt的官方文档)
Axes类的参数调整,作出更好看的图
这里的参数调整主要涉及grid[idx].axes
对象的参数调整,包括调整字体、大小以及坐标轴等。下面给出一个简要的调整样例及注释,后面我会针对yt的样例代码中的p._setup_plots()
方法以及它隐藏的坑进行说明。
- 参数设定样例1234grid[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
- Time Series Multipanel of yt
- mpl_toolkits.axes_grid.axes_grid help
- Python 脚本运行时Segmentation fault (core dumped)
Github repo. gastrack
这个项目的github repo. gastrack. 断断续续写了很久,每次有需求了会修改,但版本控制还是没有做得很好。