Wolfram Mathematica: метки кадров по оси Y не выровнены

Я создаю двухпанельную фигуру в 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 выровнена по-разному на верхней и нижней панелях. неверные метки y

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


person yoavram    schedule 09.02.2012    source источник
comment
Я решил проблему, используя Inset вместо FrameLabel. Inset можно задать направление, чтобы он вращался. Я хотел опубликовать полный ответ, но у меня недостаточно репутации, чтобы ответить на мой собственный вопрос... см. Inset doc и не забудьте установить PlotRangeClipping -> False, чтобы вставка, расположенная за пределами области построения, не обрезалась и не скрывалась.   -  person yoavram    schedule 09.02.2012
comment
rocky, вы можете отредактировать вопрос, чтобы добавить свое решение, если другой вариант недоступен. Я чувствую, что это было бы ценно.   -  person Mr.Wizard    schedule 09.02.2012


Ответы (3)


Я решил проблему, заменив 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 часов, прежде чем ответить на мой собственный вопрос.

person yoavram    schedule 10.02.2012
comment
Спасибо, что опубликовали это. Если вам больше нравится ваш метод, вы должны принять свой собственный ответ. Вероятно, вам придется подождать два дня, чтобы сделать это. - person Mr.Wizard; 10.02.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]
person Mr.Wizard    schedule 09.02.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]}]

дает следующий результат:

введите здесь описание изображения

person kglr    schedule 09.02.2012
comment
Вы написали первым буквально на девять секунд. :-) - person Mr.Wizard; 09.02.2012
comment
Что касается вашего метода, мне не очень нравится идея менять Ticks. Мой конечно тоже не идеален. - person Mr.Wizard; 09.02.2012
comment
@Mr.Wizard, если бы я знал, я бы подождал 9 секунд :), потому что мне больше нравится ваш метод, и я просто проголосовал за него. Но ОП, похоже, был в панике, и, учитывая снижение трафика здесь после сайта MMA SE, я подумал, что все, что сработает, будет приемлемо. - person kglr; 09.02.2012
comment
Спасибо за голос. Если вы заметили, что ОП победил нас обоих: посмотрите комментарий под вопросом. - person Mr.Wizard; 09.02.2012
comment
@Mr.Wizard, TIL две вещи: как получить точную метку времени для второго сообщения, наведя курсор на x hours/days ago, и что означает TIL (через другое сообщение SE). - person kglr; 09.02.2012