Skip to main content

plotting - How to set the ratio between the vertical and horizontal scales of plots?



The documentation says that when AspectRatio->Automatic is specified, Mathematica



determines the ratio of height to width from the actual coordinate values in the plot.



When doing this, Mathematica treats the units in the vertical and horizontal axes as having the same length on the screen.


This is reasonable when the units for both axes are the same (e.g., light-years), but not necessarily so when the units for the two axes are incommensurable (e.g. luminosity vs. seconds of arc), or when the extents in the two dimensions are vastly different (which, with AspectRatio->Automatic, would correspond to an effective aspect ratio close to 0 or infinity).


For such situations I would like a convenient way to set the aspect ratio equal to $r\times A$, where $r$ is a scaling factor of my choosing, and $A$ is the aspect ratio computed per the usual AspectRatio->Automatic rules.


Does Mathematica offer a way to do this?




In case the description above is not sufficiently clear, here's an example.



First I generate some synthetic data.


data = With[{n = 50},
{
{RandomReal[{-35, -30}, n], RandomInteger[{-20100, -20000}, n]}\[Transpose],
{RandomReal[{0, 5}, n], RandomInteger[{0, 80}, n]}\[Transpose]
}
];

In the horizontal direction, for both datasets the range extends over about 5 units, but in the vertical direction, the ranges extend over ca. 100 and 80 units, respectively. This would correspond to $A = 20$ and $A = 16$, respectively (see above for the definition of $A$). But let's suppose I want $r = 0.25$ (i.e. I want the vertical units to have only one-quarter of the screen length of the horizontal ones). If so, then the desired aspect ratios for the two datasets would be 5 and 4, respectively.


In any case, here are the plots that get produced with AspectRatio->Automatic, showing the unscaled aspect ratios ($A = 20$ and $A=16$) just mentioned1:



ListPlot[#, AspectRatio -> Automatic, Frame -> True, 
FrameTicks -> {None, Automatic}] & /@ data

Mathematica graphics


For this example, of course, the calculation of the desired aspect ratio $r A$ was relatively straightforward, since I've concocted datasets having specific values of $A$. In general, however, I don't want to have to figure out $A$ for every plot.




BTW, in case anyone wonders, specifying $r$ as AspectRatio won't do it:


ListPlot[#, AspectRatio -> 0.25, Frame -> True,
FrameTicks -> {None, Automatic}] & /@ data


Mathematica graphics




1 I show two plots in this example because the main motivation for wanting to control the relative sizes of axis units is to make different plots readily comparable, even when they are not plotted as part of, say, a grid. As it happens, I find the plots shown above unsatisfactory not only because they don't have the desired aspect ratios, but also because their relative sizes are not directly comparable (for this the two plots should have same width, and the one on the right should be 80% as tall as the one on the left). Of course, this second problem is a separate issue altogether, but I mention it here only FWIW, by way of additional background, and to increase the chance that any answer I get for the thread's question is not one that makes solving this second problem unnecessarily difficult.



Answer



Assuming that the original AspectRatio that you want can be obtained from ListPlot[data]:


Manipulate[
ListPlot[#,
AspectRatio -> r (AspectRatio /. AbsoluteOptions[ListPlot[data]]),
Frame -> True, FrameTicks -> {None, Automatic}] & /@
data, {{r, 1}, 0.1, 10}]


result


Comments

Popular posts from this blog

functions - Get leading series expansion term?

Given a function f[x] , I would like to have a function leadingSeries that returns just the leading term in the series around x=0 . For example: leadingSeries[(1/x + 2)/(4 + 1/x^2 + x)] x and leadingSeries[(1/x + 2 + (1 - 1/x^3)/4)/(4 + x)] -(1/(16 x^3)) Is there such a function in Mathematica? Or maybe one can implement it efficiently? EDIT I finally went with the following implementation, based on Carl Woll 's answer: lds[ex_,x_]:=( (ex/.x->(x+O[x]^2))/.SeriesData[U_,Z_,L_List,Mi_,Ma_,De_]:>SeriesData[U,Z,{L[[1]]},Mi,Mi+1,De]//Quiet//Normal) The advantage is, that this one also properly works with functions whose leading term is a constant: lds[Exp[x],x] 1 Answer Update 1 Updated to eliminate SeriesData and to not return additional terms Perhaps you could use: leadingSeries[expr_, x_] := Normal[expr /. x->(x+O[x]^2) /. a_List :> Take[a, 1]] Then for your examples: leadingSeries[(1/x + 2)/(4 + 1/x^2 + x), x] leadingSeries[Exp[x], x] leadingSeries[(1/x + 2 + (1 - 1/x...

How to thread a list

I have data in format data = {{a1, a2}, {b1, b2}, {c1, c2}, {d1, d2}} Tableform: I want to thread it to : tdata = {{{a1, b1}, {a2, b2}}, {{a1, c1}, {a2, c2}}, {{a1, d1}, {a2, d2}}} Tableform: And I would like to do better then pseudofunction[n_] := Transpose[{data2[[1]], data2[[n]]}]; SetAttributes[pseudofunction, Listable]; Range[2, 4] // pseudofunction Here is my benchmark data, where data3 is normal sample of real data. data3 = Drop[ExcelWorkBook[[Column1 ;; Column4]], None, 1]; data2 = {a #, b #, c #, d #} & /@ Range[1, 10^5]; data = RandomReal[{0, 1}, {10^6, 4}]; Here is my benchmark code kptnw[list_] := Transpose[{Table[First@#, {Length@# - 1}], Rest@#}, {3, 1, 2}] &@list kptnw2[list_] := Transpose[{ConstantArray[First@#, Length@# - 1], Rest@#}, {3, 1, 2}] &@list OleksandrR[list_] := Flatten[Outer[List, List@First[list], Rest[list], 1], {{2}, {1, 4}}] paradox2[list_] := Partition[Riffle[list[[1]], #], 2] & /@ Drop[list, 1] RM[list_] := FoldList[Transpose[{First@li...

front end - keyboard shortcut to invoke Insert new matrix

I frequently need to type in some matrices, and the menu command Insert > Table/Matrix > New... allows matrices with lines drawn between columns and rows, which is very helpful. I would like to make a keyboard shortcut for it, but cannot find the relevant frontend token command (4209405) for it. Since the FullForm[] and InputForm[] of matrices with lines drawn between rows and columns is the same as those without lines, it's hard to do this via 3rd party system-wide text expanders (e.g. autohotkey or atext on mac). How does one assign a keyboard shortcut for the menu item Insert > Table/Matrix > New... , preferably using only mathematica? Thanks! Answer In the MenuSetup.tr (for linux located in the $InstallationDirectory/SystemFiles/FrontEnd/TextResources/X/ directory), I changed the line MenuItem["&New...", "CreateGridBoxDialog"] to read MenuItem["&New...", "CreateGridBoxDialog", MenuKey["m", Modifiers-...