Adjusting bounding box of PlotLegends in TimelinePlot
$begingroup$
I'd like to align the elements of the PlotLegend
in a single horizontal row beneath the TimelinePlot
, as there is plenty of room for that (especially when I adjust the Size
to be large). Instead the internal algorithms pack the PlotLegends
into three rows in this case.
How to fix that?
TimelinePlot[
{
<|{Entity["Person", "LeonardoDaVinci::47w36"] ->
Interval[{"1452", "1521"}]
}|>,
<|{Entity["Person", "CamilleCorot::vx57d"] ->
Interval[{"1796", "1875"}]
}|>,
<|{
"Piet Mondrian" -> Interval[{"1872", "1944"}]
}|>,
<|{"Thomas Gainsborough" -> Interval[{"1727", "1788"}]
}|>,
<|{Entity["Person", "JanDavidszDeHeem::2gt75"] ->
Interval[{"1606", "1684"}]
}|>,
<|{"Pablo Picasso" -> Interval[{"1881", "1973"}]
}|>,
<|{"Hokusai" -> Interval[{"1760", "1849"}]
}|>
}
,
PlotStyle -> {Red, Orange, Darker[Yellow], Green, Blue, Purple,
Black},
PlotLegends ->
Placed[{Text[Style["Italian", 16, Italic, FontFamily -> "Times"]],
Text[Style["French", 16, Italic, FontFamily -> "Times"]],
Text[Style["American", 16, Italic, FontFamily -> "Times"]],
Text[Style["British", 16, Italic, FontFamily -> "Times"]],
Text[Style["Flemish", 16, Italic, FontFamily -> "Times"]],
Text[Style["Spanish", 16, Italic, FontFamily -> "Times"]],
Text[Style["Japanese", 16, Italic, FontFamily -> "Times"]]},
Below],
AspectRatio -> 1/2,
PlotLayout -> "Packed",
Background -> LightGray,
ImageSize -> 600,
AxesOrigin -> Center]
legending
$endgroup$
add a comment |
$begingroup$
I'd like to align the elements of the PlotLegend
in a single horizontal row beneath the TimelinePlot
, as there is plenty of room for that (especially when I adjust the Size
to be large). Instead the internal algorithms pack the PlotLegends
into three rows in this case.
How to fix that?
TimelinePlot[
{
<|{Entity["Person", "LeonardoDaVinci::47w36"] ->
Interval[{"1452", "1521"}]
}|>,
<|{Entity["Person", "CamilleCorot::vx57d"] ->
Interval[{"1796", "1875"}]
}|>,
<|{
"Piet Mondrian" -> Interval[{"1872", "1944"}]
}|>,
<|{"Thomas Gainsborough" -> Interval[{"1727", "1788"}]
}|>,
<|{Entity["Person", "JanDavidszDeHeem::2gt75"] ->
Interval[{"1606", "1684"}]
}|>,
<|{"Pablo Picasso" -> Interval[{"1881", "1973"}]
}|>,
<|{"Hokusai" -> Interval[{"1760", "1849"}]
}|>
}
,
PlotStyle -> {Red, Orange, Darker[Yellow], Green, Blue, Purple,
Black},
PlotLegends ->
Placed[{Text[Style["Italian", 16, Italic, FontFamily -> "Times"]],
Text[Style["French", 16, Italic, FontFamily -> "Times"]],
Text[Style["American", 16, Italic, FontFamily -> "Times"]],
Text[Style["British", 16, Italic, FontFamily -> "Times"]],
Text[Style["Flemish", 16, Italic, FontFamily -> "Times"]],
Text[Style["Spanish", 16, Italic, FontFamily -> "Times"]],
Text[Style["Japanese", 16, Italic, FontFamily -> "Times"]]},
Below],
AspectRatio -> 1/2,
PlotLayout -> "Packed",
Background -> LightGray,
ImageSize -> 600,
AxesOrigin -> Center]
legending
$endgroup$
1
$begingroup$
If the legend is to indicate nationality, then it should be „Dutch“ for de Heem. Also the curator of knowledge in the WL should be told that „Davidsz.“ is an abbreviation for „Davidszoon“ - so there is a period missing.
$endgroup$
– gwr
2 hours ago
add a comment |
$begingroup$
I'd like to align the elements of the PlotLegend
in a single horizontal row beneath the TimelinePlot
, as there is plenty of room for that (especially when I adjust the Size
to be large). Instead the internal algorithms pack the PlotLegends
into three rows in this case.
How to fix that?
TimelinePlot[
{
<|{Entity["Person", "LeonardoDaVinci::47w36"] ->
Interval[{"1452", "1521"}]
}|>,
<|{Entity["Person", "CamilleCorot::vx57d"] ->
Interval[{"1796", "1875"}]
}|>,
<|{
"Piet Mondrian" -> Interval[{"1872", "1944"}]
}|>,
<|{"Thomas Gainsborough" -> Interval[{"1727", "1788"}]
}|>,
<|{Entity["Person", "JanDavidszDeHeem::2gt75"] ->
Interval[{"1606", "1684"}]
}|>,
<|{"Pablo Picasso" -> Interval[{"1881", "1973"}]
}|>,
<|{"Hokusai" -> Interval[{"1760", "1849"}]
}|>
}
,
PlotStyle -> {Red, Orange, Darker[Yellow], Green, Blue, Purple,
Black},
PlotLegends ->
Placed[{Text[Style["Italian", 16, Italic, FontFamily -> "Times"]],
Text[Style["French", 16, Italic, FontFamily -> "Times"]],
Text[Style["American", 16, Italic, FontFamily -> "Times"]],
Text[Style["British", 16, Italic, FontFamily -> "Times"]],
Text[Style["Flemish", 16, Italic, FontFamily -> "Times"]],
Text[Style["Spanish", 16, Italic, FontFamily -> "Times"]],
Text[Style["Japanese", 16, Italic, FontFamily -> "Times"]]},
Below],
AspectRatio -> 1/2,
PlotLayout -> "Packed",
Background -> LightGray,
ImageSize -> 600,
AxesOrigin -> Center]
legending
$endgroup$
I'd like to align the elements of the PlotLegend
in a single horizontal row beneath the TimelinePlot
, as there is plenty of room for that (especially when I adjust the Size
to be large). Instead the internal algorithms pack the PlotLegends
into three rows in this case.
How to fix that?
TimelinePlot[
{
<|{Entity["Person", "LeonardoDaVinci::47w36"] ->
Interval[{"1452", "1521"}]
}|>,
<|{Entity["Person", "CamilleCorot::vx57d"] ->
Interval[{"1796", "1875"}]
}|>,
<|{
"Piet Mondrian" -> Interval[{"1872", "1944"}]
}|>,
<|{"Thomas Gainsborough" -> Interval[{"1727", "1788"}]
}|>,
<|{Entity["Person", "JanDavidszDeHeem::2gt75"] ->
Interval[{"1606", "1684"}]
}|>,
<|{"Pablo Picasso" -> Interval[{"1881", "1973"}]
}|>,
<|{"Hokusai" -> Interval[{"1760", "1849"}]
}|>
}
,
PlotStyle -> {Red, Orange, Darker[Yellow], Green, Blue, Purple,
Black},
PlotLegends ->
Placed[{Text[Style["Italian", 16, Italic, FontFamily -> "Times"]],
Text[Style["French", 16, Italic, FontFamily -> "Times"]],
Text[Style["American", 16, Italic, FontFamily -> "Times"]],
Text[Style["British", 16, Italic, FontFamily -> "Times"]],
Text[Style["Flemish", 16, Italic, FontFamily -> "Times"]],
Text[Style["Spanish", 16, Italic, FontFamily -> "Times"]],
Text[Style["Japanese", 16, Italic, FontFamily -> "Times"]]},
Below],
AspectRatio -> 1/2,
PlotLayout -> "Packed",
Background -> LightGray,
ImageSize -> 600,
AxesOrigin -> Center]
legending
legending
asked 7 hours ago
David G. StorkDavid G. Stork
24.7k22153
24.7k22153
1
$begingroup$
If the legend is to indicate nationality, then it should be „Dutch“ for de Heem. Also the curator of knowledge in the WL should be told that „Davidsz.“ is an abbreviation for „Davidszoon“ - so there is a period missing.
$endgroup$
– gwr
2 hours ago
add a comment |
1
$begingroup$
If the legend is to indicate nationality, then it should be „Dutch“ for de Heem. Also the curator of knowledge in the WL should be told that „Davidsz.“ is an abbreviation for „Davidszoon“ - so there is a period missing.
$endgroup$
– gwr
2 hours ago
1
1
$begingroup$
If the legend is to indicate nationality, then it should be „Dutch“ for de Heem. Also the curator of knowledge in the WL should be told that „Davidsz.“ is an abbreviation for „Davidszoon“ - so there is a period missing.
$endgroup$
– gwr
2 hours ago
$begingroup$
If the legend is to indicate nationality, then it should be „Dutch“ for de Heem. Also the curator of knowledge in the WL should be told that „Davidsz.“ is an abbreviation for „Davidszoon“ - so there is a period missing.
$endgroup$
– gwr
2 hours ago
add a comment |
3 Answers
3
active
oldest
votes
$begingroup$
You can do this by Legended
ing the plot itself and then using LegendLayout
:
tlp = TimelinePlot[{<|{Entity["Person", "LeonardoDaVinci::47w36"] ->
Interval[{"1452", "1521"}]}|>, <|{Entity["Person",
"CamilleCorot::vx57d"] ->
Interval[{"1796", "1875"}]}|>, <|{"Piet Mondrian" ->
Interval[{"1872", "1944"}]}|>, <|{"Thomas Gainsborough" ->
Interval[{"1727", "1788"}]}|>, <|{Entity["Person",
"JanDavidszDeHeem::2gt75"] ->
Interval[{"1606", "1684"}]}|>, <|{"Pablo Picasso" ->
Interval[{"1881", "1973"}]}|>, <|{"Hokusai" ->
Interval[{"1760", "1849"}]}|>},
PlotStyle -> {Red, Orange, Darker[Yellow], Green, Blue, Purple,
Black}, AspectRatio -> 1/2, PlotLayout -> "Packed",
Background -> LightGray, ImageSize -> 600, AxesOrigin -> Center]
Now we add our legend. Note the LegendLayout
function:
Legended[tlp,
Placed[
LineLegend[{Red, Orange, Darker[Yellow], Green, Blue, Purple, Black},
(Style[#, 16, Italic, FontFamily -> "Times"] &) /@ {"Italian",
"French", "American", "British", "Flemish", "Spanish",
"Japanese"},
LegendLayout -> (Row[Row[#, Spacer[1]] & /@ #, Spacer[7]] &),
LegendMargins -> 0], Below]]
Resulting in:
I'm sure there's a more elegant way to do this than creating nested Row
s, but I'm afraid I don't have the time to have a look.
$endgroup$
add a comment |
$begingroup$
Per this answer, you can use the option LegendLayout -> {"Row", 1}
.
data = {<|{Entity["Person", "LeonardoDaVinci::47w36"] ->
Interval[{"1452", "1521"}]}|>, <|{Entity["Person",
"CamilleCorot::vx57d"] ->
Interval[{"1796", "1875"}]}|>, <|{"Piet Mondrian" ->
Interval[{"1872", "1944"}]}|>, <|{"Thomas Gainsborough" ->
Interval[{"1727", "1788"}]}|>, <|{Entity["Person",
"JanDavidszDeHeem::2gt75"] ->
Interval[{"1606", "1684"}]}|>, <|{"Pablo Picasso" ->
Interval[{"1881", "1973"}]}|>, <|{"Hokusai" ->
Interval[{"1760", "1849"}]}|>};
labels = {Text[
Style["Italian", 16, Italic, FontFamily -> "Times"]],
Text[Style["French", 16, Italic, FontFamily -> "Times"]],
Text[Style["American", 16, Italic, FontFamily -> "Times"]],
Text[Style["British", 16, Italic, FontFamily -> "Times"]],
Text[Style["Flemish", 16, Italic, FontFamily -> "Times"]],
Text[Style["Spanish", 16, Italic, FontFamily -> "Times"]],
Text[Style["Japanese", 16, Italic, FontFamily -> "Times"]]};
TimelinePlot[data,
PlotStyle -> {Red, Orange, Darker[Yellow], Green, Blue, Purple, Black},
PlotLegends -> Placed[LineLegend[labels, LegendLayout -> {"Row", 1}], Below],
AspectRatio -> 1/2,
PlotLayout -> "Packed",
Background -> LightGray,
ImageSize -> 600,
AxesOrigin -> Center
]
$endgroup$
$begingroup$
Cool (+1). So, they had 6 years to finally document this ... and did not?
$endgroup$
– gwr
2 hours ago
$begingroup$
That appears to be the case.
$endgroup$
– Chip Hurst
2 hours ago
$begingroup$
Aha, this is the real solution! I can't believe this is undocumented. I also have a hard time understanding why they used"Row"
the string rather thanRow
the symbol...
$endgroup$
– Carl Lange
2 hours ago
1
$begingroup$
My guess is the string version maintains consistency among other choices like "ReversedRow", etc. In addition,LegendLayout
allows for an arbitrary functionf
and so parsingRow
in this way would create ambiguity.
$endgroup$
– Chip Hurst
2 hours ago
$begingroup$
Since LineLegend accepts a LabelStyle option, you could simplify things by usingLineLegend[labels, LegendLayout -> {"Row", 1}, LabelStyle -> {16, Italic, FontFamily -> "Times"}]
and dropping all of those Style/Text wrappers in the labels.
$endgroup$
– Carl Woll
5 mins ago
add a comment |
$begingroup$
Just a slightly different take for readability avoiding Slot
, using Riffle
for the Spacers
and constructing the graphics with centralized components (e.g. using With
):
With[
{ data =
{ <|{Entity["Person", "LeonardoDaVinci::47w36"] -> Interval[{"1452", "1521"}]}|>
, <|{Entity["Person", "CamilleCorot::vx57d"] -> Interval[{"1796", "1875"}]}|>
, <|{"Piet Mondrian" -> Interval[{"1872", "1944"}]}|>
, <|{"Thomas Gainsborough" -> Interval[{"1727", "1788"}]}|>
, <|{Entity["Person", "JanDavidszDeHeem::2gt75"] -> Interval[{"1606", "1684"}]}|>
, <|{"Pablo Picasso" -> Interval[{"1881", "1973"}]}|>
, <|{"Hokusai" -> Interval[{"1760", "1849"}]}|>
}
, colors = { Red, Orange, Darker[Yellow], Green, Blue, Purple, Black }
, styleFunc = Function[ text,
Style[ text, 16, Italic, FontFamily -> "Times"]
]
, labels = { "Italian", "French", "American", "British", "Flemish", "Spanish", "Japanese" }
, layoutFunc = Function[ pairs, (* pairs = { {col1, lbl1}, ... } *)
pairs // RightComposition[
Flatten
, Curry[Riffle][{Spacer[2] (* after color *), Spacer[10] (* between labels *) }]
, Row
]
]
}
,
TimelinePlot[ data
, PlotStyle -> colors
, AxesOrigin -> Center
, AspectRatio -> 1/2
, PlotLegends -> Curry[Placed][Bottom] @ LineLegend[
colors,
styleFunc /@ labels
, LegendLayout -> layoutFunc
, LegendMargins -> 0
]
, PlotLayout -> "Packed"
, Background -> LightGray
, ImageSize -> 600
]
]
$endgroup$
$begingroup$
That's really interesting, it didn't occur to me that you could use currying in this way!
$endgroup$
– Carl Lange
2 hours ago
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
return StackExchange.using("mathjaxEditing", function () {
StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["$", "$"], ["\\(","\\)"]]);
});
});
}, "mathjax-editing");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "387"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmathematica.stackexchange.com%2fquestions%2f193622%2fadjusting-bounding-box-of-plotlegends-in-timelineplot%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
$begingroup$
You can do this by Legended
ing the plot itself and then using LegendLayout
:
tlp = TimelinePlot[{<|{Entity["Person", "LeonardoDaVinci::47w36"] ->
Interval[{"1452", "1521"}]}|>, <|{Entity["Person",
"CamilleCorot::vx57d"] ->
Interval[{"1796", "1875"}]}|>, <|{"Piet Mondrian" ->
Interval[{"1872", "1944"}]}|>, <|{"Thomas Gainsborough" ->
Interval[{"1727", "1788"}]}|>, <|{Entity["Person",
"JanDavidszDeHeem::2gt75"] ->
Interval[{"1606", "1684"}]}|>, <|{"Pablo Picasso" ->
Interval[{"1881", "1973"}]}|>, <|{"Hokusai" ->
Interval[{"1760", "1849"}]}|>},
PlotStyle -> {Red, Orange, Darker[Yellow], Green, Blue, Purple,
Black}, AspectRatio -> 1/2, PlotLayout -> "Packed",
Background -> LightGray, ImageSize -> 600, AxesOrigin -> Center]
Now we add our legend. Note the LegendLayout
function:
Legended[tlp,
Placed[
LineLegend[{Red, Orange, Darker[Yellow], Green, Blue, Purple, Black},
(Style[#, 16, Italic, FontFamily -> "Times"] &) /@ {"Italian",
"French", "American", "British", "Flemish", "Spanish",
"Japanese"},
LegendLayout -> (Row[Row[#, Spacer[1]] & /@ #, Spacer[7]] &),
LegendMargins -> 0], Below]]
Resulting in:
I'm sure there's a more elegant way to do this than creating nested Row
s, but I'm afraid I don't have the time to have a look.
$endgroup$
add a comment |
$begingroup$
You can do this by Legended
ing the plot itself and then using LegendLayout
:
tlp = TimelinePlot[{<|{Entity["Person", "LeonardoDaVinci::47w36"] ->
Interval[{"1452", "1521"}]}|>, <|{Entity["Person",
"CamilleCorot::vx57d"] ->
Interval[{"1796", "1875"}]}|>, <|{"Piet Mondrian" ->
Interval[{"1872", "1944"}]}|>, <|{"Thomas Gainsborough" ->
Interval[{"1727", "1788"}]}|>, <|{Entity["Person",
"JanDavidszDeHeem::2gt75"] ->
Interval[{"1606", "1684"}]}|>, <|{"Pablo Picasso" ->
Interval[{"1881", "1973"}]}|>, <|{"Hokusai" ->
Interval[{"1760", "1849"}]}|>},
PlotStyle -> {Red, Orange, Darker[Yellow], Green, Blue, Purple,
Black}, AspectRatio -> 1/2, PlotLayout -> "Packed",
Background -> LightGray, ImageSize -> 600, AxesOrigin -> Center]
Now we add our legend. Note the LegendLayout
function:
Legended[tlp,
Placed[
LineLegend[{Red, Orange, Darker[Yellow], Green, Blue, Purple, Black},
(Style[#, 16, Italic, FontFamily -> "Times"] &) /@ {"Italian",
"French", "American", "British", "Flemish", "Spanish",
"Japanese"},
LegendLayout -> (Row[Row[#, Spacer[1]] & /@ #, Spacer[7]] &),
LegendMargins -> 0], Below]]
Resulting in:
I'm sure there's a more elegant way to do this than creating nested Row
s, but I'm afraid I don't have the time to have a look.
$endgroup$
add a comment |
$begingroup$
You can do this by Legended
ing the plot itself and then using LegendLayout
:
tlp = TimelinePlot[{<|{Entity["Person", "LeonardoDaVinci::47w36"] ->
Interval[{"1452", "1521"}]}|>, <|{Entity["Person",
"CamilleCorot::vx57d"] ->
Interval[{"1796", "1875"}]}|>, <|{"Piet Mondrian" ->
Interval[{"1872", "1944"}]}|>, <|{"Thomas Gainsborough" ->
Interval[{"1727", "1788"}]}|>, <|{Entity["Person",
"JanDavidszDeHeem::2gt75"] ->
Interval[{"1606", "1684"}]}|>, <|{"Pablo Picasso" ->
Interval[{"1881", "1973"}]}|>, <|{"Hokusai" ->
Interval[{"1760", "1849"}]}|>},
PlotStyle -> {Red, Orange, Darker[Yellow], Green, Blue, Purple,
Black}, AspectRatio -> 1/2, PlotLayout -> "Packed",
Background -> LightGray, ImageSize -> 600, AxesOrigin -> Center]
Now we add our legend. Note the LegendLayout
function:
Legended[tlp,
Placed[
LineLegend[{Red, Orange, Darker[Yellow], Green, Blue, Purple, Black},
(Style[#, 16, Italic, FontFamily -> "Times"] &) /@ {"Italian",
"French", "American", "British", "Flemish", "Spanish",
"Japanese"},
LegendLayout -> (Row[Row[#, Spacer[1]] & /@ #, Spacer[7]] &),
LegendMargins -> 0], Below]]
Resulting in:
I'm sure there's a more elegant way to do this than creating nested Row
s, but I'm afraid I don't have the time to have a look.
$endgroup$
You can do this by Legended
ing the plot itself and then using LegendLayout
:
tlp = TimelinePlot[{<|{Entity["Person", "LeonardoDaVinci::47w36"] ->
Interval[{"1452", "1521"}]}|>, <|{Entity["Person",
"CamilleCorot::vx57d"] ->
Interval[{"1796", "1875"}]}|>, <|{"Piet Mondrian" ->
Interval[{"1872", "1944"}]}|>, <|{"Thomas Gainsborough" ->
Interval[{"1727", "1788"}]}|>, <|{Entity["Person",
"JanDavidszDeHeem::2gt75"] ->
Interval[{"1606", "1684"}]}|>, <|{"Pablo Picasso" ->
Interval[{"1881", "1973"}]}|>, <|{"Hokusai" ->
Interval[{"1760", "1849"}]}|>},
PlotStyle -> {Red, Orange, Darker[Yellow], Green, Blue, Purple,
Black}, AspectRatio -> 1/2, PlotLayout -> "Packed",
Background -> LightGray, ImageSize -> 600, AxesOrigin -> Center]
Now we add our legend. Note the LegendLayout
function:
Legended[tlp,
Placed[
LineLegend[{Red, Orange, Darker[Yellow], Green, Blue, Purple, Black},
(Style[#, 16, Italic, FontFamily -> "Times"] &) /@ {"Italian",
"French", "American", "British", "Flemish", "Spanish",
"Japanese"},
LegendLayout -> (Row[Row[#, Spacer[1]] & /@ #, Spacer[7]] &),
LegendMargins -> 0], Below]]
Resulting in:
I'm sure there's a more elegant way to do this than creating nested Row
s, but I'm afraid I don't have the time to have a look.
answered 4 hours ago
Carl LangeCarl Lange
4,93711141
4,93711141
add a comment |
add a comment |
$begingroup$
Per this answer, you can use the option LegendLayout -> {"Row", 1}
.
data = {<|{Entity["Person", "LeonardoDaVinci::47w36"] ->
Interval[{"1452", "1521"}]}|>, <|{Entity["Person",
"CamilleCorot::vx57d"] ->
Interval[{"1796", "1875"}]}|>, <|{"Piet Mondrian" ->
Interval[{"1872", "1944"}]}|>, <|{"Thomas Gainsborough" ->
Interval[{"1727", "1788"}]}|>, <|{Entity["Person",
"JanDavidszDeHeem::2gt75"] ->
Interval[{"1606", "1684"}]}|>, <|{"Pablo Picasso" ->
Interval[{"1881", "1973"}]}|>, <|{"Hokusai" ->
Interval[{"1760", "1849"}]}|>};
labels = {Text[
Style["Italian", 16, Italic, FontFamily -> "Times"]],
Text[Style["French", 16, Italic, FontFamily -> "Times"]],
Text[Style["American", 16, Italic, FontFamily -> "Times"]],
Text[Style["British", 16, Italic, FontFamily -> "Times"]],
Text[Style["Flemish", 16, Italic, FontFamily -> "Times"]],
Text[Style["Spanish", 16, Italic, FontFamily -> "Times"]],
Text[Style["Japanese", 16, Italic, FontFamily -> "Times"]]};
TimelinePlot[data,
PlotStyle -> {Red, Orange, Darker[Yellow], Green, Blue, Purple, Black},
PlotLegends -> Placed[LineLegend[labels, LegendLayout -> {"Row", 1}], Below],
AspectRatio -> 1/2,
PlotLayout -> "Packed",
Background -> LightGray,
ImageSize -> 600,
AxesOrigin -> Center
]
$endgroup$
$begingroup$
Cool (+1). So, they had 6 years to finally document this ... and did not?
$endgroup$
– gwr
2 hours ago
$begingroup$
That appears to be the case.
$endgroup$
– Chip Hurst
2 hours ago
$begingroup$
Aha, this is the real solution! I can't believe this is undocumented. I also have a hard time understanding why they used"Row"
the string rather thanRow
the symbol...
$endgroup$
– Carl Lange
2 hours ago
1
$begingroup$
My guess is the string version maintains consistency among other choices like "ReversedRow", etc. In addition,LegendLayout
allows for an arbitrary functionf
and so parsingRow
in this way would create ambiguity.
$endgroup$
– Chip Hurst
2 hours ago
$begingroup$
Since LineLegend accepts a LabelStyle option, you could simplify things by usingLineLegend[labels, LegendLayout -> {"Row", 1}, LabelStyle -> {16, Italic, FontFamily -> "Times"}]
and dropping all of those Style/Text wrappers in the labels.
$endgroup$
– Carl Woll
5 mins ago
add a comment |
$begingroup$
Per this answer, you can use the option LegendLayout -> {"Row", 1}
.
data = {<|{Entity["Person", "LeonardoDaVinci::47w36"] ->
Interval[{"1452", "1521"}]}|>, <|{Entity["Person",
"CamilleCorot::vx57d"] ->
Interval[{"1796", "1875"}]}|>, <|{"Piet Mondrian" ->
Interval[{"1872", "1944"}]}|>, <|{"Thomas Gainsborough" ->
Interval[{"1727", "1788"}]}|>, <|{Entity["Person",
"JanDavidszDeHeem::2gt75"] ->
Interval[{"1606", "1684"}]}|>, <|{"Pablo Picasso" ->
Interval[{"1881", "1973"}]}|>, <|{"Hokusai" ->
Interval[{"1760", "1849"}]}|>};
labels = {Text[
Style["Italian", 16, Italic, FontFamily -> "Times"]],
Text[Style["French", 16, Italic, FontFamily -> "Times"]],
Text[Style["American", 16, Italic, FontFamily -> "Times"]],
Text[Style["British", 16, Italic, FontFamily -> "Times"]],
Text[Style["Flemish", 16, Italic, FontFamily -> "Times"]],
Text[Style["Spanish", 16, Italic, FontFamily -> "Times"]],
Text[Style["Japanese", 16, Italic, FontFamily -> "Times"]]};
TimelinePlot[data,
PlotStyle -> {Red, Orange, Darker[Yellow], Green, Blue, Purple, Black},
PlotLegends -> Placed[LineLegend[labels, LegendLayout -> {"Row", 1}], Below],
AspectRatio -> 1/2,
PlotLayout -> "Packed",
Background -> LightGray,
ImageSize -> 600,
AxesOrigin -> Center
]
$endgroup$
$begingroup$
Cool (+1). So, they had 6 years to finally document this ... and did not?
$endgroup$
– gwr
2 hours ago
$begingroup$
That appears to be the case.
$endgroup$
– Chip Hurst
2 hours ago
$begingroup$
Aha, this is the real solution! I can't believe this is undocumented. I also have a hard time understanding why they used"Row"
the string rather thanRow
the symbol...
$endgroup$
– Carl Lange
2 hours ago
1
$begingroup$
My guess is the string version maintains consistency among other choices like "ReversedRow", etc. In addition,LegendLayout
allows for an arbitrary functionf
and so parsingRow
in this way would create ambiguity.
$endgroup$
– Chip Hurst
2 hours ago
$begingroup$
Since LineLegend accepts a LabelStyle option, you could simplify things by usingLineLegend[labels, LegendLayout -> {"Row", 1}, LabelStyle -> {16, Italic, FontFamily -> "Times"}]
and dropping all of those Style/Text wrappers in the labels.
$endgroup$
– Carl Woll
5 mins ago
add a comment |
$begingroup$
Per this answer, you can use the option LegendLayout -> {"Row", 1}
.
data = {<|{Entity["Person", "LeonardoDaVinci::47w36"] ->
Interval[{"1452", "1521"}]}|>, <|{Entity["Person",
"CamilleCorot::vx57d"] ->
Interval[{"1796", "1875"}]}|>, <|{"Piet Mondrian" ->
Interval[{"1872", "1944"}]}|>, <|{"Thomas Gainsborough" ->
Interval[{"1727", "1788"}]}|>, <|{Entity["Person",
"JanDavidszDeHeem::2gt75"] ->
Interval[{"1606", "1684"}]}|>, <|{"Pablo Picasso" ->
Interval[{"1881", "1973"}]}|>, <|{"Hokusai" ->
Interval[{"1760", "1849"}]}|>};
labels = {Text[
Style["Italian", 16, Italic, FontFamily -> "Times"]],
Text[Style["French", 16, Italic, FontFamily -> "Times"]],
Text[Style["American", 16, Italic, FontFamily -> "Times"]],
Text[Style["British", 16, Italic, FontFamily -> "Times"]],
Text[Style["Flemish", 16, Italic, FontFamily -> "Times"]],
Text[Style["Spanish", 16, Italic, FontFamily -> "Times"]],
Text[Style["Japanese", 16, Italic, FontFamily -> "Times"]]};
TimelinePlot[data,
PlotStyle -> {Red, Orange, Darker[Yellow], Green, Blue, Purple, Black},
PlotLegends -> Placed[LineLegend[labels, LegendLayout -> {"Row", 1}], Below],
AspectRatio -> 1/2,
PlotLayout -> "Packed",
Background -> LightGray,
ImageSize -> 600,
AxesOrigin -> Center
]
$endgroup$
Per this answer, you can use the option LegendLayout -> {"Row", 1}
.
data = {<|{Entity["Person", "LeonardoDaVinci::47w36"] ->
Interval[{"1452", "1521"}]}|>, <|{Entity["Person",
"CamilleCorot::vx57d"] ->
Interval[{"1796", "1875"}]}|>, <|{"Piet Mondrian" ->
Interval[{"1872", "1944"}]}|>, <|{"Thomas Gainsborough" ->
Interval[{"1727", "1788"}]}|>, <|{Entity["Person",
"JanDavidszDeHeem::2gt75"] ->
Interval[{"1606", "1684"}]}|>, <|{"Pablo Picasso" ->
Interval[{"1881", "1973"}]}|>, <|{"Hokusai" ->
Interval[{"1760", "1849"}]}|>};
labels = {Text[
Style["Italian", 16, Italic, FontFamily -> "Times"]],
Text[Style["French", 16, Italic, FontFamily -> "Times"]],
Text[Style["American", 16, Italic, FontFamily -> "Times"]],
Text[Style["British", 16, Italic, FontFamily -> "Times"]],
Text[Style["Flemish", 16, Italic, FontFamily -> "Times"]],
Text[Style["Spanish", 16, Italic, FontFamily -> "Times"]],
Text[Style["Japanese", 16, Italic, FontFamily -> "Times"]]};
TimelinePlot[data,
PlotStyle -> {Red, Orange, Darker[Yellow], Green, Blue, Purple, Black},
PlotLegends -> Placed[LineLegend[labels, LegendLayout -> {"Row", 1}], Below],
AspectRatio -> 1/2,
PlotLayout -> "Packed",
Background -> LightGray,
ImageSize -> 600,
AxesOrigin -> Center
]
answered 2 hours ago
Chip HurstChip Hurst
22.5k15892
22.5k15892
$begingroup$
Cool (+1). So, they had 6 years to finally document this ... and did not?
$endgroup$
– gwr
2 hours ago
$begingroup$
That appears to be the case.
$endgroup$
– Chip Hurst
2 hours ago
$begingroup$
Aha, this is the real solution! I can't believe this is undocumented. I also have a hard time understanding why they used"Row"
the string rather thanRow
the symbol...
$endgroup$
– Carl Lange
2 hours ago
1
$begingroup$
My guess is the string version maintains consistency among other choices like "ReversedRow", etc. In addition,LegendLayout
allows for an arbitrary functionf
and so parsingRow
in this way would create ambiguity.
$endgroup$
– Chip Hurst
2 hours ago
$begingroup$
Since LineLegend accepts a LabelStyle option, you could simplify things by usingLineLegend[labels, LegendLayout -> {"Row", 1}, LabelStyle -> {16, Italic, FontFamily -> "Times"}]
and dropping all of those Style/Text wrappers in the labels.
$endgroup$
– Carl Woll
5 mins ago
add a comment |
$begingroup$
Cool (+1). So, they had 6 years to finally document this ... and did not?
$endgroup$
– gwr
2 hours ago
$begingroup$
That appears to be the case.
$endgroup$
– Chip Hurst
2 hours ago
$begingroup$
Aha, this is the real solution! I can't believe this is undocumented. I also have a hard time understanding why they used"Row"
the string rather thanRow
the symbol...
$endgroup$
– Carl Lange
2 hours ago
1
$begingroup$
My guess is the string version maintains consistency among other choices like "ReversedRow", etc. In addition,LegendLayout
allows for an arbitrary functionf
and so parsingRow
in this way would create ambiguity.
$endgroup$
– Chip Hurst
2 hours ago
$begingroup$
Since LineLegend accepts a LabelStyle option, you could simplify things by usingLineLegend[labels, LegendLayout -> {"Row", 1}, LabelStyle -> {16, Italic, FontFamily -> "Times"}]
and dropping all of those Style/Text wrappers in the labels.
$endgroup$
– Carl Woll
5 mins ago
$begingroup$
Cool (+1). So, they had 6 years to finally document this ... and did not?
$endgroup$
– gwr
2 hours ago
$begingroup$
Cool (+1). So, they had 6 years to finally document this ... and did not?
$endgroup$
– gwr
2 hours ago
$begingroup$
That appears to be the case.
$endgroup$
– Chip Hurst
2 hours ago
$begingroup$
That appears to be the case.
$endgroup$
– Chip Hurst
2 hours ago
$begingroup$
Aha, this is the real solution! I can't believe this is undocumented. I also have a hard time understanding why they used
"Row"
the string rather than Row
the symbol...$endgroup$
– Carl Lange
2 hours ago
$begingroup$
Aha, this is the real solution! I can't believe this is undocumented. I also have a hard time understanding why they used
"Row"
the string rather than Row
the symbol...$endgroup$
– Carl Lange
2 hours ago
1
1
$begingroup$
My guess is the string version maintains consistency among other choices like "ReversedRow", etc. In addition,
LegendLayout
allows for an arbitrary function f
and so parsing Row
in this way would create ambiguity.$endgroup$
– Chip Hurst
2 hours ago
$begingroup$
My guess is the string version maintains consistency among other choices like "ReversedRow", etc. In addition,
LegendLayout
allows for an arbitrary function f
and so parsing Row
in this way would create ambiguity.$endgroup$
– Chip Hurst
2 hours ago
$begingroup$
Since LineLegend accepts a LabelStyle option, you could simplify things by using
LineLegend[labels, LegendLayout -> {"Row", 1}, LabelStyle -> {16, Italic, FontFamily -> "Times"}]
and dropping all of those Style/Text wrappers in the labels.$endgroup$
– Carl Woll
5 mins ago
$begingroup$
Since LineLegend accepts a LabelStyle option, you could simplify things by using
LineLegend[labels, LegendLayout -> {"Row", 1}, LabelStyle -> {16, Italic, FontFamily -> "Times"}]
and dropping all of those Style/Text wrappers in the labels.$endgroup$
– Carl Woll
5 mins ago
add a comment |
$begingroup$
Just a slightly different take for readability avoiding Slot
, using Riffle
for the Spacers
and constructing the graphics with centralized components (e.g. using With
):
With[
{ data =
{ <|{Entity["Person", "LeonardoDaVinci::47w36"] -> Interval[{"1452", "1521"}]}|>
, <|{Entity["Person", "CamilleCorot::vx57d"] -> Interval[{"1796", "1875"}]}|>
, <|{"Piet Mondrian" -> Interval[{"1872", "1944"}]}|>
, <|{"Thomas Gainsborough" -> Interval[{"1727", "1788"}]}|>
, <|{Entity["Person", "JanDavidszDeHeem::2gt75"] -> Interval[{"1606", "1684"}]}|>
, <|{"Pablo Picasso" -> Interval[{"1881", "1973"}]}|>
, <|{"Hokusai" -> Interval[{"1760", "1849"}]}|>
}
, colors = { Red, Orange, Darker[Yellow], Green, Blue, Purple, Black }
, styleFunc = Function[ text,
Style[ text, 16, Italic, FontFamily -> "Times"]
]
, labels = { "Italian", "French", "American", "British", "Flemish", "Spanish", "Japanese" }
, layoutFunc = Function[ pairs, (* pairs = { {col1, lbl1}, ... } *)
pairs // RightComposition[
Flatten
, Curry[Riffle][{Spacer[2] (* after color *), Spacer[10] (* between labels *) }]
, Row
]
]
}
,
TimelinePlot[ data
, PlotStyle -> colors
, AxesOrigin -> Center
, AspectRatio -> 1/2
, PlotLegends -> Curry[Placed][Bottom] @ LineLegend[
colors,
styleFunc /@ labels
, LegendLayout -> layoutFunc
, LegendMargins -> 0
]
, PlotLayout -> "Packed"
, Background -> LightGray
, ImageSize -> 600
]
]
$endgroup$
$begingroup$
That's really interesting, it didn't occur to me that you could use currying in this way!
$endgroup$
– Carl Lange
2 hours ago
add a comment |
$begingroup$
Just a slightly different take for readability avoiding Slot
, using Riffle
for the Spacers
and constructing the graphics with centralized components (e.g. using With
):
With[
{ data =
{ <|{Entity["Person", "LeonardoDaVinci::47w36"] -> Interval[{"1452", "1521"}]}|>
, <|{Entity["Person", "CamilleCorot::vx57d"] -> Interval[{"1796", "1875"}]}|>
, <|{"Piet Mondrian" -> Interval[{"1872", "1944"}]}|>
, <|{"Thomas Gainsborough" -> Interval[{"1727", "1788"}]}|>
, <|{Entity["Person", "JanDavidszDeHeem::2gt75"] -> Interval[{"1606", "1684"}]}|>
, <|{"Pablo Picasso" -> Interval[{"1881", "1973"}]}|>
, <|{"Hokusai" -> Interval[{"1760", "1849"}]}|>
}
, colors = { Red, Orange, Darker[Yellow], Green, Blue, Purple, Black }
, styleFunc = Function[ text,
Style[ text, 16, Italic, FontFamily -> "Times"]
]
, labels = { "Italian", "French", "American", "British", "Flemish", "Spanish", "Japanese" }
, layoutFunc = Function[ pairs, (* pairs = { {col1, lbl1}, ... } *)
pairs // RightComposition[
Flatten
, Curry[Riffle][{Spacer[2] (* after color *), Spacer[10] (* between labels *) }]
, Row
]
]
}
,
TimelinePlot[ data
, PlotStyle -> colors
, AxesOrigin -> Center
, AspectRatio -> 1/2
, PlotLegends -> Curry[Placed][Bottom] @ LineLegend[
colors,
styleFunc /@ labels
, LegendLayout -> layoutFunc
, LegendMargins -> 0
]
, PlotLayout -> "Packed"
, Background -> LightGray
, ImageSize -> 600
]
]
$endgroup$
$begingroup$
That's really interesting, it didn't occur to me that you could use currying in this way!
$endgroup$
– Carl Lange
2 hours ago
add a comment |
$begingroup$
Just a slightly different take for readability avoiding Slot
, using Riffle
for the Spacers
and constructing the graphics with centralized components (e.g. using With
):
With[
{ data =
{ <|{Entity["Person", "LeonardoDaVinci::47w36"] -> Interval[{"1452", "1521"}]}|>
, <|{Entity["Person", "CamilleCorot::vx57d"] -> Interval[{"1796", "1875"}]}|>
, <|{"Piet Mondrian" -> Interval[{"1872", "1944"}]}|>
, <|{"Thomas Gainsborough" -> Interval[{"1727", "1788"}]}|>
, <|{Entity["Person", "JanDavidszDeHeem::2gt75"] -> Interval[{"1606", "1684"}]}|>
, <|{"Pablo Picasso" -> Interval[{"1881", "1973"}]}|>
, <|{"Hokusai" -> Interval[{"1760", "1849"}]}|>
}
, colors = { Red, Orange, Darker[Yellow], Green, Blue, Purple, Black }
, styleFunc = Function[ text,
Style[ text, 16, Italic, FontFamily -> "Times"]
]
, labels = { "Italian", "French", "American", "British", "Flemish", "Spanish", "Japanese" }
, layoutFunc = Function[ pairs, (* pairs = { {col1, lbl1}, ... } *)
pairs // RightComposition[
Flatten
, Curry[Riffle][{Spacer[2] (* after color *), Spacer[10] (* between labels *) }]
, Row
]
]
}
,
TimelinePlot[ data
, PlotStyle -> colors
, AxesOrigin -> Center
, AspectRatio -> 1/2
, PlotLegends -> Curry[Placed][Bottom] @ LineLegend[
colors,
styleFunc /@ labels
, LegendLayout -> layoutFunc
, LegendMargins -> 0
]
, PlotLayout -> "Packed"
, Background -> LightGray
, ImageSize -> 600
]
]
$endgroup$
Just a slightly different take for readability avoiding Slot
, using Riffle
for the Spacers
and constructing the graphics with centralized components (e.g. using With
):
With[
{ data =
{ <|{Entity["Person", "LeonardoDaVinci::47w36"] -> Interval[{"1452", "1521"}]}|>
, <|{Entity["Person", "CamilleCorot::vx57d"] -> Interval[{"1796", "1875"}]}|>
, <|{"Piet Mondrian" -> Interval[{"1872", "1944"}]}|>
, <|{"Thomas Gainsborough" -> Interval[{"1727", "1788"}]}|>
, <|{Entity["Person", "JanDavidszDeHeem::2gt75"] -> Interval[{"1606", "1684"}]}|>
, <|{"Pablo Picasso" -> Interval[{"1881", "1973"}]}|>
, <|{"Hokusai" -> Interval[{"1760", "1849"}]}|>
}
, colors = { Red, Orange, Darker[Yellow], Green, Blue, Purple, Black }
, styleFunc = Function[ text,
Style[ text, 16, Italic, FontFamily -> "Times"]
]
, labels = { "Italian", "French", "American", "British", "Flemish", "Spanish", "Japanese" }
, layoutFunc = Function[ pairs, (* pairs = { {col1, lbl1}, ... } *)
pairs // RightComposition[
Flatten
, Curry[Riffle][{Spacer[2] (* after color *), Spacer[10] (* between labels *) }]
, Row
]
]
}
,
TimelinePlot[ data
, PlotStyle -> colors
, AxesOrigin -> Center
, AspectRatio -> 1/2
, PlotLegends -> Curry[Placed][Bottom] @ LineLegend[
colors,
styleFunc /@ labels
, LegendLayout -> layoutFunc
, LegendMargins -> 0
]
, PlotLayout -> "Packed"
, Background -> LightGray
, ImageSize -> 600
]
]
answered 3 hours ago
gwrgwr
8,55322861
8,55322861
$begingroup$
That's really interesting, it didn't occur to me that you could use currying in this way!
$endgroup$
– Carl Lange
2 hours ago
add a comment |
$begingroup$
That's really interesting, it didn't occur to me that you could use currying in this way!
$endgroup$
– Carl Lange
2 hours ago
$begingroup$
That's really interesting, it didn't occur to me that you could use currying in this way!
$endgroup$
– Carl Lange
2 hours ago
$begingroup$
That's really interesting, it didn't occur to me that you could use currying in this way!
$endgroup$
– Carl Lange
2 hours ago
add a comment |
Thanks for contributing an answer to Mathematica Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
Use MathJax to format equations. MathJax reference.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmathematica.stackexchange.com%2fquestions%2f193622%2fadjusting-bounding-box-of-plotlegends-in-timelineplot%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
1
$begingroup$
If the legend is to indicate nationality, then it should be „Dutch“ for de Heem. Also the curator of knowledge in the WL should be told that „Davidsz.“ is an abbreviation for „Davidszoon“ - so there is a period missing.
$endgroup$
– gwr
2 hours ago