簡體   English   中英

修改 position 屬性時 Octave 隱藏部分子圖

[英]Octave hide part of subplot when position property is modified

我正在使用 Octave 制作一組子圖,但第一個標題重疊。

clf;
x = 0:1;
for n = 1:13
  sPlot = subplot (5,3,n, "align");

  #subplotPos = get(sPlot, 'position');
  #subplotPos .*= [1 1.2 1 1];
  #set(sPlot, 'position', subplotPos);

  plot (x, x);
  xlabel (sprintf ("xlabel (2,2,%d)", n));
  ylabel (sprintf ("ylabel (2,2,%d)", n));
  title (sprintf ("title (2,2,%d)", n));
endfor

為了跳過這個問題,我修改了子圖的 position 屬性,取消注釋上面的代碼,但是我隱藏了第一行的一部分。

如何在不重疊地塊或隱藏部分地塊的情況下制作子圖?

技術細節:

  • 八度 5.2.0
  • Debian 10.7
  • 圖形工具包():qt,gnuplot,fltk

重疊 隱藏

subplotPos .*= [1 1.2 1 1];

可能不會做你想讓它做的事。 就標准化單位(這是默認值)而言,相對於圖形的完整尺寸,定位意味着軸 object [ x-origin, y-origin, x-width, y-width ]

因此,您只是指示 octave 將所有生成的軸對象向上移動 20%,但沒有改變它們的大小。 這自然會導致您的頂軸對象落在圖形可用空間的“外部”。

相反,您可能想要的是“縮小”軸,以便它們仍然適合圖形的可用空間,同時為標題等留出一些空間(加上可選的子圖在其分配的空間內重新居中)。 所以大概是這樣的:

  subplotPos =   subplotPos    .* [1 1 1 0.5] ...   % shrink step
               + subplotPos(4) .* [0, 0.25, 0, 0]   % recenter step

附言。 順便說一下,如果你想要這樣的精細定位,我實際上更喜歡創建我自己的軸對象,精確定位在我想要的位置,而不是使用子圖。 我也會先定義圖形大小,這樣你每次都可以得到一個可重現的 plot。 使用帶定位的子圖和帶定位的簡單軸之間的一大區別是,如果需要,軸可能會重疊,而子圖則不會(重疊的 object 會立即刪除它重疊的那個)。

此外,從設計的角度來看,如果您打算在文章或報告等中使用它,我實際上會在這里完全跳過標題,因為它們會破壞子圖網格的流程,而只需使用“標簽”代替,例如“a”、“b”、“c”等,出現在每個 plot 的左下角,然后在圖標題中引用這些。 您可以通過使用繪圖坐標創建文本 object 來實現此目的。 如果您想避免每次都必須找到“正確的坐標”來放置文本,您可以編寫一個 function,它在可預測的位置創建一個新軸 object,然后使用文本 function 在其中心放置一個 label。


PS2。 我可能應該首先提到這一點,但是,另一個明顯的解決方案是簡單地使您的圖形變大(如果您不想每次都手動調整 window 的大小,您可以通過編程方式執行此操作),因為這會增加繪圖之間的空間而無需更改字體大小,因此這可能會自行解決您的“xlabel vs title overlap”問題。

更新:這是一個操作圖形大小的示例,而不是 plot 對象。

% Get monitor resolution from the root graphical object, 'groot'. (typically groot == 0)
  ScreenSize   = get( groot, 'screensize' );
  ScreenWidth  = ScreenSize(3);
  ScreenHeight = ScreenSize(4);


% Define desired figure size, and recenter on screen
  FigureWidth     = 1650;
  FigureHeight    = 1250;
  Figure_X_Origin = floor( (ScreenWidth  - FigureWidth)  / 2 );
  Figure_Y_Origin = floor( (ScreenHeight - FigureHeight) / 2 );

  FigPosition = [ Figure_X_Origin, Figure_Y_Origin, FigureWidth, FigureHeight ];


% Create a figure with the specified position / size.
  Fig = figure();
  set( Fig, 'position', FigPosition );   % or simply Fig = figure( 'position', FigPosition )


% Now same basic code as before; figure is large enough therefore 'resizing' corrections are not necessary.
  clf;
  x = 0:1;
  for n = 1:13
    sPlot = subplot (5,3,n, "align");
    plot (x, x);
    xlabel (sprintf ("xlabel (2,2,%d)", n), 'fontsize', 12);
    ylabel (sprintf ("ylabel (2,2,%d)", n), 'fontsize', 12);
    title  (sprintf ("title (2,2,%d)" , n), 'fontsize', 16);
  endfor

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM