2012-02-09 14 views
2

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

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のラベルは、上部と下部のパネルでdifferentylを揃えていることが確認できている次の図を生成します。 misaligned y labels

私は任意の助けをいただければ幸いです - 私は、印刷に行くために私の論文のためにできるだけ早く発行者にフィギュア(明らかなし上記の図を...)を提出しなければならない... おかげ

+0

FrameLabelではなくInsetを使用して問題を解決しました。Insetには回転させる方向が与えられます。私は完全な回答を投稿したいと思っていましたが、私自身の質問に答えるほどの評判はありません。[Inset doc](http://reference.wolfram.com/mathematica/ref/Inset.html)を参照してください。 PlotRangeClipping - > False'を設定して、プロット領域の外に配置されたインセットが切り取られて隠されないようにしてください。 – yoavram

+0

が揺れている場合、他のオプションが利用できない場合は、質問を編集してソリューションを追加できます。私はそれが貴重だと感じています。 –

答えて

2

私はインセットでのFrameLabelを置き換えることによって、問題を解決しました:

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ソリューションと非常に似ていますが、私は、よりよい私の解決策が好き - Solution

は、私は他のソリューションが掲載見た次の生成

。今すぐソリューションを投稿して申し訳ありませんが、私が見つけたときに私のサイトに投稿できませんでした。自分の質問に答える前に8時間待ってください。

+0

これを投稿していただきありがとうございます。あなたの方法がより好きなら、あなた自身の答えを受け入れるべきです。これを行うには、おそらく2日間待たなければならないでしょう。 –

0

をすることができます次のようにラベルyとticklabelsの間にいくつかのスペースを作るために最初のプロットでFrameTicksを使用:」

キーのトリックは、あなたのカスタムラベル(たとえば、ラベル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

+0

あなたは文字通り最初に* 9秒*を投稿しました。:-) –

+0

あなたの方法に関して、私はTicksを変えなければならないという考えは本当に好きではありません。私のことは確かに完璧ではありません。 –

+0

@ Mr.Wizard、私が知っていれば私は9秒待っていたでしょう:)私はあなたの方法が好きで、それに投票しました。しかし、OPはパニックに見えて、MMA SEサイトの後にトラフィックが減少したので、うまくいくものは容認できると思った。 – kglr

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}, [email protected]]; 

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

あなたは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] 
関連する問題