一文講全如何用MATLAB給科技論文作圖——投稿修圖實錄

實際上論文修圖是很麻煩的一件事情,除去數據本身需要反覆測試,保證完全沒有問題之外,圖片本身也要兼具美觀和分辨率的要求。這裏記錄一下寫科研論文過程中,遇到的作圖要求和解決方法。方便日後論文投稿過來複制粘貼(反正一定沒人看,給自己看就好)

當然論文寫作的作圖可以藉助很多軟件,比如說筆者還用到了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!就醬~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章