Wolfram Mathematica: метки рамок оси Y не выровнены - PullRequest
2 голосов
/ 09 февраля 2012

Я делаю фигурку с двумя панелями в Mathematica. Нижняя панель имеет отрицательные значения на оси Y, и это приводит к тому, что метка на этой оси, созданная с помощью FrameLabel, выравнивается немного левее, чем метка на верхней панели, которая имеет положительные значения. Я не могу присоединить панели к одному графику, потому что масштабы разные. Кусок кода, который воспроизводит проблему:

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 по-разному выровнена в верхней и нижней панелях. misaligned y labels

Я был бы признателен за любую помощь - я должен отправить рисунок (очевидно, не приведенный выше рисунок ...) издателю как можно скорее, чтобы моя статья вышла в печать ... Спасибо

Ответы [ 3 ]

2 голосов
/ 10 февраля 2012

Я решил проблему, заменив 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]
  }
 ]

Который производит следующее: Solution

Я видел другие опубликованные решения - спасибо, ребята, но мне больше нравится мое решение, хотя оно очень похоже на решение @ Mr.Wizard. Извините за публикацию решения только сейчас, но когда я нашел его, я не смог опубликовать, поскольку сайт попросил меня подождать 8 часов, прежде чем ответить на свой вопрос.

1 голос
/ 09 февраля 2012

Вот пара идей. Начиная с:

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]
0 голосов
/ 09 февраля 2012

Вы можете использовать FrameTicks на первом графике, чтобы сделать пробел между меткой y и метками следующим образом: '

Ключевой трюк заключается в том, чтобы одна из ваших пользовательских меток (скажем, метка 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]}]

дает следующий вывод:

enter image description here

...