Сопоставьте легенду и размер участка
Пожалуйста, Подумайте:
intense = Reverse[Round[Rationalize /@ N[10^Range[0, 3, 1/3]]]];
values = Range[0, 9/10, 1/10];
intensityLegend = Column[Prepend[MapThread[
Function[{intensity, values},
Row[{Graphics[{(Lighter[Blue, values]),
Rectangle[{0, 0}, {4, 1}], Black,
Text[Style[ToString[intensity], 16, Bold], {2, .5}]}]}]],
{intense, values}], Text[Style["Photons Number", Bold, 15]]]];
IntersectionDp1={{1., 588.377}, {2.15443, 580.306}, {4.64159, 573.466}, {10.,560.664},
{21.5443, 552.031}, {46.4159, 547.57}, {100.,545.051},
{215.443, 543.578}, {464.159, 542.281}, {1000., 541.346}}
FindD1=ListLogLinearPlot[Map[List, IntersectionDp1],
Frame -> True,
AxesOrigin -> {-1, 0},
PlotMarkers ->
With[{markerSize = 0.04}, {Graphics[{Lighter[Blue, #], Disk[]}],
markerSize} & /@Range[9/10, 0, -1/10]], Filling -> Axis,
FillingStyle -> Opacity[0.8],
PlotRange -> {{.5, 1100}, {540, 600}},
ImageSize->400];
Grid[{{intensityLegend, FindD1}, {intensityLegend, FindD1}},
ItemSize -> {50, 20}, Frame -> True]
Как я могу получить размер столбца легенды, чтобы он соответствовал высоте области участка ?
В то время как строка регулирует размер, мне нужно использовать сетку. Вот почему я дублировал в сетке.
2 ответа:
Работа с размерами изображений. (*
intense = Reverse[Round[Rationalize /@ N[10^Range[0, 3, 1/3]]]]; values = Range[0, 9/10, 1/10]; imgSize = 400; (* <- *) Off[Ticks::ticks] IntersectionDp1 = {{1., 588.377}, {2.15443, 580.306}, {4.64159, 573.466}, {10., 560.664}, {21.5443, 552.031}, {46.4159, 547.57}, {100., 545.051}, {215.443, 543.578}, {464.159, 542.281}, {1000., 541.346}} FindD1 = ListLogLinearPlot[Map[List, IntersectionDp1], Frame -> True, AxesOrigin -> {-1, 0}, PlotMarkers -> With[{markerSize = 0.04}, {Graphics[{Lighter[Blue, #], Disk[]}], markerSize} & /@ Range[9/10, 0, -1/10]], Filling -> Axis, FillingStyle -> Opacity[0.8], PlotRange -> {{.5, 1100}, {540, 600}}, ImageSize -> imgSize]; (* <- *) intensityLegend = Rasterize[Column[ Prepend[ Reverse@MapThread[ (* <- *) Function[{intensity, values}, Row[{Graphics[{(Lighter[Blue, values]), Rectangle[{0, 0}, {4, 1}], Black, Text[Style[ToString[intensity], 30, Bold], {2, .5}]}]}]], {intense, values}], Text[Style["Photons Number", Bold, 25]]]], ImageSize -> {Automatic, (* <- *) IntegerPart@ First[imgSize Cases[AbsoluteOptions[FindD1], HoldPattern[AspectRatio -> x_] -> x]]}]; Grid[{{intensityLegend, FindD1}, {intensityLegend, FindD1}}, Frame -> True]
Где я перевернул столбец интенсивности в эстетических целях.
Edit
Если вы явно не укажете опцию ImageSize для сюжета, вы разочарованно обнаружите, что
AbsoluteOptions[Plot, "ImageSize"]
возвращает"Automatic"
!Edit отвечая на комментарий @500 ниже
В выражение:
ImageSize -> {Automatic, (* <- *) IntegerPart@ First[imgSize Cases[AbsoluteOptions[FindD1], HoldPattern[AspectRatio -> x_] -> x]]}];
Действительно является рабочей заменой для чего-то, что должно работать , но не , чтобы получить размер изображения участка:
Итак, то, что делаетImageSize -> {Automatic, Last@AbsoluteOptions[FindD1,"ImageSize"]}
IntegerPart[...]
, - это получение вертикального размера изображения сюжета, умножениеimgSize
наAspectRatio
сюжета.
Чтобы понять, как это работает, запустите код и введите:AbsoluteOptions[FindD1]
И вы увидите варианты сюжета там. Тогда функция Cases[] просто извлекает
На самом деле есть более чистый способ сделать то, что делает Cases []. Это:AspectRatio
вариант.Но есть еще одна ошибка в функции AbsoluteOptions, которая мешает нам использовать ее таким образом.AbsoluteOptions[FindD1,"AspectRatio"]
Как насчет того, чтобы сделать легенду немного меньше?
intensityLegend = Column[Prepend[ MapThread[ Function[{intensity, values}, Row[{Graphics[{(Lighter[Blue, values]), Rectangle[{0, 0}, {4, 1}], Black, Text[Style[ToString[intensity], 12, Bold], {2, .5}]}, ImageSize -> 50]}]], {intense, values}], Text[Style["Photons Number", Bold, 15]]]];