2

私はMathematicaでダブルパネルの図を作成しています。下部パネルのy軸には負の値があり、これにより、FrameLabelを使用して生成されたその軸のラベルは、正の値を持つ上部パネルのラベルよりも少し左に配置されます。スケールが異なるため、パネルを1つのプロットに結合できません。問題を再現するコードの一部:

pad = 80;
Export["C:\\Users\\user\\Desktop\\stackoverflow.png",
 Column[
  {
   Show[
    Plot[ Sin[x]^2, {x, 0, Pi},
     FrameLabel -> {"", "y"},
     BaseStyle -> {FontSize -> 16, FontWeight -> Bold, 
       FontFamily -> "Calibri"},
     ImagePadding -> {{pad, pad/4}, {pad, pad/4}},
     Frame -> {True, True, True, True}
     ]
    , ImageSize -> 640]
   ,
   Show[
    Plot[ -Sin[x]^2/1000, {x, 0, Pi},
     FrameLabel -> {"x", "y"},
      BaseStyle -> {FontSize -> 16, FontWeight -> Bold, 
       FontFamily -> "Calibri"},
     ImagePadding -> {{pad, pad/4}, {pad, pad/4}},
     Frame -> {True, True, True, True}
     ]
    , ImageSize -> 640]
   }
  ]
 ]

このコードは次の図を生成します。この図では、yラベルが上部パネルと下部パネルで異なって配置されていることがわかります。 yラベルの位置がずれている

助けていただければ幸いです-私の論文を印刷するために、できるだけ早く出版社に図(明らかに上記の図はありません...)を提出する必要があります...ありがとう

4

3 に答える 3

2

FrameLabel を Inset に置き換えることで問題を解決しました。

Column[
 {
  Show[
   Plot[ Sin[x]^2, {x, 0, Pi},
    FrameLabel -> {"", ""},
    Epilog -> {
      Inset["y", ImageScaled[{0.01, 0.55}], {0, 0}, Automatic, {0, 1}]
      },
    BaseStyle -> {FontSize -> 16, FontWeight -> Bold, 
      FontFamily -> "Calibri"},
    ImagePadding -> {{pad, pad/4}, {pad, pad/4}},
    Frame -> {True, True, True, True},
    PlotRangeClipping -> False
    ]
   , ImageSize -> 640]
  ,
  Show[
   Plot[ -Sin[x]^2/1000, {x, 0, Pi},
    FrameLabel -> {"x", ""},
    PlotRangeClipping -> False,
    Epilog -> {
      Inset["y", ImageScaled[{0.01, 0.55}], {0, 0}, Automatic, {0, 1}]
      },
    BaseStyle -> {FontSize -> 16, FontWeight -> Bold, 
      FontFamily -> "Calibri"},
    ImagePadding -> {{pad, pad/4}, {pad, pad/4}},
    Frame -> {True, True, True, True}
    ]
   , ImageSize -> 640]
  }
 ]

これにより、次のものが生成されます。 解決

投稿された他のソリューションを見ました-ありがとうございますが、@ Mr.Wizardソリューションと非常に似ていますが、私のソリューションの方が気に入っています。今すぐ解決策を投稿して申し訳ありませんが、サイトが自分の質問に答える前に8時間待つように求めたので、投稿できませんでした.

于 2012-02-10T10:07:57.680 に答える
1

ここにいくつかのアイデアがあります。で始まります:

pad = 80;
options := 
  Sequence[BaseStyle -> {FontSize -> 16, FontWeight -> Bold, FontFamily -> "Calibri"}, 
   ImagePadding -> {{pad, pad/4}, {pad, pad/4}}, Frame -> True, 
   ImageSize -> 649];

p1 = Plot[Sin[x]^2, {x, 0, Pi}, Evaluate@options];

p2 = Plot[-Sin[x]^2/1000, {x, 0, Pi}, 
   FrameLabel -> Style["x", 25, Bold, FontFamily -> Times], Evaluate@options];

使用できますLabeled

labelIt = 
  Labeled[#, Style[#2, 25, Bold, FontFamily -> Times], Left, RotateLabel -> True] &;

Column[{labelIt[p1, "y"], labelIt[p2, "y"]}]

または、ラベルを別のGridセルに入れます。

{lab1, lab2} =
  Rotate[Style[#, 25, Bold, FontFamily -> Times], Pi/2] & /@ {"y", "y"};

Grid[{{lab1, p1}, {lab2, p2}}, Spacings -> 0]
于 2012-02-09T09:28:16.353 に答える
0

FrameTicks次のように、最初のプロットで使用して、ラベルyと目盛りラベルの間にスペースを空けることができます。

重要なトリックは、カスタム ラベルの 1 つ (ラベル 0.0 など) を十分なパディングでスタイルすることです。

  frmticks1 = {{{{0.0, "         0.0"}, {0.2, "0.2"}, {0.4, 
  "0.4"}, {0.6, "0.6"}, {0.8, "0.8"}, {1.0, "1.0"}}, 
  Automatic}, {Automatic, Automatic}};

FrameTicks->frmticks1次に、オプションを最初のプロットに追加します。

  Column[{Show[
  Plot[Sin[x]^2, {x, 0, Pi}, FrameLabel -> {"", "y"}, 
   BaseStyle -> {FontSize -> 16, FontWeight -> Bold, 
  FontFamily -> "Calibri"}, 
  ImagePadding -> {{pad, pad/4}, {pad, pad/4}}, 
  Frame -> {True, True, True, True}, FrameTicks -> frmticks1], 
  ImageSize -> 640], 
   Show[Plot[-Sin[x]^2/1000, {x, 0, Pi}, FrameLabel -> {"x", "y"}, 
  BaseStyle -> {FontSize -> 16, FontWeight -> Bold, 
  FontFamily -> "Calibri"}, 
  ImagePadding -> {{pad, pad/4}, {pad, pad/4}}, 
  Frame -> {True, True, True, True}], ImageSize -> 640]}]

次の出力が得られます。

ここに画像の説明を入力

于 2012-02-09T09:28:07.103 に答える