Best explained by example. The code,
p1 = Plot[Sin[x], {x, 0, 10}, PlotLegends -> {"sin(x)"}];
p2 = Plot[Cos[x], {x, 0, 10}, PlotLegends -> {"cos(x)"}, PlotStyle -> Red];
p3 = Show[p1, p2]
Gives me this nice picture:
Now I want to isolate the plots and legends for export, so I can do,
p1[[1]]
p1[[2, 1]]
Which gives me:
But doing this on the combination p3
,
p3[[1]]
p3[[2, 1]]
produces:
where only the legend from the first plot was extracted. Given two plots created separately with individual legends, is there a way to isolate the plot and legends? It seems like I can isolate the plots with p3[[1]][[1]]
, but haven't managed to combine the legends. I know I can create the legend manually separately, but I'm less keen on doing that.
Is there a way I can inspect the object p3
more closely to answer this question for myself? Currently it seems like trial and error by adding [[1]]
indexing everywhere.
Answer
Is there a way I can inspect the object p3 more closely to answer this question for myself?
This is indeed the right question to ask. You can look at the expression structure using InputForm
. This is often overwhelming, so we may need to do something to reduce the amount of information that is shown. One way is Short
or Shallow
.
Shallow[InputForm[p3]]
Shallow[InputForm[p3], 5]
Originally, all graphics were represented with Graphics
expression. Show
could combine only Graphics
expressions. Anything else it could handle it converted to Graphics
first.
Legending works by wrapping with Legended
.
This is how you construct a legended plot manually:
Legended[
Plot[Sin[x], {x, 0, 10}, PlotStyle -> Blue],
LineLegend[{Blue}, {"sin x"}]
]
This is what is Plot
produces automatically as well.
The first element in Legended
will be the return value of Plot
, a Graphics
expression. The second element stays unevaluated as LineLegend[{Blue}, {"sin x"}]
, however, it displays as a legend. Just like Graphics[...]
, it does not evaluate to something, it simply displays in a certain way. The expression structure is not modified.
This is the first bit necessary to understand what is happening.
The second bit is that Show
is now extended to handle Legended
expressions. It does so by combining all the contained Graphics
normally and placing them into an innermost Legended
. However, the legend expressions (such as LineLegend
) are not combined. Instead they are placed in a nested Legended
structure which looks like
Legended[
Legended[
combinedGraphics,
legend1
],
legend2
]
Then it is the formatting of Legended
that handles displaying this in a proper way.
Comments
Post a Comment