2
$\begingroup$

My questions are:

1) how can I change the compressed scale to fine one like {y = 0.1, 1, 10}, {x = 0.01, 0.1, 1, 10, 100}.

data = Flatten[
         Table[
           {x, y, Sin[3 x] + Cos[3 y]}, 
           {x, .1 Pi, 2 Pi, .2}, {y, .01 Pi, 2 Pi, .2}
         ],
         1
       ];

pdata = ListContourPlot[data, Mesh -> None, PlotRange -> All, InterpolationOrder -> 3];

ticks = FrameTicks /. AbsoluteOptions[pdata, FrameTicks];

logticks = Apply[If[#1 == 0, {#1, , ##3}, {Log[10, #1], ##2}] &, ticks, {2}];

ListContourPlot[{Log[10, #1], Log[10, #2], #3} & @@@ data, 
  Mesh -> None, PlotRange -> All, InterpolationOrder -> 3, 
  ColorFunction -> ColorData[{"LakeColors", "Reverse"}], 
  FrameTicks -> logticks]

2) how can I combine two plots in one figure. The two plots are a ListContourPlot and LogLinearPlot.

This is my figure with Michael E2 code.

I want to plot a curve

LogLinearPlot[1 + 0.5/xx^0.33, {xx, 0.01, 105}, PlotStyle -> Red]

on the figure without any change in figure

$\endgroup$
4
  • 1
    $\begingroup$ Whenever possible, questions should be written with a minimal code example in the post, and avoid links to external files - not just for security reasons but also because those links almost invariably go bad after a while, making the question unclear to future readers. $\endgroup$
    – Jens
    Commented Jul 11, 2015 at 16:34
  • $\begingroup$ Any help!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! $\endgroup$
    – Shaaban
    Commented Jul 11, 2015 at 19:14
  • $\begingroup$ Shabaan, I see that your code comes from this answer: mathematica.stackexchange.com/a/35038/27951. Unfortunately, however, as mentioned in the comments to that answer as well, AbsoluteOptions has been essentially abandoned by WRI and doesn't work properly anymore. You may notice that it fails to extract the ticks, so your ticks variable is a list of empty lists; consequently logticks doesn't make sense either. That solution simply won't work. You could look at the alternative solution proposed in the same post instead. $\endgroup$
    – MarcoB
    Commented Jul 11, 2015 at 21:30
  • $\begingroup$ I need List contour plot with good logarithmic scale! $\endgroup$
    – Shaaban
    Commented Jul 12, 2015 at 1:04

2 Answers 2

7
$\begingroup$

For the first question, you can do this:

ListContourPlot[MapAt[Log, data, {All, ;; 2}], 
 Mesh -> None, PlotRange -> All, InterpolationOrder -> 3, 
 ColorFunction -> ColorData[{"LakeColors", "Reverse"}], 
 FrameTicks -> {{Charting`ScaledTicks[{Log, Exp}], 
    Charting`ScaledFrameTicks[{Log, 
      Exp}]}, {Charting`ScaledTicks[{Log, Exp}], 
    Charting`ScaledFrameTicks[{Log, Exp}]}}]

Mathematica graphics

Notes: (1) I changed Log10 to Log -- it must match the functions in Charting`ScaledFrameTicks, something I overlooked initially. (2) Also, if you have V9+, MapAt[Log, data, {All, ;; 2}], which was pointed out by Mr.Wizard, is more efficient than {Log@#1, Log@#2, #3} & @@@ data and perhaps a little clearer; otherwise, stick to the @@@ form.

For the second question, plots can be combined with Show. Perhaps something like this is what is sought:

Show[
 ListContourPlot[
  MapAt[Log, data, {All, 1}] (* {Log@#1, #2, #3}& @@@ data *),
  Mesh -> None, PlotRange -> All, InterpolationOrder -> 3, 
  ColorFunction -> ColorData[{"LakeColors", "Reverse"}], 
  FrameTicks -> {{Automatic, 
     Automatic}, {Charting`ScaledTicks[{Log, Exp}], 
     Charting`ScaledFrameTicks[{Log, Exp}]}}],
 LogLinearPlot[3 + 2 Sin[x], {x, .1 Pi, 2 Pi}, PlotStyle -> Red]
 ]

Mathematica graphics

$\endgroup$
9
  • 1
    $\begingroup$ Consider using MapAt[Log10, data, {All, ;; 2}] in place of {Log[10, #1], Log[10, #2], #3} & @@@ data $\endgroup$
    – Mr.Wizard
    Commented Jul 12, 2015 at 6:05
  • $\begingroup$ @Mr.Wizard Yep, if I had considered refactoring the OP's code at all, that's probably what I would have done. Thanks. $\endgroup$
    – Michael E2
    Commented Jul 12, 2015 at 6:12
  • 1
    $\begingroup$ This code give the following message MapAt::psl: Position specification {All,1;;2} in MapAt[Log10,{{0.314159,0.0314159,1.80458},{0.314159,0.231416,1.57755},<<47>>,{0.514159,3.43142,0.354367},<<910>>},{All,1;;2}] is not an integer or a list of integers. >> $\endgroup$
    – Shaaban
    Commented Jul 12, 2015 at 9:42
  • $\begingroup$ For the second question: I have LogLinearPlot give to me curve I want to plot it above the contour figure $\endgroup$
    – Shaaban
    Commented Jul 12, 2015 at 9:45
  • $\begingroup$ @Shaaban Ah, you must have V8 or earlier, perhaps? That form of Map was introduced in V9, I believe. -- Re 2nd Q: Is the contour figure a regular linear-linear plot that needs converting to log-linear? It should be able to be converted to log-linear with {Log@#1], #2, #3} & @@@ data and using {Automatic, Automatic} for the second pair of the FrameTicks option. $\endgroup$
    – Michael E2
    Commented Jul 12, 2015 at 13:11
3
$\begingroup$

Although tick locations and values cannot be extracted from pdata using AbsoluteOptions, they can nonetheless be extracted.

tckx = Table[{Log[10, i], i}, {i, 
   Ceiling@Min@Cases[pdata[[1, 1]], {z_, _} -> z, Infinity], 
   Floor@Max@Cases[pdata[[1, 1]], {z_, _} -> z, Infinity]}];    
tcky = Table[{Log[10, i], i}, {i, 
   Ceiling@Min@Cases[pdata[[1, 1]], {_, z_} -> z, Infinity], 
   Floor@Max@Cases[pdata[[1, 1]], {_, z_} -> z, Infinity]}];

and then included in the plot, as desired.

ListContourPlot[{Log[10, #1], Log[10, #2], #3} & @@@ data, 
   Mesh -> None, PlotRange -> All, InterpolationOrder -> 3, 
   ColorFunction -> ColorData[{"LakeColors", "Reverse"}], 
   FrameTicks -> {{tcky, None}, {tckx, None}}]

enter image description here

FYI, pdata[[1, 1]] is the internal list of points from which pdata is constructed. In this particular case, tckx and tcky are the same:

tckx // N
(* {{0., 1.}, {0.30103, 2.}, {0.477121, 3.}, 
    {0.60206, 4.}, {0.69897, 5.}, {0.778151, 6.}} *)

Alternative Approach

Alternatively, do not use pdata at all. Instead, define

tck[min_, max_] := Table[{Log[10, i], i}, {i, Ceiling[10^min], Floor[10^max]}]

in which case

ListContourPlot[{Log[10, #1], Log[10, #2], #3} & @@@ data, 
   Mesh -> None, PlotRange -> All, InterpolationOrder -> 3, 
   ColorFunction -> ColorData[{"LakeColors", "Reverse"}], 
   FrameTicks -> {{tck, None}, {tck, None}}]

produces the same plot as before.

$\endgroup$
3
  • $\begingroup$ Consider using MapAt[Log10, data, {All, ;; 2}] in place of {Log[10, #1], Log[10, #2], #3} & @@@ data $\endgroup$
    – Mr.Wizard
    Commented Jul 12, 2015 at 6:06
  • $\begingroup$ @Mr.Wizard Certainly, your option works well. What are the tradeoffs from your perspective. $\endgroup$
    – bbgodfrey
    Commented Jul 12, 2015 at 6:15
  • $\begingroup$ Mostly just brevity. :-) $\endgroup$
    – Mr.Wizard
    Commented Jul 12, 2015 at 6:50

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.