GNU Octave进行科学绘图的一些问题

作为 Matlab 的一个开源替代品,GNU Octave 与其类似又有所不同。尤其在科学绘图方面,开始使用会很不习惯。这里不能不说,没有商业的支持,在专业软件领域,开源软件的质量、易用性和全面的功能难以保证:毕竟其只是对高级用户和有精力且愿意在上面花时间的人提供了一个开放的窗口,让你可以进去看个究竟;普通用户的使用体验则是次要的事情。与 Matlab 相比, GNU Octave 的科学绘图效果可以说是差得太远。不过通过一番测试和调整,自己还是利用Octave得到了较为满意的作图效果,用于发文章、写报告倒是足够了。以下记录了一些使用过程中遇到的问题和解决办法。
64 位 Win7 上无法使用 plot 命令
之前在 64 位 Win7 上直接安装了 Octave 的 Windows binary (MinGW32 version),但是做图命令 plot 一直出错。现在从这里查到是由于 octave-forge 中的 oct2mat package 出了问题。安装的时候将其取消就好了。若已经装好了 Octave ,则可以在 Octave 提示符下执行下面的命令,使 Octave 在启动时不加载 oct2mat package :

pkg rebuild -noauto oct2mat
若还想重新启用 oct2mat ,则执行:

pkg load oct2mat
XP 上图象窗口冻结,无法刷新
在 XP 上运行 Octave ,弹出的 figure 窗口无法刷新,根本看本不到曲线。将其(后台的 gnuplot )强行关闭后,再调用 plot 命令就什么反应也没有了。后来发现,使用 refresh 命令即可以重绘figure窗口,重新获得响应。与清空和重绘 figure 的几个命令如下:

clf 或 clearplot :用于清空当前的 figure 窗口。调用 clf() 其实质为删除当前 figure 窗口中的可见 handles 。若调用 clf("reset") ,则删除所有的 handles 。
cla :清空当前的坐标系。
drawnow :刷新窗口和其子对象,清空事件队列并执行已生成的回调函数。
refresh :刷新 figure 并重绘。

drawnow 与 refresh 的区别为:

Only figures that are modified will be updated. The `refresh' function can also be used to force an update of the current figure, even if it is not modified.
因此, refresh 可以用于刷新已冻结的 figure 窗口,而 drawnow 不行。

Octave 的图形输出终端
默认情况下,Octave 的 plot 命令将图片输出至图形界面,这其实用的就是 gnuplot 的 windows 终端或者 wxt 终端(即 wxWidget 终端,在弹出的窗口上有旋转、放大等按钮,功能更全面)。为了将图片输出至文件,则可以使用 print 命令。若输出为矢量图,则应选择彩色的 epsc2 。若使用黑白的 eps 终端,则无论如何设置线型和线宽都无效,似乎是 eps 终端自身有一套线型和线宽的设置。

figure 中字体与作图区域大小的设置
由 Octave 直接导出的 figure 字体非常小,无法辩识。这是由于 figure 对象默认的绘图区域大小为 8.5x11 英寸,而 axis 对象默认字体大小为 12pt (作图是在 figure 对象中的 axis 对象内进行)。这里,对象的属性可由 get 命令获得,例如:

get(0);                         # 获取屏幕属性
h = figure(1);
get(h);                         # 获取 figure 属性
plot(...);
get(gca);                       # 获取 axis 属性
由此可以得到 figure 的属性 papersize 和 paperunits , axis 的属性 fontsize 。

若不改变绘图区域的大小,将字体放大至 28pt 较为合适。但需注意,若字体设置得过大且 figure 的 x 或 y 轴标题过长时,显示出来的字符会超出纸面。同时,由于改变了默认字体大小,在执行 print 命令导出图片时,还需要使用选项 -F:SIZE ,从而可以保证合适的字符间距,否则坐标轴的 tick label 会与 x 或 y 轴标题重叠。虽然,文档中声称 -F:SIZE 选项用于指定 figure 中所有文本的大小,但事实上它的作用只是给整个图形环境设置一个默认字体大小,相应的字符间距由这个量来控制。通过测试可以发现,若只使用 -F:SIZE 选项而不指定 axis 的字体大小,则输出的字体仍为默认的 12pt 。下例则为输出至 epsc2 终端并将其转换为 png 格式的命令:

print(h, "output.eps", "-depsc2", "-F:28");
system("gswin32c -dNOSAFER -r1200 -dBATCH -sDEVICE=png16m -dNOPAUSE -dEPSCrop -sOutputFile=output.png output.eps");
marker 属性设置
尽管 Octave 中有 markeredgecolor 与 markerfacecolor 选项,但其实际并不支持分别设置这两个选项,这是由于 gnuplot 本身的限制造成的。当线型为 line & marker 时, color 属性同时设置线条与 marker 的颜色。若想要二者的颜色不同,也比较好解决,将线和 marker 分开画就是了。当单独画 marker 时,则将 markeredgecolor 与 markerfacecolor 设为相同的颜色即可。此时亦可以设置 linewidth 属性,其实质为 marker 的边沿宽度。

tick label 的设置
设置 tick 的位置:

set(gca, "xtick", xtick_values);
set(gca, "ytick", ytick_values);
设置 tick label 字符串:

set(gca, "xticklabel", xlabels);
set(gca, "yticklabel", ylabels);
其中, xlabels 与 ylabels 为字符串 cell array 。

 

 

你可能感兴趣的:(技术点滴)