11
$\begingroup$

I am trying to show a gradient field behind a plot, and then its density in a separate plot below.

I understand (as in this question) that this must normally be done using the ImagePadding directive. However, that does not quite align the plots in this case:

padding = {{20, 30}, {20, 30}}; 
GraphicsColumn[
  {
   Show[
    DensityPlot[PDF[NormalDistribution[0, 1], Log[x/40]] , 
      {x, 15, 60}, {y, 0, 30}, 
      ColorFunction -> "SunsetColors"], 
    Graphics[{Dashed, Gray, Line[{{40, 0}, {40, 30}}]}], 
    Plot[If[x < 20, 10, If[x < 25, 2 x - 30, 20]], {x, 15, 60}, 
      PlotRange -> {0, 30} , 
      PlotStyle -> {RGBColor[0.5, .7, 0.2], Thickness[0.01]}], 
    ImagePadding -> padding, PlotRangePadding -> None
   ], 
   Plot[PDF[NormalDistribution[0, 1], 5 Log[x/40]] , {x, 15, 60}, 
      PlotStyle -> {RGBColor[1, 0.4, 0], Thickness[0.01]},
      ImagePadding -> padding]
  }
]

Align me

Is there a way to get the abscissa ranges to match?

$\endgroup$
3
  • 1
    $\begingroup$ You also need to set PlotRange explicitly for both plots $\endgroup$
    – Verbeia
    Commented Apr 15, 2012 at 21:20
  • 2
    $\begingroup$ You might also need to explicitly set the AxesOrigin option in the bottom plot. $\endgroup$
    – Guillochon
    Commented Apr 15, 2012 at 21:24
  • 2
    $\begingroup$ To those tempted to close: I believe the issue is slightly different from earlier alignment questions. Please don't close. $\endgroup$ Commented Apr 15, 2012 at 22:14

2 Answers 2

13
$\begingroup$

AbsoluteOptions shows there to be several differences between the output settings of the first and second plots:

Grid[Prepend[Transpose[
     AbsoluteOptions[#, {PlotRangePadding, AspectRatio, 
           Frame}] & /@ {plot1, plot2}], {"first", "second"}], Frame -> All]

settings

It'll look better if you use the same aspect ratio (I used 1/GoldenRatio) and a frame in each picture. I also set PlotRangePadding-> None in the second case.

plots

$\endgroup$
2
  • $\begingroup$ Your method of examining AbsoluteOptions is very generalizable. I think it's great. $\endgroup$
    – Brian B
    Commented Apr 16, 2012 at 2:05
  • $\begingroup$ Thanks. It's probably still a good idea to first scan the output of AbsoluteOptions[plot1] and AbsoluteOptions[plot2] to identify the options you want to compare. $\endgroup$
    – DavidC
    Commented Apr 16, 2012 at 12:21
4
$\begingroup$

Use for example Framed[]:

padding = {{20, 20}, {20, 20}};
GraphicsColumn[{
  Framed[Show[
    DensityPlot[
     PDF[NormalDistribution[0, 1], Log[x/40]], {x, 15, 60}, {y, 0, 
      30}, ColorFunction -> "SunsetColors"],
    Graphics[{Dashed, Gray, Line[{{40, 0}, {40, 30}}]}], 
    Plot[If[x < 20, 10, If[x < 25, 2 x - 30, 20]], {x, 15, 60}, 
     PlotRange -> {0, 30}, 
     PlotStyle -> {RGBColor[0.5, .7, 0.2], Thickness[0.01]}], 
    ImagePadding -> padding, PlotRangePadding -> None], 
   FrameStyle -> Directive[White]],
  Framed[Plot[
    PDF[NormalDistribution[0, 1], 5 Log[x/40]], {x, 15, 60}, 
    PlotStyle -> {RGBColor[1, 0.4, 0], Thickness[0.01]}, 
    ImagePadding -> padding, Frame -> True], 
   FrameStyle -> Directive[White]]}]

enter image description here

$\endgroup$
1
  • $\begingroup$ Nice, sneaky trick! $\endgroup$
    – Brian B
    Commented Apr 16, 2012 at 2:04

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.