5
$\begingroup$

Is there any way of generating a density plot (or something similar) with one of its axes on a log scale? Essentially I'm trying to combine a LogLinearPlot and a normal Plot on two different variables to create the associated density plot.

If this can't be done directly, what would be the best work-around?

$\endgroup$
  • $\begingroup$ If you add a small self-contained example you will get more/better answers. $\endgroup$ – Ajasja Feb 1 '13 at 13:00
  • 4
    $\begingroup$ I can't think of an easier workaround than: DensityPlot[f[x,y], {x, Xmin, Xmax}, {y, Ymin, Ymax}] to DensityPlot[f[x, E^y],{x, Xmin, Xmax}, {y, Log@Ymin, Log@Ymax}]. Adding ticks along y might take you some time but it shouldn't be hard (I've assumed that's the direction you want to log plot) $\endgroup$ – gpap Feb 1 '13 at 13:13
  • $\begingroup$ I think ScalingFunctions works with DensityPlot... That might help. $\endgroup$ – cormullion Feb 1 '13 at 17:32
  • $\begingroup$ @cormullion Could you give an example? I can only get it working for the function value but not the axis. (Something like DensityPlot[Sin[x] Sin[y], {x, 1, 10}, {y, 1, 10}, ScalingFunctions -> "Log"]) $\endgroup$ – Silvia Feb 1 '13 at 18:50
  • $\begingroup$ @silvia no I can't (:-() but I thought there might be those who were clever enough to make it happen... $\endgroup$ – cormullion Feb 1 '13 at 19:16
3
$\begingroup$

Thanks for the input in the comments; here's what I eventually came up with (including tick placement):

fSpace[min_, max_, steps_, f_: Identity] := 
 InverseFunction[f] /@ 
  Range[f@min, f@max, (f@max - f@min)/(steps - 1)]
GetMajorTicks[min_, max_, count_, f_: Identity] := 
  fSpace[min, max, count, f];
GetMinorTicks[min_, max_, majorCount_, minorCount_, f_: Identity] := 
  Flatten[Table[
    Drop[Drop[
      fSpace[x, 
       x ((f@max - f@min)/(majorCount - 1) // InverseFunction[f]), 
       minorCount + 2], 1], -1], {x, 
     Drop[GetMajorTicks[min, max, majorCount, f], -1]}]];

xMin = 1/4;
xMax = 4;
xMajorTicks = 5;
xMinorTicks = 3;
f = Log;
ContourPlot[
 Sin[2 \[Pi] y] InverseFunction[f]@x, {x, f@xMin, f@xMax}, {y, -1, 1},
  FrameTicks -> {{Automatic, 
    None}, {({f@#, # // N} & /@ 
       GetMajorTicks[xMin, xMax, xMajorTicks, f])~
     Join~({f@#, Null, {0.005, 0}} & /@ 
       GetMinorTicks[xMin, xMax, xMajorTicks, xMinorTicks, f]), 
    None}}]

The plot

If this can be cleaned up or improved in any way, I'd love to hear!

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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