实际上论文修图是很麻烦的一件事情,除去数据本身需要反复测试,保证完全没有问题之外,图片本身也要兼具美观和分辨率的要求。这里记录一下写科研论文过程中,遇到的作图要求和解决方法。方便日后论文投稿过来复制粘贴(反正一定没人看,给自己看就好)
当然论文写作的作图可以借助很多软件,比如说笔者还用到了gnuplot和tecplot,但是那个并不熟悉,菜鸡如我还是以matlab为主。
提高图片分辨率
首先是分辨率要求,不同的地方要求不一样,不过基本上都在2000*2000上下。而Matlab默认的保存分辨率是不达标的。需要自己选择保存为更高的分辨率。方法为网上比较容易检索到的,方法为:
当前图片->文件->导出设置->渲染->分辨率(dpi):修改自动为600->导出
通常这样分辨率就满足要求了,如果你觉得还不够,还可以把600手工输入到更高。但是这种方式有一个缺陷,就是和你保存图片时图片本身的大小有关。你把图片的窗口放大,再保存,就能得到更高的分辨率,这个不是特别稳定。
基础作图
直接上代码和注释,调线型这类问题太基础了随便百度就能找到,或者你可以直接使用help找到,这里不多说:
figure(1);
plot(steps,log10(resid_p),'k-',...
steps,log10(resid_c),'b--',...
'LineWidth',1.5); %设置线宽,contour这类建议还是用其他作图软件更好看
legend('Couette flow','Cavity flow'); %图例
xlabel('iteration steps'); %x轴
ylabel('log_{10}(residual)'); %y轴
axis([0 8000 -12 4]); %xy的范围
%title('resid hitstory'); %图片标题,因为通常文献里面会带说明,这里注释不需要
设置作图细节
需要设置的有字体,坐标轴刻度间隔,子刻度等等。这里的设置方法分新旧版matlab之分,旧版使用set
,比如说:
set(gca,'xtick',0:2000:8000); %x方向刻度
set(gca,'xminortick','on'); %打开x方向的子刻度
set(gca,'ytick',-12:4:4); %y方向的刻度
set(gca,'FontSize',16); %字体
如果这还不够用,还可以在作图之后做更多的微调,这里是Matlab2014a的打开方式:
当前图片->编辑->轴属性->刻度or更多属性
但是旧版这里是无法调整分刻度具体有几个,我这里的分刻度就特别多,但是没法调整。
第二种参数的设置方式需要新版的软件,笔者这里使用的是Matlab2018b。新版的软件也可以向下兼容使用set,但是这里的参数设置也可以变成:
ax = gca;
ax.XLim = [0,8000]; %设置x,y上下限
ax.YLim = [-12,4];
ax.XTick = [0:2000:8000]; %x,y方向刻度
ax.YTick = [-12:4:4];
ax.XAxis.MinorTickValues = [0:1000:8000]; %设置x,y方向分刻度
ax.YAxis.MinorTickValues = [-12:2:4];
ax.XAxis.MinorTick = 'on';
ax.YAxis.MinorTick = 'on';
其中gca是一个结构体,网上把这个东西叫做图像句柄。另外,这里还有一个网上四处在抄的函数(多少年过去了,你们敢不敢写点新东西),我也挂在这里了,本质和我这里的是一样的:
function dxyMINOR(nx,ny)
%nx指定x轴主刻度间分开小刻度的份数
%ny指定y轴主刻度间分开小刻度的份数
ax = gca;
%XY limit value
xlim = ax.XLim;
ylim = ax.YLim;
%XY tick value
xtick = ax.XTick;
ytick = ax.YTick;
%XY dtick
dxtick = (xtick(2) - xtick(1));
dytick = (ytick(2) - ytick(1));
%XY minortick interval
dmx = dxtick/nx;
dmy = dytick/ny;
%XY minortick value
ax.XAxis.MinorTick = 'on';
ax.XAxis.MinorTickValues = [xtick(1):dmx:xtick(end)];
ax.YAxis.MinorTick = 'on';
ax.YAxis.MinorTickValues = [ytick(1):dmy:ytick(end)];
% first element is for 2d fig ticklength
ax.TickLength = [0.015,0.05];
end
当然新版的Matlab的作图函数强大了很多,实际上这里的gca是一个结构体,但是gca直接是不在内存空间的,我们必须把它赋值给其他的变量。而gca在Matlab2014a里面不支持,必须得新版的matlab。我们再来看看这个结构体里面还有什么:
>> ax = gca;
>> gca
ans =
Axes - 属性:
XLim: [0 8000]
YLim: [-10.5737 5]
XScale: 'linear'
YScale: 'linear'
GridLineStyle: '-'
Position: [0.1300 0.1525 0.7750 0.7725]
Units: 'normalized'
显示 所有属性
ALim: [0 1]
ALimMode: 'auto'
ActivePositionProperty: 'outerposition'
AlphaScale: 'linear'
Alphamap: [1×64 double]
AmbientLightColor: [1 1 1]
BeingDeleted: 'off'
Box: 'on'
BoxStyle: 'back'
BusyAction: 'queue'
ButtonDownFcn: ''
CLim: [0 1]
CLimMode: 'auto'
CameraPosition: [1×3 double]
CameraPositionMode: 'auto'
CameraTarget: [4000 -2.786848066789656e+00 0]
CameraTargetMode: 'auto'
CameraUpVector: [0 1 0]
CameraUpVectorMode: 'auto'
CameraViewAngle: 6.608610360311923e+00
CameraViewAngleMode: 'auto'
Children: [2×1 Line]
Clipping: 'on'
ClippingStyle: '3dbox'
Color: [1 1 1]
ColorOrder: [7×3 double]
ColorOrderIndex: 1
ColorScale: 'linear'
Colormap: [64×3 double]
CreateFcn: ''
CurrentPoint: [2×3 double]
DataAspectRatio: [4000 7.786848066789656e+00 1]
DataAspectRatioMode: 'auto'
DeleteFcn: ''
FontAngle: 'normal'
FontName: 'Helvetica'
FontSize: 16
FontSizeMode: 'manual'
FontSmoothing: 'on'
FontUnits: 'points'
FontWeight: 'normal'
GridAlpha: 1.500000000000000e-01
GridAlphaMode: 'auto'
GridColor: [1×3 double]
GridColorMode: 'auto'
GridLineStyle: '-'
HandleVisibility: 'on'
HitTest: 'on'
Interruptible: 'on'
LabelFontSizeMultiplier: 1.100000000000000e+00
Layer: 'bottom'
Legend: [1×1 Legend]
LineStyleOrder: '-'
LineStyleOrderIndex: 1
LineWidth: 5.000000000000000e-01
MinorGridAlpha: 2.500000000000000e-01
MinorGridAlphaMode: 'auto'
MinorGridColor: [1×3 double]
MinorGridColorMode: 'auto'
MinorGridLineStyle: ':'
NextPlot: 'replace'
OuterPosition: [0 0 1 1]
Parent: [1×1 Figure]
PickableParts: 'visible'
PlotBoxAspectRatio: [1×3 double]
PlotBoxAspectRatioMode: 'auto'
Position: [1×4 double]
Projection: 'orthographic'
Selected: 'off'
SelectionHighlight: 'on'
SortMethod: 'childorder'
Tag: ''
TickDir: 'in'
TickDirMode: 'auto'
TickLabelInterpreter: 'tex'
TickLength: [1.000000000000000e-02 2.500000000000000e-02]
TightInset: [1×4 double]
Title: [1×1 Text]
TitleFontSizeMultiplier: 1.100000000000000e+00
TitleFontWeight: 'normal'
Toolbar: [1×1 AxesToolbar]
Type: 'axes'
UIContextMenu: [0×0 GraphicsPlaceholder]
Units: 'normalized'
UserData: []
View: [0 90]
Visible: 'on'
XAxis: [1×1 NumericRuler]
XAxisLocation: 'bottom'
XColor: [1×3 double]
XColorMode: 'auto'
XDir: 'normal'
XGrid: 'off'
XLabel: [1×1 Text]
XLim: [0 8000]
XLimMode: 'auto'
XMinorGrid: 'off'
XMinorTick: 'on'
XScale: 'linear'
XTick: [0 2000 4000 6000 8000]
XTickLabel: {5×1 cell}
XTickLabelMode: 'auto'
XTickLabelRotation: 0
XTickMode: 'manual'
YAxis: [1×1 NumericRuler]
YAxisLocation: 'left'
YColor: [1×3 double]
YColorMode: 'auto'
YDir: 'normal'
YGrid: 'off'
YLabel: [1×1 Text]
YLim: [-1.057369613357931e+01 5]
YLimMode: 'auto'
YMinorGrid: 'off'
YMinorTick: 'off'
YScale: 'linear'
YTick: [-12 -8 -4 0 4]
YTickLabel: {4×1 cell}
YTickLabelMode: 'auto'
YTickLabelRotation: 0
YTickMode: 'manual'
ZAxis: [1×1 NumericRuler]
ZColor: [1×3 double]
ZColorMode: 'auto'
ZDir: 'normal'
ZGrid: 'off'
ZLabel: [1×1 Text]
ZLim: [-1 1]
ZLimMode: 'auto'
ZMinorGrid: 'off'
ZMinorTick: 'off'
ZScale: 'linear'
ZTick: [-1 0 1]
ZTickLabel: ''
ZTickLabelMode: 'auto'
ZTickLabelRotation: 0
ZTickMode: 'auto'
比如说我们想要调整其中一个参数,直接在其中修改即可,比如说如果我们希望调整字体,我们只需要这样写:
>> ax.FontSize
ans =
16
>> ax.FontSize = 18;
当然如上参数也可以在作图以后通过窗口里的编辑选项调整,不过笔者更加喜欢用代码。
OK!就酱~