實際上論文修圖是很麻煩的一件事情,除去數據本身需要反覆測試,保證完全沒有問題之外,圖片本身也要兼具美觀和分辨率的要求。這裏記錄一下寫科研論文過程中,遇到的作圖要求和解決方法。方便日後論文投稿過來複制粘貼(反正一定沒人看,給自己看就好)
當然論文寫作的作圖可以藉助很多軟件,比如說筆者還用到了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!就醬~